本文將總結現有圍繞着以太坊 2.0 Phase 2 的研究成果,重點關注中繼網絡以及手續費機制。每種提案都有其不同的權衡取捨,而且被不同的平臺所採用,因此做一次合理且全面的彙總,能讓新入門的研究者更快上手。

背景

在深入討論中繼網絡之前,我們先回顧一下以太坊的主要瓶頸之一(or 沒有之一):狀態

在以太坊中,狀態指的是賬戶餘額、合約代碼、合約存儲內容的集合(在比特幣中,狀態指的是 UTXO 的集合)。不論什麼時候執行交易,都要對狀態(約 45 GB 的不可壓縮數據)進行讀寫操作。早些時候,人們曾對以太坊計算模型原生的不可擴展性提出過質疑;但時至今日,反而是狀態的讀寫成爲執行交易的成本瓶頸,磁盤的 I/O 性能成了運行以太坊全節點的制約因素。

請注意,爲了能夠按照_富狀態範式 _(stateful paradigm)執行任何的交易,全節點必須保證所有狀態始終放在可訪問的位置(比如內存、交換空間)。如果應用在單一區塊鏈的場景,或許這還能勉強接受,但是一旦面臨分片、面臨分片上委員會的重組,這種要求是非常不合理的。設想一下,每當驗證者被指定到一條分片鏈,他就得同步該分片上的所有狀態;則這種系統就等價於單一區塊鏈,只是此時的區塊大小等於_分片區塊大小*分片數量 _。

這就是爲什麼我們需要無狀態客戶端。

分片及無狀態客戶端

在無狀態客戶端範式中(原名“storageless”),驗證者只需要存儲一個經過壓縮的區塊鏈狀態表(通常稱之爲_累加器_,accumulator),大幅降低了執行交易的負擔。一般來說累加器的大小是常量(例如:狀態的 Merkle 樹根值),不過也有可能是對數大小。

無狀態客戶端的本質是,每筆交易都附帶當前累加器的_見證數據(witness)_,見證數據中包含了所有執行該交易所需的信息。在以太坊中,使用稀疏 Merkle 樹( SMT,Sparse Merkle Tree )作爲累加器,一筆交易所涉及的所有狀態元素都可以被包含進默克爾樹分支中。

在其他應用上,無狀態客戶端可以縮短以太坊節點的初次同步時間,這就是 Beam Sync 的原理。

_ 備註:_ 有一些密碼學累加器(如 RSA 累加器)比 Merkle 累加器性能更好,但是這種累加器需要受信任初始化,或是使用未驗證的前沿密碼技術,所以安全部署到生產系統上還需要點時間。

但無狀態客戶端也有自己的挑戰:一旦使用 Merkle 累加器,每當結束一次完整的執行後,見證就過期了。如果模型要求每筆交易都包含單獨的見證,然後順序執行這些交易,則排在後頭的交易的見證數據就會過期,必須能夠隨着前面每一筆交易結束而更新自己的見證。幸虧更新這些 Merkle 累加器的見證涉及零哈希開銷方法——如果見證數據可以作爲附加物添加到“一大包”交易上的話,就不需要更新屬於每筆交易的單獨見證,或是說可以整合爲多重證明(multiproof)。

假如所有用戶都維護着全節點,並實時更新見證的狀態,那麼無狀態客戶端系統是能夠馬上被採用的。可惜在分片環境下,這意味着要求所有用戶維護自己所在分片上的所有狀態;這樣做不僅不切實際,而且就如我們上面提到的,這就相當於只是建立一條區塊體量更大的單一區塊鏈。

爲了解決問題,這裏引入了_中繼者(也稱爲狀態提供者)_ 的概念。中繼者負責提供用戶所需的見證,並以此向用戶收取服務費。和用戶不一樣,中繼者可以將服務聚焦在單一分片上;但中繼者無法預知用戶什麼時候需要狀態,因此必須保證見證的及時更新,也就是實時存儲狀態(所以被稱爲狀態提供者),以供用戶獲取。

中繼者的引入也會引來一大堆複雜的問題,也是以太坊 2.0 的全面部署所面臨的最重要的開放問題之一。第一點,如果不能很好地平衡中繼者和區塊提議者(i.e. 驗證者)所得到的利益,驗證者就會被激勵成爲中繼者,則相關服務的獲取成本可能會讓一般使用者望而卻步。第二點,要讓中繼者能夠從用戶和驗證者處收取費用(即:手續費機制(fee market)),同時不至於引入太大的開銷,顯然不是件簡單的事;換言之,驗證無狀態交易很容易,但是提供必要的見證很困難。

