BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

科普:以太坊2.0信標鏈中的狀態轉換

以太坊爱好者
特邀专栏作者
本文約2026字,閱讀全文需要約3分鐘
信標鏈的區塊生產與狀態轉換。
AI總結
信標鏈的區塊生產與狀態轉換。

編者按:本文來自以太坊愛好者(ID:ethfans)編者按:本文來自

以太坊愛好者(ID:ethfans)

編者按:本文來自

以太坊愛好者(ID:ethfans)

圖片描述

編者按:本文來自

以太坊愛好者(ID:ethfans)

圖片描述

,作者:Sly Gryphon,譯者&校對: IAN LIU & 阿劍,Odaily經授權轉載。

信標鏈由區塊和不斷遞進的狀態組成;區塊被產出、簽名、傳遍網絡,然後用於更新狀態。下圖展示了主要的相互關係:

圖片描述

- 實線表示聚合關係,虛線表示依賴關係。即發出箭頭的部分是聚合/依賴於箭頭所指向的內容的 -

此圖基於以太坊2.0 詳述的0.10.1 版所繪。與剛發布的0.11.0 版本相比,上圖描述的內容在計算Domain 的部分有些微區別,但整體關係與前一版本一致。

創建一個新的區塊

創建區塊,要從當前的區塊鏈頂部開始。

如果當前存在一條短的分叉鏈(例如,某個時隙因為其中的區塊傳播速度太慢而被跳過,導致不同驗證者獲得的最新區塊有所區別),則由分叉選擇算法,幫你選出“最合適”(獲得的驗證者見證消息權重越大則越“合適”)的區塊鏈頭。

BeaconBlockHeader*

此外,即使某些slot 被跳過(沒有產生區塊),狀態仍會推進(但不執行任何操作)。

BeaconBlockBody (“信標鏈區塊區塊體”)會包含所有需要被執行的操作(保證金存入、見證消息、驗證者退出,等等)。這些操作會被用於改變狀態、生成新的BeaconState(“信標鏈狀態”)。

時隙、父區塊根、操作的根哈希(body root,區塊體根)會作為BeaconBlockHeader(“信標鏈區塊區塊頭”)的組成元素被添加進狀態。要注意的是,BeaconBlockHeader 組成元素之一的狀態根是零(0x000…),因為狀態不能遞歸包含自己的哈希,否則會出現死循環。

最終狀態(帶有上述0x000… 值的狀態)的根哈希被算出並加入區塊,然後區塊哈希得到Block root(“區塊根”)並跟鏈的Domain 放在一起,經過簽名後在網絡中傳播。 Domain 的意義是防止區塊被傳播到其他主網或測試網上發生碰撞(collision)。

執行狀態轉換

節點收到SignedBeaconBlock (“經過簽名的信標鏈區塊”)後,要執行一些驗證,包含:確認簽名的有效性,及是否有對應父區塊的狀態(父區塊由parent root “父區塊根” 指出)。

通過將狀態時隙推進到區塊所在時隙(可以是被跳過的時隙),然後執行BeaconBlockBody 所包含的操作(比如保證金存入、見證消息、驗證者退出等等),我們便可以更新狀態。

  • 要注意的是,出現被跳過的時隙時,也會產生新的內部狀態,並推進當前狀態至下一個時隙,區別只是不會有其他附帶的執行動作。

  • 結果狀態應該與區塊生產者得到的狀態相同,因此我們能通過計算新的BeaconState(包含0x000...)的哈希值,與收到的區塊所記載的狀態根進行校驗。

  • 信標鏈狀態包含了四個區塊基礎組成信息中的三種—— 時隙、父區塊根哈希,和BeaconBlockBody (即要執行的操作)的根哈希。

在計算內部狀態時,最新的區塊時隙要和最新的狀態時隙要有所區別,因為如果出現被跳過的時隙,會使得最新的區塊時隙和狀態時隙不一致。比如,如果時隙7 被跳過,則我們仍會以時隙6 作為最新區塊,父區塊根和區塊體根哈希都仍將指向時隙6 的區塊。

這幾個元素作為一個集群,使用和BeaconBlockHeader 相同的結構,不過使用的區塊根狀態永遠為零(0x000...),因為狀態不能遞歸包含自己的哈希;在圖中表示為“BeaconBlockHeader”。

這麼做的好處是,我們可以輕易的計算出區塊根的狀態——通過計算狀態的根哈希,然後創建區塊頭的副本並插入正確的根狀態,最後計算整個區塊頭的哈希(這個值會與收到的區塊的哈希值相同)。

鏈接的區塊能增加信任

區塊鏈的重要特徵就是,它以系統性信任(經由算法達成的處理器多數)取代了原來個體間的信任(交易對手或第三方)。

ETH
歡迎加入Odaily官方社群