來源 | medium.com/chainsafe-systems
作者 | Colin Schwarz
Lodestar 是 ChainSafe 的 Eth2 客戶端,用 Typescript 構建。Lodestar 提供高度可訪問的工具庫,使整個 Eth2 生態系統受益,我們的工具庫用流暢的 TypeScript 編寫,這使得它們可以被廣大的開發者所用。另外,Lodestar 的工作重點將是在 Eth2 生態系統里作為可部署的輕客戶端,請參閱我們最新的部落格文章,這個演講和這些幻燈片來了解我們,
本文由 Cayman Nava 和 Dapplion 合寫,由 Timothy Hao Chi Ho 編輯,圖片由 Phil Ngo 提供。
為什么 Eth2 需要輕客戶端
以太坊由成千上萬的節點構成,這些節點運行著不同的客戶端,客戶端主要在實現語言和軟體規模兩方面不一樣。在 Eth2 上運行一個全節點客戶端意味著你必須下載整條 Eth2 區塊鏈的數據,這對許多環境來說是令人望而卻步的,且對某些用例來說是沒有必要的。例如,一個全節點無法在一個安裝了信任最小化錢包的移動設備上運行。還有很多用例只想讀取鏈上某小段數據,例如獲取最新的驗證者余額,或為一個區塊鏈橋接實例 (例如 ChainBridge) 存儲一個計量虛擬機,在這些實例里,一個輕量級客戶端就足夠了,比一個全節點客戶端更合適,
為了檢索最新的狀態,以太坊全節點必須下載創世 (或其他) 信標狀態,并從頭到尾下載且按順序處理每個權威區塊。而使用輕客戶端的話,所需的帶寬和處理負荷可以減少約 99%,
Eth2 協議是如何支持輕客戶端的?
最近 Altair 的升級增加了一個關鍵功能,是專門為支持輕客戶端同步而設計的——同步委員會 (sync committee)。同步委員會及其相關的基礎設施可以讓一個輕客戶端以低成本保持與鏈頭保持同步。
廣義上講,一個輕客戶端有兩個主要組成部分——首先是同步數據,然后是鏈數據檢索。
同步數據如字面意思:它使得客戶端同步到區塊鏈的最新部分。為了與鏈保持同步,一個輕客戶端會以更新資訊 (update) 的形式下載區塊鏈的部分數據,這包括一個區塊頭、一些默克爾證明 (merkle proof),和當前同步委員會的簽名,由于證明和簽名都是經過驗證的,這使得對這些一個接一個的更新資訊的信任得以構建,一旦同步了,輕客戶端就可以從區塊鏈檢索到最新數據,
鏈數據檢索通過廣泛使用默克爾證明來實現。當最新區塊頭得到驗證和信任,輕客戶端服務器就可以以默克爾證明的形式給輕客戶端提供鏈數據。這些證明可以根據區塊頭的狀態根生成和驗證。
由于同步協議對輕客戶端起著如此重要的作用,很值得深入了解它的工作原理:
- Altair 創建的同步委員會是一個特殊且長期存在的委員會,它大概每 1.1 天輪換一次。更短的周期會增加輕客戶端的數據負荷,因為它們需要更頻繁地同步,而更長的周期會給發現和賄賂委員會成員留下太多的機會;1.1 天是兩個維度都兼顧到的一個中間值 (參考規范),
- 同步委員會是從現有的以太坊驗證者中選出來的子集。Altair 升級啟動后,參與同步委員會將成為驗證者一個新的職責,
- 同步委員會的規模是 512 名驗證者,在撰寫本文時,當前主網的驗證者數約為 138,000。這是為了確保安全的一個相對大且保守的規模了 (相較于做證明的驗證者集和以后的分片提議委員而言)(參考規范),
- 同步委員會使得輕客戶端更易于與信標鏈同步數據和保持更新。
- 信標狀態會追蹤當前和下一個同步委員會的參與者。我們將在下文介紹為什么這很重要,
同步委員會參與者對區塊鏈的當前狀態,特別是前一個區塊做證明 (attest),這些證明會被聚合到一個單一簽名,然后被打包到每一個新區塊里,
- 現在,每個區塊都包含一個驗證了它前一個區塊的簽名,
- 這個特別的同步委員會證明被命名為 “SyncAggregate” (以與信標委員會放到鏈上的“Attestation” 區分)。
上文回顧
- (相對) 小的驗證者子集在每個區塊 N 對區塊 N-1 做證明
- (相對) 小的驗證者子集僅每大約 27 小時輪換一次
- (相對) 小的驗證者子集 (當前的和下一個) 的資訊會被打包到鏈上
輕客戶端同步協議現在可以制作了。它依賴于同步委員會對鏈狀態的認證。
- 不同于用整個信標狀態 (即創世狀態) 來初始化節點,輕客戶端下載一個歷史區塊頭和在該區塊的當前和下一個同步委員會的數據,
- 不同于下載和追蹤整個驗證者集 (20 萬驗證者,且數字還在上升!),輕客戶端可以只下載和追蹤當前和下一個同步委員會。
- 不同于通過下載和按順序處理每個歷史區塊來處理區塊鏈,輕客戶端可以只下載一個同步委員會的最后一個 SyncAggregate (確保 2/3 的委員會都簽名了) 和給下一個同步委員會的默克爾證明。
實質上,輕客戶端通過一直追蹤每個同步委員會來實現同步,一個接一個委員會地同步,確保每個委員會的交接都有一個得到 2/3 投票的聚合證明,用以驗證下一個委員會。
我們是如何實現的?
在 Scaling Ethereum Hackathon 期間,Lodestar 團隊決定要大力推動我們在輕客戶端上的工作,并在活動結束前展示一個原型和進行演示,當時的輕客戶端原型連接到一個后端,該后端使用的是沒有驗證者共識創建的區塊來更新狀態,這使得我們可以以低資源消耗對消費者層做測試,
黑客松之后,我們把全部功能遷移到我們的信標節點,這樣輕客戶端就使用網路上的真實數據,隨著區塊鏈的發展和通過新的 ‘lightclient’ API 命名空間為信標節點提供服務,信標節點現在可以高效地給初始證明提供更新資訊了。我們已經可以連接到 Altair 開發者測試網 0、1 和 2 ,并成功處理數據了,
為了這次黑客松的目的和作出簡化版的 demo,我們為輕客戶端創建了一個 REST API 來獲取更新資訊和請求證明。在這個過程里有三個終端:
- 獲取歷史同步更新資訊
- 獲取最新的同步更新資訊
- 獲取一個信標狀態的多重證明
這些終端其實也揭示了底層功能——創建來自信標狀態的同步更新對象和多重證明,我們將尋求圍繞此 REST API 構建共識,使其成為 Eth2 里輕客戶端的新標準。
輕客戶端的初始化有兩種方式——在輕客戶端的初次啟動時從一個可信的狀態根進行初始化,或在客戶端啟動后從一個可信的快照進行初始化,輕客戶端被初始化后,它會請求從當前同步的位置到被最終確定的狀態的更新資訊,
輕客戶端也有請求證明的功能,通過當前同步的狀態根進行驗證。
我們的網站展示什么?
我們的網站展示了在瀏覽器中運行的輕客戶端的基本功能。瀏覽器輕客戶端與一個有多個客戶端參與的小型 Altair 測試網上的信標節點連接,我們展示了網路時鐘、同步狀態,和一個證明請求/響應交互部分,請看我們的 demo,了解更多資訊!
網路始終顯示的是測試網當前的 slot/epoch,這部分純粹是資訊,現在并沒有展示任何輕客戶端的功能,
同步狀態部分顯示的是輕客戶端當前的同步狀態。輕客戶端是被配置來更新最新的最終確定狀態的。在頁面加載時,你會發現同步會快速更新到當前的 slot。
證明請求/響應部分允許用戶以交互的方式執行證明請求和接收響應。證明請求作為進入信標狀態的“path (路徑)”列表。響應則顯示為反序列化結果和底層證明。
需要注意的一個特點是,對進入狀態多個“path”的每個請求返回的是單個多重證明,而不是每個 path 一個證明,這種結果的批量處理可以節省額外的帶寬。
接下來的工作
我們為在 Eth2 輕客戶端上取得的所有進展感到高興,但我們還只是剛剛起步,我們未來工作之一是把我們在構建原型時學到的東西反饋到 Eth2 規范庫。請看我們的第一個 issue。
展望未來,我們將確保與規范的更新保持同步,我們目前處于 1.1.0-beta-2 階段,這將確保我們的信標節點和輕客戶端保持更新,且與生態其他部分保持同步,我們還將繼續參與 Altair 開發者測試網/測試網,并關注 Pyrmont 測試網的情況。
Lodestar 團隊的另一個目標時創建一個能夠與鏈頭同步的、能重組 (reorg) 的輕客戶端。這是因為輕客戶端現在只能與最新最終確定的檢查點 (checkpoint) 同步,比在健康網路的鏈頭慢大約 6 分鐘,為了支持與鏈頭同步,我們需要支持在網路動蕩時會自然發生的“重組“,最后,我們計劃進行持續的研究,探索使用從共識層擴展到執行層,到合并后的可用用戶數據,現在的輕客戶端只使用在信標鏈上的數據,這包括驗證者余額、randao 值和之前的信標區塊,但關鍵是,它并不包括執行相關的數據 (之前稱為 Eth1),例如 ETH 余額或 Dapp 的狀態,
合并 (The Merge) 把執行層與共識層 (之前稱為 Eth2) 連接起來,這構成通過輕客戶端使用執行層數據的基礎,但還有很多實操問題有待解決。
我們很高興能繼續在 Lodestar 的 Eth2 輕客戶端上工作,并將在未來繼續更新我們的工作進度!