了解“eth_estimateGas”結果估算氣體
我一直在玩 parity 的“eth_estimateGas”呼叫來確定不同的代幣氣體需求。一般使用這段程式碼:
let transfer_data = contract.transfer.getData("<destinaton ETH address>", 1); let gas_limit = await rpcCall("eth_estimateGas",[{ to: contractData.contractAddress, from: "<source ETH address>", data:transfer_data }]);
根據發件人地址,我得到不同的結果。如果該地址已經完成了數千筆交易(如交易所),那麼使用的 gas 量明顯高於僅完成 10 筆交易的地址。除了發件人地址之外沒有其他任何修改。
我唯一的理論是,如果 nonce 非常高,合約或 evm 必須做更多的驗證,以確保它確實有正確的餘額來完成發送。
我錯過了什麼?
編輯:這是一個範例數據。代幣:FunFair
發件人地址具有較高的現時 契約地址:0x419d0d8bdd9af5e606ae2232ed285aff190e711b從地址:0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98要地址:0x6d8401b8ed8755bb4d01a89072860c98c236dc78 https://etherscan.io/tx/0xc407d8320f44745f88244400c3750875e1858e0ee6a1106bafbde424c289a6ef所 用氣體:58999
發件人地址具有低現時 契約地址:0x419d0d8bdd9af5e606ae2232ed285aff190e711b從地址:0x8c301c986e6d23117f17394722272fcd16d43efd要地址:0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be https://etherscan.io/tx/0x708fb93a22f4ddd3d410f7280fb3800c8ff96deed5d4fafa12244d0f74e48045所 用氣體:29127
將這些值插入奇偶校驗呼叫,估計結果具有大致相同的變異數。
我懶得 100% 確認,但我很確定在你給出的範例中,關鍵區別在於更便宜的交易是針對發件人的全部代幣餘額。這意味著他們最終的餘額為零。將儲存中的值從非零值設置為零值可為您提供 gas 退款,從而降低交易成本。(這會激勵清理儲存。)