Evm

字節碼中的第一條指令 (606060405)

  • March 4, 2018

我試圖弄清楚 EVM 字節碼是如何工作的,我在 Remix 中創建了一個空合約。彙編版本如下所示:

PUSH1 0x60 
PUSH1 0x40 
MSTORE 
CALLVALUE 
ISZERO 
PUSH1 0xE 
JUMPI 
PUSH1 0x0 
DUP1 
REVERT 
JUMPDEST 
PUSH1 0x35 
DUP1 
PUSH1 0x1B 
PUSH1 0x0 
CODECOPY 
PUSH1 0x0 
RETURN 
STOP


PUSH1 0x60 
PUSH1 0x40 
MSTORE 
PUSH1 0x0 
DUP1 
REVERT 
STOP

AFAIK第一部分在契約創建時執行,第二部分是契約程式碼本身。

我無法理解的是這部分:

PUSH1 0x60 
PUSH1 0x40 
MSTORE 

為什麼我們需要在每個程序開始時將 smth 儲存在記憶體中?

回答我自己的問題:

這是空閒記憶體指針。前 0x40 字節保留用於內部計算。然後 0x40 - 0x60(一個字)儲存指向空閒記憶體(可用於分配)的指針 - 在這種情況下顯然是 0x60。

所以這段程式碼:

PUSH1 0x60 
PUSH1 0x40 
MSTORE 

初始化記憶體指針。

詳細資訊: https ://solidity.readthedocs.io/en/develop/miscellaneous.html#layout-of-state-variables-in-storage

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