Contract-Development

契約交易:估計的氣體與使用的氣體不匹配

  • October 15, 2016

在了解如何估算合約 tx 費用後,如何估算呼叫智能合約方法的成本?呼叫合約狀態更改方法的語法 Gas 估計為 27,348 ,而 Gas 消耗為 181,080。那麼,有什麼問題呢?在處理智能合約時,這種氣體估算過程是否做得很好?

這是我用來估算端點氣體的數據:地址為0x27c042342C9ba937214117e11A4970A6145034cB的智能合約中的**“start(address, address)”**

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

產生的氣體估計為:27,348

另一方面,執行以下 tx:

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

txHash: 0xbad5639d7f02cfb1658580eb8cab5f950d379ee8197f423178391dc70701459f

一旦 tx 被開採,這就是產生的氣體值:

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

那麼,為什麼估計氣這麼少呢?提前謝謝!

我找到了一些東西,也許它可以幫助別人……

散列的簽名不是“開始(地址,地址)”,而是“開始(地址,地址)”。這個空白改變了一切。

我還在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

gasEstimated = 181,080

參數必須一個接一個地編碼,每個 32 字節 0 左填充,因此每個使用 64 個十六進製字元來表示。

引用自:https://ethereum.stackexchange.com/questions/9269