可執行信標鏈

摘要:除可執行分片之外,可執行信標鏈作為替代的 eth2 執行模型,通過在信標鏈上添加單個執行線程的支持來實現

Vitalik 此前發布的文章《以 rollup 為中心的路線圖》中提到,數據分片作為 eth2 執行中的主要擴容因素,允許在單個執行分片上進行擴容,并簡化了總體設計。

Eth1 分片設計基于其通過信標鏈與數據分片通信。如果階段 2 的多執行分片功能將在之后推出,那么這個方法就有意義了。有了以 rollup 為中心的路線圖,將 Eth1 放在專門的分片上 (即獨立于信標鏈、且頻繁與信標鏈交互) 會給共識層帶來不必要的復雜性,并增加在分片上發布數據和在 eth1 中訪問數據之間的延遲。

我們提議將 eth1 數據 (交易、狀態根等) 嵌入到信標區塊中,并且要求信標鏈區塊提議者生成可執行的 eth1 數據,以消除這種復雜性。也就是說將 eth1 執行和有效性作為共識核心的一等公民。

提案概覽

Eth1-引擎由系統中的驗證者維持。

當驗證者打算提議一個信標區塊時,他會通過 eth1-引擎創建 eth1 數據。然后 eth1 數據將被嵌入到其提議的信標區塊中。

如果 eth1 數據無效,其所在的信標區塊也同樣無效。

Eth1 引擎的修改

根據前面的介紹,eth1 分片為中心的設計中,eth1-引擎和 eth2-客戶端是松散耦合的,并通過 RPC 協議實現通信 (查看文章 eth1+eth2 客戶端關系 以了解更多信息)。eth1-引擎不斷維護著其交易池和狀態下載器,這需要它自己的網絡堆棧。它還應該存儲 eth1 區塊。

當前的提案取消了 eth1 區塊的概念,eth1-引擎有兩種可能的方式來處理這一變化:

通過合成的方式,從信標鏈區塊的 eth1 數據中創建 eth1 區塊

修改引擎:交易處理過程不a需要使用 eth1 區塊,而是使用 eth1 數據

  • 信標區塊根可用于保存當前狀態管理所需要的鏈的概念

兩者相比,后者為比較長期的選項。它允許 eth1 客戶端更快地轉換為 eth1-引擎,且 eth1 分片概念證明 (PoC) 已經證明了這一點。

我們使用術語“可執行數據” (executable data) 來表示包含 eth1 狀態根、交易清單 (包括收據根“receipts root“和 bloom filter)、coinbase、時間戳、區塊哈希以及 eth1 狀態遷移函數所需要的所有其他數據位。可執行數據在 eth2 規范中表示如下:

class?ExecutableData(Container):????coinbase:?bytes20??#?Eth1?address?that?collects?txs?fees????state_root:?bytes32????gas_limit:?uint64????gas_used:?uint64????transactions:?[Transaction,?MAX_TRANSACTIONS]????receipts_root:?bytes32????logs_bloom:?ByteList[LOGS_BLOOM_SIZE]

Eth1-引擎的職責清單與此前 eth1 分片的職責類似。主要有:

交易執行。Eth2-客戶端向 eth1-引擎發送一筆可執行數據。Eth1-引擎通過處理該數據來更新其內部狀態,并且如果通過了共識檢查則返回 true ,否則返回false。諸如即時存款處理之類的高級用例也可能要求結果中包含完整的交易收據。

交易池維護。Eth1-引擎使用 ETH 網絡協議來廣播信息并跟蹤網絡上的交易。等待被打包的交易 (pending transactions) 保存在交易池中,然后用于創建新的可執行數據。

可執行數據創建。Eth2-客戶端發送之前的區塊哈希、eth1 狀態根、coinbase、時間戳和創建可執行數據的所有其他信息 (交易清單的一部分)。Eth1-引擎返回一個 ExcecutableData 實例。

