Gas

平凡還原合約函式的不同gas使用

  • October 17, 2019

我們目前正在 Ropsten 測試網路上測試功能,並遇到有關氣體使用的問題。我們的函式有時會多使用 12 個氣體,我們無法理解為什麼會這樣。為了測試這一點,我們定義了一個函式

   function refund (bytes32 sessionId) public {
           require (false);
           ...
}

它在第一行之後失敗並恢復事務。我們用大約不同的 byte32 值呼叫了它 30 次。每 3 分鐘。這是此功能的兩個交易,具有不同的氣體使用量:

  1. https://ropsten.etherscan.io/tx/0xa48c4f09da3a8d57fc4061ecad27a3097c225ad3e524e81948e6d38461e41b1f
  2. https://ropsten.etherscan.io/tx/0x3126bdcdb6c5fd569a85a9c95928b1fd8c856ded7047670064f0d4e965199fe8

唯一的區別似乎是隨機數(duh)、塊索引位置和不同的 32 字節長輸入(未使用)。是否對我們缺少的已用氣體進行了一些計算?

編輯:

在 goerli 上使用更簡單的合約進行了測試。

pragma solidity ^0.5;

contract FairDataExchange {
   function refund(bytes32 t) public{
   }
}

這裡的問題是一樣的。如果沒有參數t,這個問題似乎不會出現(n=45)。

goerli上的交易:

  1. https://goerli.etherscan.io/tx/0xd48b8ad613145af060489082507253786e6211fd34dfbe641c10f5e03b82f3d8

  2. https://goerli.etherscan.io/tx/0x434a546e43f2e2bfc5bf509f67fd8543506e9223b0d52fa41213063ca90595b7

區別在於輸入。您為輸入數據中的每個字節付費。零字節更便宜。

第一個 tx 有一個零字節

d1cde79209c0d871e6bb93c58344 00 7991a382ee75fc0e4b016486be3c195595

二不

d494db4db43f7d40fc919665c4935441e05a2fac218738a2e1e217afaaaeb1e7

來自黃皮書附錄 G“費用表”

  • G txdatazero , 4, 為交易的每個零字節數據或程式碼付費。
  • G txdatanonzero , 16, 為交易的每個非零字節數據或程式碼付費。

注意:Ropsten 已啟動伊斯坦布爾,它使用EIP 2028中定義的新成本。Goerli 和 mainnet 仍然使用之前的成本 4/68。

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