Контрактная транзакция: расчетный газ не соответствует используемому газу

После того, как вы узнали, как оценить комиссию за транзакцию контракта, спасибо Как оценить стоимость вызова метода смарт-контракта? и Синтаксис для вызова методов изменения состояния контракта . Я попытался использовать все эти знания и реализовать собственную контрактную транзакцию с предыдущей оценкой газа, но они довольно сильно отличаются. По оценкам, газ составляет 27 348, в то время как потребляемый газ составляет 181 080 . Итак, что не так? Хорошо ли реализован этот процесс оценки газа при работе со смарт-контрактами?

Это данные, которые я использовал для оценки газа для конечной точки: «начало (адрес, адрес)» в смарт-контракте с адресом 0x27c042342C9ba937214117e11A4970A6145034cB.

web3_sha3(endpoint) = 0xaa6d19c0b1d22f6983033c255695177ad1db0a0aad0435b6f6a367b48d4b37f4 
arguments = "0xa7e3c7c227c72a60e5a2f9912448fb1c21078769, 0xf28dafbfeb41bf32869c9d498da0d651d0206ed4" 
strhex(arguments) = 0x3078613765336337633232376337326136306535613266393931323434386662316332313037383736392c20307866323864616662666562343162663332383639633964343938646130643635316430323036656434 
data = 0xaa6d19c03078613765336337633232376337326136306535613266393931323434386662316332313037383736392c20307866323864616662666562343162663332383639633964343938646130643635316430323036656434

что дает оценку газа: 27 348

С другой стороны, выполняется следующая передача:

sc.start.sendTransaction("0xa7e3c7c227c72a60e5a2f9912448fb1c21078769", "0x47978a69f410d0f61850c92acdb0d4c464d70937", {from:"0x3b877e80b5c0b29d88f3768ed4292b35fdd93a9d", value:"0x55ae82600", gas:1000000});

txHash: 0xbad5639d7f02cfb1658580eb8cab5f950d379ee8197f423178391dc70701459f

и после того, как tx был добыт, это результирующие значения газа:

Gas: 1,000,000
Gas Used By Transaction: 181,080

Итак, почему предполагаемый газ так выключен? Спасибо заранее!

Различные пути кода, выбранные во время оценки, и тот, который добывается? Также кажется, что второй аргумент в sendTransaction отличается от того, который указан в оценке. эфириум.stackexchange.com/questions/266/…

Ответы (2)

Я нашел кое-что, может быть, это может помочь другим...

Подпись к хэшу НЕ "начало (адрес, адрес)", а вместо этого "начало (адрес, адрес)". Это белое пространство меняет все.

Я также нашел очень ценную информацию о передаче параметров в контракты на https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#examples.

Теперь это работает как шарм!

endpoint = "start(address,address)" 
web3_sha3(endpoint) = 0x3ccfe887556b4c598501287bcd4528f0b8830f303e150d3b4c3ac9831b7989a8 
arguments = Array (
    [sellerAddress] => Array
        (
            [type] => address
            [value] => 0xa7e3c7c227c72a60e5a2f9912448fb1c21078769
        )

    [thirdPartyAddress] => Array
        (
            [type] => address
            [value] => 0xf28dafbfeb41bf32869c9d498da0d651d0206ed4
        )
)
data = 0x3ccfe887000000000000000000000000a7e3c7c227c72a60e5a2f9912448fb1c21078769000000000000000000000000f28dafbfeb41bf32869c9d498da0d651d0206ed4

газОценка = 181 080

Аргументы должны быть закодированы один за другим, каждый из которых занимает 32 байта, дополненный 0 слева, поэтому для представления каждого из них используется 64 шестнадцатеричных символа.