狀態管理

Eth1-引擎維護狀態存儲以便能夠運行 eth1 狀態執行函數。

  • 它涉及在最終確定性上觸發的狀態樹修剪機制 (pruning mechanism),該機制要求基于信標區塊鏈的狀態樹版本控制。

注意:長期無區塊敲定會造成大量垃圾數據的堆積,從而消耗額外的磁盤空間。

當無狀態執行和”區塊創建“完成時,eth1 引擎可以選擇作為純狀態遷移函數運行,并在此基礎上承擔一些責任,如,可以禁用狀態存儲,從而減少使用磁盤空間的需求。

JSON-RPC 支持。為了可用性和應用性,保留以太坊 JSON-RPC 的支持十分重要。該責任將由 eth2-客戶端和 eth1-引擎共同承擔,因為 eth1-引擎可能失去了單獨處理 JSON-RPC 終端子集的能力,如那些基于區塊號和哈希的調用。這種分離將在之后解決。

信標區塊處理

可執行數據 ExecutableData 結構代替了信標區塊體中的 Eth1Data 。此外,信標鏈和 eth1 的同步處理允許即時存款。因此,存款可以從信標區塊體中移除。

以下是更新了的信標區塊體:

class?ExecutableBeaconBlockBody(Container):????randao_reveal:?BLSSignature????executable_data:?ExecutableData??#?Eth1?executable?data????graffiti:?Bytes32??#?Arbitrary?data????#?Operations????proposer_slashings:?List[ProposerSlashing,?MAX_PROPOSER_SLASHINGS]????attester_slashings:?List[AttesterSlashing,?MAX_ATTESTER_SLASHINGS]????attestations:?List[Attestation,?MAX_ATTESTATIONS]????voluntary_exits:?List[SignedVoluntaryExit,?MAX_VOLUNTARY_EXITS]

我們修改了 ?process_block 函數:

def?process_block(state:?BeaconState,?block:?BeaconBlock)?->?None:????process_block_header(state,?block)????process_randao(state,?block.body)????#?process_eth1_data(state,?block.body)?used?to?be?here????process_operations(state,?block.body)????process_executable_data(state,?block.body)

在 process_operations 完成之后處理可執行數據是合理的,因為在很多情況下,operation processing 可能會使整個區塊無效。雖然,這種方法可能不是最優的,無法讓客戶端優化達到最優效果。

訪問 EVM 的信標狀態

我們更改了 BLOCKHASH 操作碼 (此前用于返回 eth1 區塊哈希) 的語義,現在用來返回信標區塊根。這允許驗證被打包進信標狀態或區塊的數據 (包括從前 256 個 slot 到最近一個 slot 的數據)。

異步狀態讀取有一個主要的缺點。客戶端必須要等待一個區塊產生,才可以使用鏈接到該區塊的證明或使用該區塊的狀態根創建一個事務。簡單地說,異步狀態訪問至少要延遲一個 slot。

直接狀態訪問

假設 eth1-引擎可以訪問代表整個信標狀態的默克爾樹。那么 EVM 可能可以憑借 READBEACONSTATEDATA(gindex) 操作碼,以提供直接訪問信標狀態任何部分的功能。這個操作碼有幾個良好的屬性。首先,這種讀取復雜性取決于 gindex 值并且易于計算,因此可以輕松地計算 gas 費。第二,返回數據的容量為 32 字節,完全適合 EVM 的 32 字節字。

使用此操作碼,就可以創建更高級別的信標狀態訪問庫,從而為智能合約提供便捷的 API。如:

v?=?create_validator_accessor(index)?#?creates?an?accessorv.get_balance()?#?returns?balance?of?the?validatorv.is_slashed()??#?returns?the?value?of?slashed?flag

該模型消除了狀態訪問延遲。因此,通過對信標鏈操作和 eth1 執行進行適當的排序 (eth1 執行在后),并且在 slot N上可以訪問 slot N-1 分片數據的交聯,可以允許 rollup 以最快的方式對數據打包進行證明。

