Как MetaMask узнает, что предварительное условие контракта не будет выполнено?

Я работаю со стандартным токеном ERC20, у меня есть функция перевода:

 function transfer(address _to, uint256 _value)  public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[msg.sender]);

        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

У меня есть адрес A с 20 моими токенами ERC20, и я использую web3.js для отправки транзакций в смарт-контракт, развернутый на частном узле Geth. MetaMask перехватывает эти вызовы.

Меня интересует поведение MetaMask в этих двух сценариях:

  1. Отправьте 19 токенов с адреса А на адрес Б, транзакция прошла успешно, теперь у А 1 токен

  2. Попробуйте отправить 21 токен с адреса A на адрес B, метамаска показывает это сообщение:

Уведомление о метамаске

Как будто MetaMask знает, что предварительное условие контракта не будет выполнено:

    require(_value <= balances[msg.sender]);

Мне любопытно узнать, имеет ли MetaMask собственное состояние контракта и может ли он определить, будет ли транзакция неудачной или нет, до вызова контракта или во время вызова контракта.

Ответы (1)

Он проходит транзакцию в режиме только для чтения в рамках процесса оценки газа. Он может видеть, когда транзакция может завершиться неудачно.

Надеюсь, поможет.

Спасибо, а можно где-нибудь об этом прочитать? Мне любопытно, как Metamask выполняет шаг только для чтения
Метамаск этого не делает. Он обращается eth_estimateGasк узлу Ethereum, с которым разговаривает. Это делает почти то же самое, что и eth_call... оно выполняет транзакцию локально для измерения использования газа, а затем просто отбрасывает побочные эффекты.
Я согласен со Стивом по поводу подробной последовательности. Оценка газа работает путем обхода кода. Вы также можете вызывать его в любое время, когда захотите изучить ответы функций. Посмотрите здесь: ethereum.stackexchange.com/questions/765/…
Итак, метамаска вызывает eth_estimateGas, узел Geth вызывает функцию передачи моего контракта, но отбрасывает любые модификации в блокчейне, поэтому eth_estimateGas не влияет на состояние блокчейна. Это имеет смысл. Спасибо, ребята