一文了解以太坊2.0可執行信標鏈提案

11月27日,以太坊開發者Mikhail Kalinin提出了一種名為「可執行信標鏈」的Eth1-Eth2過渡提案,據悉,該提案的最初想法來自以太坊聯合創始人Vitalik Buterin,其旨在將eth1數據(交易、狀態根等)嵌入到信標區塊中,并強制信標鏈提議者生成可執行的eth1數據來消除復雜性。

以下是該提案的具體內容:

特別感謝Vitalik Buterin的創意,@djrtwo、 @zilm以及其他人的評論和有用的貢獻,

最近提出的以rollup為中心的路線圖,提出數據分片作為以太坊2.0中執行的主要擴容因子,允許在單個執行分片上進行擴展,并簡化了總體設計,

Eth1 分片設計假設通過信標鏈與數據分片進行通信。如果具有多個執行分片的第二階段(Phase 2)在以后推出,那么這種方法將是有意義的。由于當前主要集中在以rollup為中心的路線圖上,將以太坊1.0放在一個專用的分片上(也就是說,獨立于信標鏈)給共識層帶來了不必要的復雜性,并增加了在分片上發布數據以及在Eth1 中訪問它們之間的延遲,

我們建議通過將eth1數據(交易、狀態根等)嵌入到信標區塊中,并強制信標鏈提議者生成可執行的eth1數據來消除這種復雜性。這會把eth1執行和有效性作為共識的一等公民,

提案概述

  1. Eth1引擎由系統中的每個驗證者負責維護,
  2. 當驗證者打算提出一個信標區塊時,它會要求eth1引擎創建eth1數據。然后,Eth1數據會被嵌入正在生成的信標區塊體當中,
  3. 如果eth1數據無效,它也會使得承載它的信標區塊失效。

Eth1引擎修改

根據之前的方案,Eth1分片中樞、Eth1引擎以及eth2客戶端是松散結合并通過RPC協議進行通信的(請檢查Eth1+eth2客戶端關系以了解更多詳細資訊),Eth1引擎繼續維護交易池和需要自己網路堆棧的狀態下載器,它還應該保存eth1區塊的存儲,

當前的提案刪除了eht1區塊的概念,eth1引擎有兩種潛在的方法來處理這種變化:

  1. 由信標區塊攜帶的eth1數據合成生成eth1區塊;
  2. 修改引擎,使交易處理不需要eth1區塊,而是使用eth1數據;

前者看起來比后者要更容易實現,它允許更快地將eth1客戶端轉換為eth1引擎,并且已經被eth1分片poc證明,我們使用術語「可執行數據」來表示包括eth1狀態根、交易列表(包括收據根和bloom過濾器)、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分片的職責類似。主要的觀察項有:

  1. 交易執行,eth2客戶端向eth1引擎發送可執行數據。eth1引擎通過處理數據更新其內部內部狀態,如果共識檢查通過,則返回true,否則返回false,高級用例,比如即時存款處理,也可能需要結果中的完整交易憑證。
  2. 交易池維護,Eth1引擎使用ETH網路協議來廣播和跟蹤網路中的交易。等待中的交易保存在mempool中,用于創建新的可執行數據,
  3. 可執行數據創建,Eth2客戶端發送先前的區塊哈希以及eth1狀態根、coinbase、時間戳以及創建可執行數據所需的所有其他資訊(交易列表除外),Eth1引擎返回ExcecutableData的實例,
  4. 狀態管理,Eth1引擎維護狀態存儲以能夠運行Eth1狀態執行函數。4、1 它涉及到最終觸發的狀態trie修剪機制,需要基于信標區塊鏈的狀態trie版本控制;注意:長時間沒有最終結果,會導致存儲中出現大量垃圾,因此會消耗額外的磁盤空間。 4、2 當無狀態執行和“區塊創建”就緒時,eth1引擎可選擇作為純狀態轉換功能運行,它可以禁用狀態存儲,從而減少對磁盤空間的需求。
  5. JSON-RPC支持,為了便于使用及采用,保留對以太坊JSON-RPC的支持非常重要,這一責任將由eth2客戶端和eth1引擎分擔,因為eth1引擎可能會失去獨立處理JSON-RPC端點子集的能力,例如基于區塊號和哈希的調用,這種分離將在以后解決,

信標區塊處理

ExecutableData結構替換信標區塊體中的Eth1Data,此外,信標鏈和eth1的同步處理可實現即時存入,因此,可以從信標區塊主體移除deposit,