中繼網路及費用市場提案

**
**

以太坊 2.0 Phase 2 的設計空間很大,也出現了很多對執行模式的提議。 每種提議都各自表述瞭如何通過付費,結合中繼網路的機制,將交易更好地在用戶和區塊提議者之間進行傳遞。本章節會盡可能簡潔而全面地總結不同的協議,並着重分析它們在中繼網路及手續費機制上的異同。

校勘者(Collator)提案(已棄用)

這是 Phase 2 階段的早期提議,將分片鏈的建塊分爲三個部分:提議者(proposer)、校勘者(collator)、執行者(executor)。一些提議者負責收集交易,打包成區塊(也叫 collation),一些提議者負責提交 collation 到鏈上(變成區塊),最終,執行者根據被提議的 collation 給出一個新的狀態根。

該提案從未得到完全的研究;因此,也沒有對手續費支付機制的研究。除去別的因素,這項提案被棄用還因爲,它的激勵機制鼓勵用戶同時成爲提議者、校勘者、執行者,以得到利益最大化。

Phase 1 and Done

Casey Detrio 在其開創先河的博文《Phase 1 and Done:數據可用性引擎——以太坊 2.0》中強調:在 phase 1 階段,可以添加儘可能少的執行分片來橋接數據,而不需要做狀態分片。在此方案中,分片可以做到兩件事:1)對數據進行認證(i.e. 將一系列交易插入如 Merkle 樹等受認可的數據結構中);2)執行簡單的無狀態操作,例如驗證受認可數據的零知識證明。

可以通過上傳_合約_到信標鏈(beacon chain)來定義一個數據塊處理程序(合約未來會轉爲“預編譯(precompiles)”,然後成爲“執行環境(execution environment)”),合約的形式可能是客戶端可解析的字節碼,具體怎麼選擇要從視整個協議的內容而定。

“Phase 1 and Done”迴避了大部分關於費用支付機制的問題,因爲支付機制問題在以往的提案中都存在,而且也將繼續存在,所以該提案轉而試圖定義爲使 Eth2.0 長期可用而需作出的最小變更,並且希望能儘快找出答案。還有個建議是通過以太坊 1.x 上的合約來支付費用(區塊提議者在以太坊 2.0 上提供經過處理的可用數據塊,然後我們通過一個 rollup 合約在以太坊 1.x 上付費給提議者);不過這個可行性令人懷疑,因爲這會使得以太坊 2.0 的可用性強烈依賴以太坊 1.x 。

Phase 2 Proposal 1

緊接着 Detrio 的研究,Vitalik Buterin 對 Phase 2 階段提出了具體的新提案:phase 2 proposal 1。在此提案中,_ 執行腳本 _(execution script,最初叫做“信標鏈合約”)存放在信標鏈上,以太幣可以被存入執行腳本(爲了支付費用),而且絕對不會脫離信標鏈;每個分片的狀態和執行都是完全獨立的。

請注意,它們的名字可能會有誤導性——執行腳本乃是定義執行交易的_虛擬機__ 的規則 _,而非我們今天在以太坊看到的智能合約。執行腳本必須以客戶端可解析、計量、編碼的方式(例如 ewasm 代碼)定義數據模型及操作碼。

爲了支付費用,每個執行腳本本質上都是個 layer-2 系統,驗證者無法 “得知” 其內部的付費機制。這不是設計缺陷,而是故意爲之的;如果要求分片驗證者去解析和計算不同的費用機制(可能涉及不同貨幣),這無疑會導致實施難度及經濟機制複雜性大幅增加,引入更多可能被攻擊的弱點,甚至變得完全不可用。很大程度上,反對“經濟抽象化”的理由也可以用於反對這種依腳本定義手續費種類的執行模式(譯者注:“經濟抽象化” 也被稱爲 “費用泛化”,在協議層支持用戶及驗證者自定義用何種代幣來支付手續費。有人認爲這會使原生代幣失去價值根基)。

