¿Cómo sabe MetaMask que una condición previa de un contrato fallará?

Estoy trabajando con un token ERC20 estándar, tengo una función de transferencia:

 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;
    }

Tengo una dirección A que tiene 20 de mis tokens ERC20 y estoy usando web3.js para enviar transacciones a un contrato inteligente que se implementa en un nodo privado de Geth. MetaMask está interceptando esas invocaciones.

Tengo curiosidad sobre el comportamiento de MetaMask en estos dos escenarios:

  1. Envíe 19 tokens desde la dirección A a la dirección B, la transacción se realiza correctamente, ahora A tiene 1 token

  2. Intente enviar 21 tokens desde la dirección A a la dirección B, metamask muestra este mensaje:

notificación MetaMask

Es como si MetaMask supiera que la condición previa del contrato fallará:

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

Tengo curiosidad por saber si MetaMask tiene su propio estado del contrato y puede determinar si una transacción fallará o no, antes de invocar el contrato o mientras lo invoca.

Respuestas (1)

Recorre la transacción en modo de solo lectura como parte del proceso de estimación de gas. Puede ver cuándo es probable que la transacción falle.

Espero eso ayude.

Gracias, hay algún lugar donde pueda leer sobre eso? Tengo curiosidad acerca de cómo Metamask realiza el paso de solo lectura
MetaMask no lo hace. Llama eth_estimateGasal nodo Ethereum con el que está hablando. Esto hace lo mismo que eth_call... ejecuta la transacción localmente para medir el uso de gas y luego descarta los efectos secundarios.
Estoy de acuerdo con Steve sobre la secuencia detallada. La estimación de gas funciona pasando por encima del código. También puede invocarlo en cualquier momento que desee para explorar las respuestas de funciones. Echa un vistazo aquí: ethereum.stackexchange.com/questions/765/…
Ok, metamask llama a eth_estimateGas, el nodo Geth invoca la función de transferencia de mi contrato pero descarta cualquier modificación en la cadena de bloques, por lo que eth_estimateGas no afecta el estado de la cadena de bloques. Eso tiene sentido. Gracias chicos