Opcode
創建操作碼:它到底做了什麼?
我正在查看文件,但無法真正理解 CREATE 操作碼的作用。我可以看出 CREATE 確實從記憶體塊創建了一個新的智能合約,將 gas 值傳遞給這個新合約,然後返回。但在返回之前,它是否執行了新契約?
這讓我很困惑,因為查看智能合約字節碼的反彙編程式碼,在 CREATE 之後,我看不到任何對 CALL 的呼叫,但我仍然看到對 RETURNDATASIZE 的呼叫,我想這只會在 CALL 之後發生。如果沒有 CALL,它從哪裡獲取返回的數據?
有什麼啟示嗎?
CREATE,在某種程度上,做了一個內置的 CALL。實際發生的是傳遞給的數據
call
不是合約字節碼,而是init
字節碼。當 CREATE 操作碼被執行時,EVM 在新合約的上下文中創建一個呼叫幀(例如 address(this) 是新合約的地址)。這會執行作為程式碼傳遞給 CREATE 的數據,在高級語言中,這基本上是建構子。在這些
init
東西的最後,它return
是儲存在 state trie 中的合約的實際程式碼。考慮它的最簡單方法,也相當準確,是 Solidity 編譯器獲取合約的所有執行程式碼,將其編譯為字節碼,並將其作為 return 語句添加到建構子的末尾。