90%合併,10%難度炸彈?
正如在上一篇更新里承諾的,這篇更新會深入介紹合併後的以太坊客戶端架構。隨著Amphora 互操作性活動取得的進展,合併的規範現在已經接近最終敲定 ?
在我們深入合併的內容之前,先簡單介紹一下難度炸彈的最新情況!
箭冰川??
在第124 次的核心開發者會議裡(視頻、推文),我們對難度炸彈的兩個時間達成共識:升級在2021 年12 月進行,推遲到2022 年6 月。為此,我們需要一次網絡升級——Arrow Glacier,它將僅包括關於推遲難度炸彈的EIP-4345。
Arrow Glacier 計劃在區塊13,773,000 激活,預計時間會在2021 年12 月8 日。
在核心開發者會議上,我們對冰河時期推遲的多個選項進行了討論。之所以選擇6 月,是因為我們有信心“合併”能在此前實現,而且我們想避免在此前再組織一次難度炸彈推遲。
當然,合併和難度炸彈是分開的:它需要單獨的一次網絡升級,且是基於PoW total difficulty 的臨界值來激活的。這意味著我們不需要“等待”難度炸彈爆炸才能把以太坊過渡到權益證明。同樣地,如果我們在過渡上遇到問題,我們可以決定再次推遲難度炸彈。
希望Arrow Glacir 將是PoW 以太坊??到合併之前最後一次網絡升級!
合併後的架構?
合併的架構利用了以太坊用於執行鏈(Eth1) 和信標鏈(Eth2) 久經實戰的客戶端。由於它們已經存在了,繼續使用它們是合理的。
概括來說,在合併過程中,客戶端將從根據PoW 鏈轉為根據PoS 鏈來決定以太坊的最新有效區塊。此外,客戶端大多數的功能,以及更重要的EVM、它的狀態,和它是如何執行交易的,都保持不變。
合併後,現在的Eth1 和Eth2 客戶端分別變成以太坊的執行層和共識層(或叫做引擎)。這意味著Eth1 或信標鏈客戶端的節點運行者將需要運行堆棧的“另一半”,以擁有一個完整的驗證節點。 Danny Ryan 製作了非常好的圖表對其進行說明。它們都已經被鑄造成NFT 了,所有的收益都將用於獎勵合併工作的工程師和研究員。
合併後的客戶端架構。 NFT 藝術家:Danny Ryan
上圖展示了合併後一個完整的以太坊客戶端的樣子。讓我們以此為起點,深入到每個組件。
信標節點?
現在,信標節點是對空區塊(從終端用戶角度來看) 達成共識的。這些區塊包括與共識相關的信息,稱為操作(Operations),比如證明(attestations)、存款合約根和驗證者的罰沒/退出,但不包括Eth1 意義上的交易信息(例如,發送ETH 或與智能合約交互)。合併將改變這個情況。
在合併發生時,信標節點將監測當前的PoW 鏈,並等待它觸達預設定的total difficulty (總難度) 閾值,被稱為TERMINAL_TOTAL_DIFFICULTY (終結總難度)。一旦出了一個區塊的total difficulty >= TERMINAL_TOTAL_DIFFICULTY,該區塊將會被視為最後的PoW 區塊。隨後的區塊都開始由信標鏈上的驗證者構建和證明。
要做到以上內容,信標節點將需要與它們的執行引擎(以前的Eth1 客戶端) 通信,並請求它生成或驗證ExecutionPayloads (執行數據)。這些數據是Eth1 區塊合併後的等同物。它們包含這些信息:父塊的哈希值(parent’s hash)、狀態根(state root)、基本費用( base fee)、需要執行交易列表。一旦這些信息都被生成或驗證了,信標節點將在p2p 網絡與其他節點分享。
合併後的區塊:共識層(即信標節點) 驗證所有現在屬於信標鏈區塊的欄位。當它在網絡上收到ExecutionPayloads 時,它會將其傳送到執行層進行驗證。
為了在共識層和執行層建立通信,會引入一組新的JSON RPC 端點:Engine API (引擎應用程序接口)。
引擎 API ⚙️
Engine API 是共識層和執行層間的通信接口。它不在執行層的公共JSON RPC API,而在一個獨立的端口。為了簡單,對API 的調用總是由共識層發起,而API 只引入三個方法:engine_executePayload、 engine_forkchoiceUpdated 和engine_getPayload。讓我們逐個看看它們是做什麼的:
engine_executePayload (引擎執行數據) 要求執行層驗證ExecutionPayload 是否符合所有協議規則。
在通過這個調用接收到數據後,執行層將返回VALID/INVALID (有效/無效) 或,如果它還沒同步完鏈頭,則返回SYNCING (同步中)。因為一個區塊的有效性是取決於它的父塊有效性的,如果執行層缺乏歷史數據來評估數據的有效性,它將從網絡上獲取這些數據。
engine_forkchoiceUpdated (引擎分叉選擇更新) 是共識層在網絡上告知執行層新的鏈頭和最終敲定的區塊的方式。如果共識層需要執行層在最新的鏈頭區塊上生成一個新的ExecutionPayload,它會和這個調用一起傳送一個payloadAttributes 欄位。
payloadAttributes 欄位包含與執行引擎生成一個ExecutionPayload 的相關信息,特別是timestamp (時間戳), random (亂數) 和feeRecipient (相當於以前的coinbase) 的值。在接收到這個調用時,執行層將更新它的鏈頭,根據需要進行同步,以及,如果有需要的話,開始用payloadAttributes 的數值構建一個ExecutionPayload。
engine_getPayload (引擎獲取數據)請求執行層返回它的最佳ExecutionPayload,它的構建過程已在之前對engine_forkChoiceUpdated 的相關調用時啟動了。
這就是當驗證者必須出塊時,它從它的執行引擎獲取一個有效區塊的方式。其他節點在從p2p 層接收到該區塊後將調用engine_executePayload 來評估其有效性。
……就是這樣!有了這三個新的端點,共識層和執行層可以就鏈的狀態和交易數據進行通信。現在,讓我們深入了解執行引擎的工作原理。
執行引擎?
如上文所述,執行引擎就是合併後的Eth1 客戶端。在這點上,任何與共識相關的內容都從它們的權限中移除了。它們的主要重點變成狀態管理、區塊構建和驗證,這些都稍有修改。大部分的修改都寫在了EIP-3675。
第一,合併將需要對區塊格式進行一些修改。有些僅與PoW 而非PoS 相關的欄位會被設為0 (或它們的數據結構的等同物)。這些欄位不是與挖礦(difficulty, mixHash, nonce) 就是與ommers (ommers, ommersHash) 有關,它們在PoS 上都是不存在的。主網上extraData 的長度也將被限制在32 個字節上。
第二,由於合併後代幣增發僅會在信標鏈上發生,執行層將不再處理區塊和叔塊獎勵。也就是說。執行引擎將仍然負責處理交易費。事實上,當它創建ExecutionPayload 時,執行引擎會確保所有交易發送者至少可以支付當前的baseFeePerGas (每單位gas 的基本費用),且任何額外費用都會被發送到feeReceipient (費用接收者)。請注意,feeReceipient 指的是“傳統”的以太坊地址,而不是信標鏈驗證者。
第三,當PoS 取代了PoW,執行引擎將不再廣播區塊。這意味著將棄用在p2p 網絡上的NewBlockHashes (0x01) 和NewBlock (0x07) 的處理程序。同樣,執行層將仍然負責同步網絡狀態,廣播交易和維持它的交易池。
下圖同樣由Danny Ryan 製作,它展示了當合併發生時執行層棄用PoW 轉而依賴信標鏈的過程。
PoW 區塊不再生成,而信標鏈區塊在合併後開始包含ExecutionPayloads。
PoW 區塊不再生成,而信標鏈區塊在合併後開始包含ExecutionPayloads。
我們現在已經介紹了客戶端如何處理區塊以及合併後進行內部通信的核心組件了。現在,讓我們簡單談談系統的的各種相對“邊緣”的組件。
P2P 網絡、用戶API 和同步?
如本文第一張圖表所示,合併後,執行和信標鏈層都在p2p 網絡裡。除了執行層上區塊廣播被棄用外,p2p 網絡上的所有東西保持不變:在它們各自獨立的p2p 網絡上,信標節點將廣播證明、罰沒等,而執行層將分享交易、同步狀態等。
同樣,信標鍊和執行層上的用戶API 都將保持獨立,除了新創建的Engine API。
有一個組件是跨越兩個層的,就是同步。我們正在為合併前和合併後各種可能的邊緣情況開發各種同步策略。它們仍在完善和測試中,並可能成為未來的深入研究主題?
後續工作?
Amphora 工作坊後,工作重心一直放在規範的完善和開發測試網的測試中。在未來幾週內,預計規範將確定下來,即我們預期不會再有大修改的地步。
同時, Pithos 測試網構建並運行起來了,有多個客戶端組合每天在上面做測試,計劃下周有一個社區會議,讓基礎設施和工具提供商快速了解合併。到時見??
在Pithos 測試網上運行的各種客戶端組合
來源:https://pithos-explorer.ethdevops.io/charts
來源| AllCoreDev Updates
作者| Tim Beiko