Solidity

空白合約的字節碼有什麼作用?

  • May 15, 2017

當我編制一份空白契約時:

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. 但這兩個部分實際上是如何相互作用的?

我覺得我錯過了一份非常重要的文件或手冊,其中所有內容都已清除。我在哪裡可以得到它?

總結一下:

  1. 空白合約的字節碼有什麼作用?如果可能的話,我需要對每個操作碼進行解釋。
  2. 如何互動codedata契約的部分?
  3. 在哪裡可以找到有關 evm 工作原理的完整資訊?

黃皮書中提到的“數據”部分是跟在PUSH指令後面的部分,即黃皮書只講了push數據。您在程序集輸出中看到的是更高級別的概念。

空白合約的(初始化程式碼)將最終合約程式碼從程式碼複製到記憶體中,然後將其返回。

最終的合約程式碼和初始化程式碼都以將所謂的“空閒記憶體指針”儲存在記憶體位置 0x40 開始。這個指針告訴你下一個空閒記憶體塊可以分配到哪裡。在這個合約的情況下,這是完全沒有必要的,並且可能會在優化器的下一個改進階段被優化掉。

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