因爲驗證者無法直接從執行腳本中收取費用,他們必須通過其他方式拿到服務費。這裏通過一個特殊的(即 enshrined 類型的)執行腳本完成;任何人都可以發送包含以下邏輯的交易:“如果在某分片中的某時隙打包了這個使用了某執行腳本的數據,則我要向記錄這個數據塊的人支付這筆費用”;這裏的操作都是由中繼者(也被稱爲操作者)完成:中繼者負責收集用戶的交易,根據_非-enshrined_ 普通執行腳本指定的規則收取費用,然後再向分片中的區塊提議者(建塊人)根據 enshrined 執行腳本支付打包交易的費用。

William Villanueva 的博客 A Journey Through Phase 2 of Ethereum 2.0 對到這裏爲止的 Phase 2 提案給出了完美的總結。

Phase 2 Proposal 2

受到 Detrio 前期工作的啓發,V 神再次提出 Phase 2 Proposal 2,針對對提案 1 進行簡化,移除了分片鏈上狀態,改用信標鏈追蹤隨分片各異、隨執行環境(Execution Environment ,EE,原先叫執行腳本)各異的狀態根。

這種設計的好處是,不同的執行環境能選擇自己的累加器(例如:稀疏 Merkle 樹、紅黑樹、密碼學累加器,等等),而不像之前的提案,必須尊奉(enshrine)一種累加器形式。

現在,一般交易流程如下:用戶創建交易並將其發送給中繼者,中繼者隨用戶需要添加見證(如果使用 Merkle 累加器,則以 Merkle 分支的形式添加)以獲得用戶支付的費用。接着中繼者將多個交易進行打包,一起發送給區塊提議者,並通過協議內置的機制向他們支付費用,讓提議者將該批交易打包到下一個(分片)區塊中。與提案 1 一樣,這裏的“協議內置的機制”是指一個更高等的 EE (an enshrined EE),所有驗證者都能識別的 EE。

對於驗證者來說,此方案一定程度上減輕了他們的負擔,但是由於以上操作仍需要一些分片狀態,而該提案又沒有設計用戶與中繼者的協議內費用支付機制,所以還沒有解決中繼網絡的全部問題。首先,使用協議外手段進行支付會削弱用戶的隱私保護;其次,我們不清楚要如何創建一個完全脫鏈的系統(不依賴於另一個外部的區塊鏈)來保證用戶和中繼者一手交錢一手交貨(即交易原子性);第三,使用協議外手段進行支付的潛在高風險,以及成爲中繼者的高算力要求(因爲中繼者如果想服務某個 EE 或分片,就必須存有他們的所有狀態,才能能夠生成見證),可能會導致中心化問題——在最糟的情況下,用戶和以太坊 2.0 網絡之間可能只剩下幾個 “把關的” 中繼者。

迴歸交易緩存池模式

Vitalik 在新的提案中提到,讓中繼者有條件地向區塊提議者付費,需要繁重的雙重承諾方法來保證支付的原子性,因此,不如用一個手續費市場 EE 來解決所有問題。在該提案中,_EE 將具有自己的餘額 _。EE 執行一批交易後會輸出一個收據,負責支付費用的高等 EE (enshrined EE)會根據這個數據,將以太幣從_該 EE 賬戶_轉給區塊提議者。因此,支付費用的高等 EE 能夠“回看”之前的收據並處理轉賬。而充值 EE 賬戶可能就是中繼者(或是其他利益相關方)的責任了。

這個提案的好處是,不需要通過什麼複雜的方法來協調中繼者和區塊提議者之間的支付往來,但沒有指明用戶該怎麼和中繼者進行交互,只是建議使用支付通道。

基於最初的提案,Villanueva 建議迴歸交易緩存池模式。在這種情況下,中繼者只需作爲_狀態提供者 ,僅提供見證而不需要打包交易;區塊提議者(或更普適地說,分片驗證者)維護一個緩存池, 合併_所需的見證數據來打包交易。有鑑於每個 EE 可以選擇不同的累加器,因此 EE 必須事先聲明一個固定的合併見證的方法,讓區塊提議者可以整合兩個及以上的見證,例如將多個 Merkle 分支整合成一個 Merkle 多重證明。

因爲狀態提供者只需要提供見證(通常以 Merkle 分支的形式),目前已有的很多角色都可以勝任這個任務:如,_ 輕客戶端服務器 _。可以使用更方便的工具和更低的成本來激勵更多輕客戶端服務器提供見證,這對於高可靠性大有幫助。不過對於用戶來說,不得不使用高摩擦力的支付渠道付費給狀態提供者,仍然很令人頭疼。

Phase 2 另類架構

