Solidity
空白合約的字節碼有什麼作用?
當我編制一份空白契約時:
contract A {}
和
solc --optimize --optimize-runs 300000 --opcodes test.sol
我得到:
PUSH1 0x60 PUSH1 0x40 MSTORE PUSH1 0x6 DUP1 PUSH1 0x10 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN PUSH1 0x60 PUSH1 0x40 MSTORE STOP
它是什麼?據我了解,這個字節碼不是合約程式碼,而是執行期間生成合約的程式碼。但我不明白,這是怎麼回事。
大概
PUSH1 0x60 PUSH1 0x40 MSTORE
是一種在記憶體中分配 64 字節(0x40)的模式。如果是,為什麼我們需要手動分配它?
黃皮書中有幾行關於分離“程式碼”和“數據”。我可以看到它,當
solc
與--asm-json
. 但這兩個部分實際上是如何相互作用的?我覺得我錯過了一份非常重要的文件或手冊,其中所有內容都已清除。我在哪裡可以得到它?
總結一下:
- 空白合約的字節碼有什麼作用?如果可能的話,我需要對每個操作碼進行解釋。
- 如何互動
code
和data
契約的部分?- 在哪裡可以找到有關 evm 工作原理的完整資訊?
黃皮書中提到的“數據”部分是跟在PUSH指令後面的部分,即黃皮書只講了push數據。您在程序集輸出中看到的是更高級別的概念。
空白合約的(初始化程式碼)將最終合約程式碼從程式碼複製到記憶體中,然後將其返回。
最終的合約程式碼和初始化程式碼都以將所謂的“空閒記憶體指針”儲存在記憶體位置 0x40 開始。這個指針告訴你下一個空閒記憶體塊可以分配到哪裡。在這個合約的情況下,這是完全沒有必要的,並且可能會在優化器的下一個改進階段被優化掉。