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:
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
Intente enviar 21 tokens desde la dirección A a la dirección B, metamask muestra este mensaje:
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.
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.
marcos martínez
usuario19510
eth_estimateGas
al nodo Ethereum con el que está hablando. Esto hace lo mismo queeth_call
... ejecuta la transacción localmente para medir el uso de gas y luego descarta los efectos secundarios.Rob Hitchens
marcos martínez