Я работаю со стандартным токеном 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 в этих двух сценариях:
Отправьте 19 токенов с адреса А на адрес Б, транзакция прошла успешно, теперь у А 1 токен
Попробуйте отправить 21 токен с адреса A на адрес B, метамаска показывает это сообщение:
Как будто MetaMask знает, что предварительное условие контракта не будет выполнено:
require(_value <= balances[msg.sender]);
Мне любопытно узнать, имеет ли MetaMask собственное состояние контракта и может ли он определить, будет ли транзакция неудачной или нет, до вызова контракта или во время вызова контракта.
Он проходит транзакцию в режиме только для чтения в рамках процесса оценки газа. Он может видеть, когда транзакция может завершиться неудачно.
Надеюсь, поможет.
Маркос Мартинес
пользователь19510
eth_estimateGas
к узлу Ethereum, с которым разговаривает. Это делает почти то же самое, что иeth_call
... оно выполняет транзакцию локально для измерения использования газа, а затем просто отбрасывает побочные эффекты.Роб Хитченс
Маркос Мартинес