執行用戶端
執行用戶端是以太坊節點中負責執行層的那一半:實際在 EVM 上運行交易,並維護由此產生的世界狀態——帳戶餘額、合約程式碼與儲存。若說共識用戶端是裁定出場順序的裁判,執行用戶端就是執行每一回合的引擎:給定一份已排序的交易清單,它逐一執行、更新狀態樹、算出新的狀態根,並檢查一切都遵守協定規則。
它也持有多數應用開發者實際會碰到的系統部分。執行用戶端維護待處理交易的公開記憶池、在網路上傳播交易、提供面向使用者的 JSON-RPC API(eth_call、eth_getBalance、eth_sendRawTransaction 等),並儲存瀏覽器與 dapp 所查詢的鏈資料與狀態。當你「把錢包連上節點」時,你對話的對象正是執行用戶端。主要實作包括 Geth、Nethermind、Besu、Erigon 與 Reth。
自合併以來,執行用戶端不再對共識做任何決定——它無法挑選鏈頭或最終化區塊。取而代之地,它依共識用戶端透過經身分驗證的引擎 API 下達的指示行事:它接收一份待執行與驗證的酬載(engine_newPayload)、被告知該採用哪個鏈頭(engine_forkchoiceUpdated),並在其營運者的驗證者輪到提議時,組裝一份候選執行酬載(交易及其結果狀態)供共識用戶端包裝成信標區塊。執行與共識是兩個協作的程序,缺一不可。
如同共識用戶端,執行用戶端也是一個攸關共識的多樣性面。一個使某執行實作算出與其他實作不同狀態根的漏洞,可能使鏈分裂,或者若該用戶端佔絕對多數,便會最終化一個無效狀態。2016 年的上海阻斷服務攻擊與後來的共識漏洞都提醒我們,執行用戶端必須精確重現 EVM 的行為,細至 gas 計帳與邊角案例;這正是社群緊盯執行用戶端市佔率、並力促營運者運行少數派用戶端的原因。
執行用戶端才是錢包與 dapp 實際對話的對象(記憶池+JSON-RPC),但自合併以來,它在排序與最終性上的指令來自共識用戶端,透過引擎 API 下達。