Go-Ethereum
以下合約的gas費用
我正在計算以下契約的天然氣成本:
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”。