節點如何在 EVM 中執行智能合約並使用合約執行結果更新區塊鏈
我想了解乙太坊節點如何在 EVM 中載入合約字節碼,然後將它需要的所有內容寫回區塊鏈。
我是這樣理解的。
合約被編譯成字節碼。它部署在鏈上。當使用者呼叫該合約地址來執行函式時。節點將合約作為字節碼載入到 EVM 中。執行使用者提出的請求。這一切都發生在 EVM 中。那麼如何,在節點上執行之後。節點是否在區塊鏈上寫回新數據?
例如,我的契約有一個空數組。
要呼叫的函式之一將在數組中添加一個條目。
新數組包含 1 個條目,需要返回鏈上。節點是否從 EVM 拉取數據重新編譯和重寫?我懷疑它是否會這樣工作,因為 EVM 的目的是在虛擬環境中執行程式碼。
我最好的猜測是 EVM 實際上是執行字節碼然後重寫區塊鏈上的新內容的程序。
現在根據為什麼這個問題?
我正在嘗試使用 NodeJS 中的 JVM 或 V8 引擎 VM 重複該過程。
我沒有使用solidity,而是將Javascript編譯成字節碼。所以這就是我的智能合約。它正在工作。我可以在 VM 中載入 Javascript 並呼叫函式並獲得響應。
現在所有這些程式碼都保留在 VM 中。這就是我不確定下一步要做什麼的地方。
在我的範例中,呼叫在數組中添加一個條目。我想將該新數組寫回區塊鏈,但我不確定該方法。乙太坊節點是否在 EVM 和區塊鏈之間架起了一座橋樑?還是節點使用 EVM 並且只與 EVM 互動,而 EVM 又與區塊鏈互動?
在乙太坊中,每個合約都有一個使用Patricia Trie的鍵值儲存。儲存樹的根與字節碼、餘額和隨機數一起保存在合約狀態中。
在高層次上,solidity 語言定義了不同類型如何映射到儲存,因此在執行時修改變數時計算正確的鍵。
在底層,EVM 提供了修改這個儲存的原語:SSTORE(key, value) 和 SLOAD(key)。其中 key 和 value 正好是 32 個字節。SSTORE 操作碼更新儲存根。
當交易在沒有恢復的情況下完成時,最終的儲存根記錄在合約狀態中。如果交易恢復之前的儲存根,則恢復到合約狀態。