Go-Ethereum

以下合約的gas費用

  • December 10, 2018

我正在計算以下契約的天然氣成本:0x6001600190016007026005016002900460049060016021900560150160030260059007600303600960110a60005260086000f3.

反彙編版本:

contract Contract {
   function main() {
       var var0 = 0x04;
       var var1 = (0x05 + 0x07 * (0x01 + 0x01)) / 0x02;
       var var2 = 0x03 - (0x03 * 0x15) i% 0x05;
       memory[0x00:0x20] = 0x11 ** 0x09;
       return memory[0x00:0x08];
   }
}

label_0000:
   // Inputs[1] { @0032  memory[0x00:0x08] }
   0000    60  PUSH1 0x01
   0002    60  PUSH1 0x01
   0004    90  SWAP1
   0005    01  ADD
   0006    60  PUSH1 0x07
   0008    02  MUL
   0009    60  PUSH1 0x05
   000B    01  ADD
   000C    60  PUSH1 0x02
   000E    90  SWAP1
   000F    04  DIV
   0010    60  PUSH1 0x04
   0012    90  SWAP1
   0013    60  PUSH1 0x01
   0015    60  PUSH1 0x21
   0017    90  SWAP1
   0018    05  SDIV
   0019    60  PUSH1 0x15
   001B    01  ADD
   001C    60  PUSH1 0x03
   001E    02  MUL
   001F    60  PUSH1 0x05
   0021    90  SWAP1
   0022    07  SMOD
   0023    60  PUSH1 0x03
   0025    03  SUB
   0026    60  PUSH1 0x09
   0028    60  PUSH1 0x11
   002A    0A  EXP
   002B    60  PUSH1 0x00
   002D    52  MSTORE
   002E    60  PUSH1 0x08
   0030    60  PUSH1 0x00
   0032    F3  *RETURN

我的估計是(基於最近的費用表:https ://docs.google.com/spreadsheets/d/1n6mRqkBz3iWcOlRem_mO09GtSKEKrAsfO7Frgx18pNU/edit#gid=0 )

3 x ADD + 2 x MUL + SUB + DIV + SDIV + SMOD + EXP + MSTORE + 17 x PUSH + 5 x SWAP =
3 x 3   + 2 x 5   + 3   + 5   + 5    + 5    + 60  + 6      + 17 x 3    + 5 x 3    =
169

不幸的是,官方 go-ethereum 儲存庫( https://github.com/ethereum/tests/blob/ad2184adca367c0b68c65b44519dba16e1d0b9e2/VMTests/vmArithmeticTest/arith1.json )中的相應 VM 測試估計為 129。

在這次執行中,我在哪裡多算了 40 個氣體?

(請注意交易和通話費用不適用於虛擬機測試)

EXP的公式(根據黃皮書)如下:

G_exp + G_expbyte * (1 + floor(log256(exponent)))

在您的情況下,指數等於0x09。因此,如果我們使用目前公式,我們將得到:

10 + 50 * (1 + 0) = 60

如你所說。但是,顯然測試結果是使用EIP160未生效的舊版本計算的。因此G_expbyte常數應設置為 10(如本文中所述):

10 + 10 * (1) = 20

這解釋了 129 氣體的結果。

@flygoing 指出的叉子的名稱是“pre-Spurious Dragon fork”

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