此外,使用這個方法不需要將證明廣播至網絡并進一步由合約驗證,從而減少了信標狀態讀取在數據和計算方面的復雜性。

注意:在一開始使 READBEACONSTATEDATA 操作碼的語義獨立于特定的承諾方案 (即默克爾樹) 是有意義的,這有益于更輕松地實現升級。

直接訪問的成本提高了 eth1-引擎的復雜性。讀取信標狀態可以通過不同的方式實現:

將可執行數據和狀態一起傳遞。該方法的主要問題是處理大容量的狀態副本。如果將直接訪問限制為狀態數據的一個子集,而該狀態數據的子集需要將一小部分狀態傳遞給執行,那么它可能會起作用。

雙工通信通道。有了雙工通道,eth1-引擎將能夠同步向信標節點詢問 EVM 請求的狀態。根據通道設置的方式,延遲可能會成為執行那些具有信標狀態讀取的交易的瓶頸。

嵌入式的 eth1-引擎。如果將 eth1-引擎嵌入到信標節點中,它可以通過節點提供的托管功能從同一個內存空間讀取狀態。

分析

網絡帶寬

當前提案通過可執行數據的容量來擴大信標區塊。不過,由于該提案允許使用更高級的存款方案,因此很有可能刪除 Deposit 操作。

取決于區塊利用率,根據 eth1 平均區塊容量 (這略微影響網絡接口的需求),預期的增長在 10% 到 20%之間。

值得注意的是,如果 CALLDATA 由 rollup 利用,那么在最壞的情況下,eth1 區塊容量可能會增長到 200kb (gas limit 為 1200 萬時),使得可執行信標區塊容量增長 60% ,容量變為 300kb 。

區塊處理時間

平均處理時間:

Toledo 上的 Lighthouse 有 1.6 萬驗證者,主網上的 Go-ethereum 的 gas limit 為 1200 萬。

很難推斷出信標鏈的處理時間,尤其是,特別是在驗證者子集相對較大以及需要處理交聯的情況下 (如果分片上線)。也許在某個時候,epoch 處理將與 eth1 執行幾乎同時進行。

減少時段邊界 (epoch boundary) 處理時間的方法是,提前處理 epoch,而不是等到下一個 slot 的開始,以防最近一個 epoch 的最后一個區塊準時產生。

異步狀態訪問模型允許另一種優化方式。在這種情況下,process_executable_data 可能與主要的 process_block ,甚至 process_epoch 的有效負載并行運行。

固化該設計

有人可能會說,當前提案將執行模型固定下來,并削弱了引進更多可執行分片的能力 (一旦我們需要它們)。

另一方面,一些可執行分片會帶來諸如跨分片通信、共享賬戶空間等問題。還有一些其他的問題,而這些問題與執行模型的預期轉變同樣重要且難以解決。

原文鏈接:https://ethresear.ch/t/executable-beacon-chain/8271

ECN的翻譯工作旨在為中國以太坊社區傳遞優質資訊和學習資源,文章版權歸原作者所有,轉載須注明原文出處以及ETH中文站。若需長期轉載,請聯系eth@ecn.co進行授權

來源 |?ethresear.ch

作者 | Mikhail Kalinin

特別感謝最初提出該想法的 Vitalik Buterin @vbuterin,感謝 Danny Ryan @djrtwo、@zilm 等給本文提供的寶貴意見。

本文來源: ETH中文站 文章作者: Mikhail Kalinin 我要糾錯
聲明:本文由入駐金色財經的作者撰寫,觀點僅代表作者本人,絕不代表金色財經贊同其觀點或證實其描述。
提示:投資有風險,入市須謹慎。本資訊不作為投資理財建議。

金色財經 > 區塊鏈 > 可執行信標鏈

球神直播