更新的信標區塊體(block body):

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完成后處理可執行數據是合理的,因為在許多地方,操作處理可能會使整個區塊失效,不過,這種方法可能是次優的,這為客戶端優化留下了空間,

在EVM中訪問信標狀態

我們更改用于返回eth1區塊哈希的BLOCKHASH操作碼的語義,現在,它返回的是信標區塊根,這允許檢查從256個slot開始直到前一個slot的信標狀態或區塊中包含的那些數據的證明,

異步狀態讀取有一個主要缺點, 客戶端必須要等待一個區塊,才能創建帶有鏈接到該區塊的證明或它產生的狀態根的交易, 簡而言之,異步狀態訪問至少要延遲一個slot的時間。

直接狀態訪問

假設eth1引擎可以訪問表示整個信標狀態的merkle樹,然后,可以使用操作碼READBEACONSTATEDATA(gindex) 來提供EVM功能,以提供對任何信標狀態的直接訪問。此操作碼具有幾個不錯的屬性,首先,這種讀取的復雜性取決于gindex值,并且易于計算,因此可以輕松推斷出gas價格。其次,返回數據的大小為32字節,這完全適合EVM。

有了這個操作碼,人們可以創建一個更高級別的信標狀態訪問器庫,從而為智能合約提供便捷的API,例如:

v = create_validator_accessor(index) # creates an accessor v.get_balance() # returns balance of the validator v.is_slashed() # returns the value of slashed flag 該模型消除了狀態訪問延遲,因此,通過對信標鏈操作和eth1執行適當的排序,可以在slot N中訪問到slot N-1 分片數據的交聯(crosslink),從而允許rollup以最快的方式證明數據包含在內,而且,這種方法還降低了信標狀態讀取的數據及計算復雜性,

注意:可能值得一開始就使READBEACONSTATEDATA操作碼的語義獨立于特定的承諾方案(即merkle樹),以便于輕松升級,

直接訪問的成本增加了eth1引擎的復雜性,讀取信標狀態的能力可以通過不同的方式實現:

  1. 傳遞狀態以及可執行數據,這種方法的主要問題在于處理大的狀態副本,如果將直接訪問限制為狀態數據的一個子集,而該狀態數據的子集需要將一小部分狀態傳遞給執行,那么它可能會起作用。
  2. 雙工通信信道,有了一個雙工通道,eth1引擎將能夠向信標節點請求EVM同步請求的狀態片段,將能夠同步向信標節點詢問EVM請求的狀態。 根據通道的設置方式,延遲可能會成為執行具有信標狀態讀取的交易的瓶頸,
  3. 嵌入式eth1引擎,如果eth1引擎被嵌入到信標節點中(例如,作為一個共享庫),它可以通過該節點提供的主機功能從同一內存空間讀取狀態,

分析

1、網路帶寬目前的提案通過可執行數據的大小來擴大信標區塊。不過,由于該提案允許使用高級存入方案,因此有可能刪除Deposit操作,根據區塊利用率,以及平均eth1區塊大小,預期的增長在10%到20%之間,這對網路接口要求的影響很小,

值得注意的是,如果rollup使用CALLDATA,那么eth1區塊的大小在最壞的情況下可能會增長到200kb(gas限制為1200萬),從而使可執行信標區塊大小在300kb左右,增加了60%。

2、區塊處理時間平均處理時間如下:

  1. 信標區塊 12 ms
  2. Epoch 64 ms
  3. 以太坊主網區塊 200 ms

很難推斷出信標鏈的處理時間,尤其是在驗證器集和交聯(crosslink )處理相對較大的情況下(因為分片已推出)。也許在某個時候,epoch處理將與eth1執行幾乎同時進行,減少epoch邊界處處理時間的潛在方法,是在epoch的最后一個區塊及時到達的情況下,不必等待下一個slot的開始而提前處理epoch。異步狀態訪問模型允許進行另一種優化。在這種情況下,process_executable_data可以與主process_block甚至process_epoch有效負載并行運行,

改善這項設計

有人可能會說,當前的提案會把執行模型設置為一成不變的,并降低了在需要時引入更多可執行分片的能力。

另一方面,一些可執行分片引入了諸如跨分片通信、共享帳戶空間等問題,而這些問題與執行模型的預期轉變同樣重要且難以解決。

對于該提案,Vitalik Buterin評論稱:

0 条回复 A文章作者 M管理員
    暫無討論,說說你的看法吧