Gas
平凡還原合約函式的不同gas使用
我們目前正在 Ropsten 測試網路上測試功能,並遇到有關氣體使用的問題。我們的函式有時會多使用 12 個氣體,我們無法理解為什麼會這樣。為了測試這一點,我們定義了一個函式
function refund (bytes32 sessionId) public { require (false); ... }
它在第一行之後失敗並恢復事務。我們用大約不同的 byte32 值呼叫了它 30 次。每 3 分鐘。這是此功能的兩個交易,具有不同的氣體使用量:
- https://ropsten.etherscan.io/tx/0xa48c4f09da3a8d57fc4061ecad27a3097c225ad3e524e81948e6d38461e41b1f
- https://ropsten.etherscan.io/tx/0x3126bdcdb6c5fd569a85a9c95928b1fd8c856ded7047670064f0d4e965199fe8
唯一的區別似乎是隨機數(duh)、塊索引位置和不同的 32 字節長輸入(未使用)。是否對我們缺少的已用氣體進行了一些計算?
編輯:
在 goerli 上使用更簡單的合約進行了測試。
pragma solidity ^0.5; contract FairDataExchange { function refund(bytes32 t) public{ } }
這裡的問題是一樣的。如果沒有參數t,這個問題似乎不會出現(n=45)。
goerli上的交易:
區別在於輸入。您為輸入數據中的每個字節付費。零字節更便宜。
第一個 tx 有一個零字節
d1cde79209c0d871e6bb93c58344 00 7991a382ee75fc0e4b016486be3c195595
二不
d494db4db43f7d40fc919665c4935441e05a2fac218738a2e1e217afaaaeb1e7
來自黃皮書附錄 G“費用表”
- G txdatazero , 4, 為交易的每個零字節數據或程式碼付費。
- G txdatanonzero , 16, 為交易的每個非零字節數據或程式碼付費。
注意:Ropsten 已啟動伊斯坦布爾,它使用EIP 2028中定義的新成本。Goerli 和 mainnet 仍然使用之前的成本 4/68。