eth.estimateGas не работает с адресом контракта в качестве второго параметра

Новичок. Есть метод go-ethereum:

eth.estimateGas({from:'firstAccount', to:'secondAccount'})

это работает хорошо, но тот же метод с адресом контракта, например:

eth.estimateGas({from:'firstAccount', to:'contractAddr'})

выходит из строя с ошибкой

количество необходимого газа превышает допустимое или всегда не выполняется транзакция

Я просмотрел исходный код go-ethereum, и в нем есть строка, содержащая предложение использовать адрес контракта в качестве второго параметра: https://github.com/ethereum/go-ethereum/blob/master/accounts/abi/bind/base.go#L221

Возникает вопрос: можно ли использовать eth.estimateGas с адресом контракта в качестве второго параметра и как избежать вышеуказанной ошибки? Спасибо.


person VadimFilin    schedule 08.04.2018    source источник
comment
Забыл упомянуть: это частная сеть, у меня достаточно эфира, и контракт развернут и добыт.   -  person VadimFilin    schedule 08.04.2018
comment
Передача закодированного метода в качестве данных работает, но обратите внимание, что если вы оцениваете транзакцию эфира для заключения контракта, вы также должны передать точное значение в объект транзакции оценки.   -  person Deimantas    schedule 04.07.2019


Ответы (1)


Вы не указываете в контракте, что выполняете, поэтому оценивать нечего. Когда вы estimateGas для перевода на учетную запись EOA, код контракта отсутствует, поэтому нет данных сообщения, которые должны быть отправлены как часть объекта транзакции. Если вы оцениваете газ по запросу по контракту, вам необходимо указать data для контракта.

Например, если вы хотите оценить газ по методу setValue(2) в этом контракте

pragma solidity ^0.4.19;

contract SimpleContract {
  uint256 _value;

  function setValue(uint256 value) public {
    _value = value;
  }
}

ваш звонок будет

var data = '552410770000000000000000000000000000000000000000000000000000000000000002';
eth.estimateGas({from: fromAccount, to: contractAddress, data});

Значение data получается из кодировки сигнатуры функции и значения (значений) параметра. Вы можете использовать простой инструмент (например, https://abi.hashex.org) для его создания. Вы просто вводите имя функции вместе с типами аргументов параметра и их значениями, и она сгенерирует для вас данные сообщения. Вы также можете сделать это с помощью web3js.

РЕДАКТИРОВАТЬ - я не учел контракты с резервными функциями. Выполнение estimateGas по контракту без передачи данных сообщения дает оценку контрактов, у которых есть резервная функция. Если в контракте нет резервной функции, вызов завершится ошибкой.

person Adam Kipnis    schedule 08.04.2018
comment
Еще раз спасибо! Итак, согласно этому комментарию: github. com / ethereum / go-ethereum / blob / master / accounts / abi / bind / - если в контракте нет метода по умолчанию для финансирования контракта, приведенного выше, возникнет ошибка? - person VadimFilin; 08.04.2018
comment
да. Тем не менее, вы поднимаете хороший вопрос о резервной функции. Я добавлю это к ответу. - person Adam Kipnis; 08.04.2018