Solc
乙太坊的“空閒記憶體指針”是什麼時候改變的?(6060…-> 6080…)
我一直在深入探勘乙太坊字節碼,具體目標是從原始碼進行合約驗證。
我注意到,在進行一些測試時,乙太坊合約的初始字節在 0.4.21 和 0.4.22 之間發生了變化。
通常,契約總是以:
6060604052
PUSH1 0x60 PUSH1 0x40 MSTORE
但從 0.4.22 開始,它們似乎開始於:
6080604052
PUSH1 0x80 PUSH1 0x40 MSTORE
此更改的意義是什麼,我在哪裡可以找到有關此更改的文件?
合約序言指令更改為在 0x60 處提供一個額外的插槽,該插槽應始終保持值 0。該文件指出:
零槽用作動態記憶體數組的初始值,永遠不應寫入(空閒記憶體指針最初指向 0x80)。
僅供參考,我用JEB Decompiler檢查了幾份契約,似乎他們同意你的觀點:舊序言(0x60 字節)的契約被檢測為由 Solidity <= 0.4.21 生成,而新序言的契約被檢測為 >= 0.4 .22.