Blockchain

節點如何在 EVM 中執行智能合約並使用合約執行結果更新區塊鏈

  • February 21, 2021

我想了解乙太坊節點如何在 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 操作碼更新儲存根。

當交易在沒有恢復的情況下完成時,最終的儲存根記錄在合約狀態中。如果交易恢復之前的儲存根,則恢復到合約狀態。

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