就在不久之前,V 神提出了 Phase 2 另類架構,打算完全去掉分片的狀態。關鍵之處在於,在信標鏈中加入了完整的、有狀態的、可表達的狀態轉換引擎(例如 EVM)。這個引擎作爲“調度員”,持續追蹤 EE 的狀態根。調度員設計也讓多分片事務執行成爲可能:按照既定的順序檢查分片和時隙,以確保正確執行了跨分片到同一個 EE 的多個交易(通過對執行前狀態和執行後狀態的狀態根進行排列、忽略掉任何無效或亂序的分片區塊)。

這個提案的費用支付機制與前一個提案相比沒有什麼變化,不過因爲調度員具有足夠的能力來處理 EE 餘額管理和收據消費,因此不再需要特定的支付費用 EE 存在。

分片鏈簡化提案

在 DevCon 5 大會上,V 神發佈了關於以太坊 2.0 架構的重大重構消息,這是啓發自 Near 協議的分片塊——夜影(Nightshade)的設計。在新的提案中,不要求每個分片鏈都運行相互獨立的分叉選擇規則,而是交錯着以更快的速度生成區塊和交聯(crosslink);分片中的區塊緊隨着信標鏈的區塊一起生成,而且所每個分片都與每個信標鏈區塊交叉連接(在正常情況下)。該體系結構增加了分片交叉鏈接的數量,爲應對交聯數量的增加,分片的數量從 1024 減少到 64 個;與此同時每個分片的吞吐量也有所增加,使整個系統的吞吐量保持原來水平。

上述思維模式的根本變化,使得費用市場變得更更加簡單:由於分片數量大大減少,跨分片通信更爲簡化,用戶大可直接在每一個分片上都存有 Ether,直接給區塊提議者支付(又可以通過前面提到的通過 EE 輸出收據的提案)。

消弭了大半的費用市場問題,現在只剩下中繼網絡(_ 狀態提供者 _)的挑戰還依然存在。

提醒

以上關於以太坊 2.0 的中繼網路 / 費用市場的討論,並非完全詳盡的:

*對於用戶、中繼者、區塊提議者來說,大家都需要適當的付費激勵及服務。用戶可以通過付費得到所需的見證,中繼者收取費用提供見證,而區塊提議者收費打包交易。關於中繼者向區塊提議者付費(或間接的通過 EE 付費)的方式,可以在協議內聲明;但是用戶希望一邊要取得見證數據,一邊要保證交易被打包,其付費的方式就沒有那麼單純了。
*對於用戶來說,好的支付方法應該是低阻力的,方便其轉換不同的中繼者。但是依賴外部區塊鏈的支付通道,存在預先支付押金及對外部鏈活性(liveness)的要求;理想的情況還是能在協議內解決用戶支付的問題。
*續上一點,應該讓中繼者難以審查用戶。可惜的是,見證取自於內嵌的訪問列表,因此沒有辦法阻止中繼者設置黑名單。
*驗證者不必“理解”每個 EE 內部的支付方式,因爲這會極爲複雜,對部署及建立有效的市場帶來巨大的阻力。
*用戶不是非維護全節點不可(例如,不需要爲了維護自己所需的見證而去維護)。我們希望這個提案對於輕客戶端非常友好。
*最後一點同樣很關鍵:抵禦 DoS 攻擊非常重要。按照見證的合併 / 刷新方式,很有可能會有向驗證者發起的 DoS 攻擊。務必要當心有人利用這種漏洞。

總結

回顧過去的一整年,圍繞着中繼網絡及費用市場的研究進行了多次迭代,致力於給用戶和輕節點帶來良好的使用體驗的同時,降低驗證者負擔,儘可能保證免准入性。展望未來,我們希望看到更多關於 Phase 2 的提案,進一步改進和完善以太坊 2.0 的各個層面!

    (完)

    (文內提供了許多超鏈接,請點擊閱讀原文到 EthFans 網站上獲取)

 ***

  **原文鏈接 :**

     https://medium.com/@adlerjohn/relay-networks-and-fee-markets-in-eth-2-0-878e576f980b

  **作者 :** John Adler

  **翻譯 & 校對 :**IAN LIU & 阿劍

 ***

  **你可能還喜歡:**

   **乾貨 | 以太坊 Phase 2 進展(2019-12)  
     乾貨 | Eth2 分片鏈簡化提案  
  ****引介 | 信標鏈之外 : Eth2 中的執行環境**