Evm
呼叫堆棧上是否有任何規範/詳細資訊?
我試圖了解 EVM 內的呼叫堆棧是如何工作的。我在黃皮書上找不到任何東西,除了網上的其他地方。誰能解釋呼叫堆棧是如何工作的,以及您是否可以以任何方式(EVM 或solidity)訪問它的值?
呼叫堆棧如何工作
正式規範
我在Luu 等人的《讓智能合約更智能》一文中找到了呼叫堆棧的正式規範。他們在第 4.1 節中詳細說明了乙太坊的操作語義的正式定義,並且他們還形式化了呼叫堆棧。
我還添加了呼叫堆棧定義的螢幕截圖。
本質上,正如@ismael 已經指出的那樣,每個呼叫都有自己的堆棧、記憶體、程序計數器和契約程式碼,因此每次執行都是隔離的。每次執行呼叫時,執行器都會檢查呼叫堆棧大小是否不超過 1024 大小,並添加新的啟動記錄。
Go-Ethereum 實現 如果您查看 go-ethereum 實現文件
core/vm/instruction.go
,函式opCallCode
,您可以看到該實現使用語言的堆棧而不是顯式堆棧: https ://github.com/ethereum/go-ethereum /blob/master/core/vm/instructions.go,實際上,當執行呼叫時,會創建一個具有自己機器狀態的新函式。可以以任何方式(EVM 或solidity)訪問呼叫堆棧值嗎?
在黃皮書中,我找不到訪問先前呼叫堆棧的啟動記錄和實際呼叫堆棧高度的特定指令。唯一可用的資訊是由@ismael“發送者和呼叫數據”指定的資訊,並且在被呼叫者完成後,如果被呼叫者執行失敗(由於異常),呼叫者在其堆棧頂部有一個 0,否則為 1。
潛在地,人們可以編寫自己的一組智能合約,將目前呼叫堆棧大小相互傳遞,然後使用此資訊執行一些呼叫堆棧攻擊,如solidity文件和前面提到的論文中所建議的那樣。