以太坊的發展路線不應該盲目追求可擴展性,歸根結底,只有契合用戶需要的性能提升纔是真正有意義。

原文標題:《觀點 | 以太坊的路線圖應該改變嗎?》
撰文:阿劍

自 《A Rollup-centric ethereum roadmap》(中文譯本)一文發表以來,整個社區都對以太坊(尤其是以太坊 2.0)的路線圖產生了疑問。

2020 年 11 月 18 日,在以太坊基金會的 Eth2.0 研究團隊的第五次 AMA 活動(中文節選譯本)中,Vitalik 明白地表示,路線圖已經發生了變化:(1)暫時不再強調 Phase2 的重要性,Phase 1 致力於實現數據分片(shard data),供 Rollup 方式使用;(2)信標鏈將具備執行功能,即 Eth1-Eth2 合併之後,信標鏈區塊將直接包含交易;(3) Phase 0 實現後的三大工作:輕客戶端支持、數據分片、合併,將並行推進,任一模塊只要準備好了就推出。

本文的目的不是爲原來的三階段路線圖辯護。相反,本文是想主張,三階段路線圖虛無縹緲,新路線圖食之無味,沒有一種與 Eth2.0 相關的路線圖值得以太坊放棄當前的運作模式、轉向以 PoS 爲基礎的系統。

在這裏,我會先講解初始的三階段路線圖的論證思路及其技術難點;然後分析新路線圖的可擴展性。最後論證,新路線圖的可擴展性優勢,已經渺小到不足以使以太坊冒險轉入 PoS。

Eth2.0 的三階段路線圖

在過去兩年,廣爲流傳的 Eth2.0 路線圖規劃了三個依次序實現的組件:

  • Phase 0:以 PoS 爲共識機制的信標鏈

  • Phase 1:多條分片鏈

  • Phase 2:爲所有分片增加執行功能

從這一路線圖可以清晰地看出,原來的以太坊 2.0 的目標是打造一個 「分片化執行(sharded execution)」 的系統,意思是:每個分片都有自己的狀態,這些狀態按各分片的狀態轉換規則來變更;變更後的狀態由信標鏈來敲定;由此,以太坊 2.0 就成了一個多個分片可以並行處理交易的系統。這也意味着,以太坊 2.0 是一個 「共識」 和 「交易處理(驗證)」 解耦的系統,被分配到各分片上的驗證者負責驗證交易和狀態的正確性;但這些狀態的敲定則依賴於信標鏈的 epoch 敲定機制,兩個過程並不是完全同步的。

這種 「PoS 信標鏈 + 多分片」 的架構,似乎也非常好地利用了 PoS 算法本身的特點:爲了解決 No-thing-at-stake 問題(PoS 出塊不需要付出計算量,因此有資格出塊的賬戶會嘗試在不同的分叉上同時出塊,使系統分崩離析),以太坊 2.0 所用的 Casper 算法要求用戶先存入一部分押金才能獲得出塊資格,而如果驗證者濫用了出塊資格(比如同時支持兩個分叉),則會被罰沒押金;由此,像 Casper 這樣的算法實際上在區塊鏈上創造了兩種可以相互溝通、但相互獨立變更的狀態:一種是普通用戶的狀態,另一種是驗證者的出塊權重狀態;共識過程以出塊權重狀態爲基礎,達成共識也會更改出塊權重狀態;因此,共識過程先天獨立於用戶交易的驗證,可以解耦;對任意的交易批次及結果狀態而言,共識過程可以被抽象成一種 「終局性敲定機制」,邏輯上,多分片並行執行於是成爲可能。

至於其可擴展性,以太坊分片技術的命名 「二次方分片(Quadratic sharding)」 透露了端倪:假設分片上的交易,其執行復雜性能夠被化約到與區塊頭驗證同樣的難度,則分片化執行的架構,可以使整個系統的處理能力,隨着參與節點處理能力的線性提高而呈平方級提高。通俗來說,如果參與網絡的節點(平均而言)在一段時間內能驗證 4 個區塊頭,這就意味着,在參與一個分片時,節點們可以在同等時間內驗證 4 筆交易,此時系統總處理量是 4 條分片 × 4 筆交易 / 分片 = 16 筆交易;如果節點的處理能力變成了 8 (2 倍),則處理量會變成 64 筆交易(4 倍)。

聽起來很美好,但是,這個「平方級擴展」 的論證中包含了如下假設:

(1)存在一種技術,使得分片交易的驗證,可以簡化到與驗證區塊頭同樣的難度;

(2)不存在跨分片的交易,即各分片內的交易是完全不會相互依賴的。跨分片的交易需要佔用多個分片的處理容量,也要佔據信標鏈的處理容量,會使可擴展性大打折扣。

關於(1),這個假設是有可能得到滿足的,無狀態性(statelessness)就是這樣的一種技術,它的思路是,在傳播交易(或者傳播區塊時),附帶交易所訪問狀態的證明(witness),使得交易的驗證者無需持有交易執行之時的狀態數據,就能驗證交易的有效性。這一點極爲關鍵,如果沒有無狀態性,參與分片驗證的驗證者就必須保存分片的狀態,因爲驗證者會被不斷分配到不同的分片鏈上,那就意味着他們必須保存所有分片的狀態,在實踐中也就意味着他們要不斷下載所有分片的區塊並處理交易,從而使整個系統坍縮爲一個大區塊系統(例:投入能處理 16 筆交易的資源,處理 16 筆交易)。遺憾的是,至今,以太坊 1.0 也沒有研究出足夠輕量的無狀態方法。

關於(2),那就沒有什麼好說的了。如果不能實現跨分片交易,分片化執行的系統就沒什麼意義,因爲各分片各自爲政。必須使得 ETH 有辦法存在於各個分片上,這個系統才能仍然以 ETH 爲主體。而直到今天爲止,還沒有出現一種跨分片交易方案,能夠不增加信標鏈的處理量。道理也很簡單,對於任意 A 分片來說,因爲並行處理,任意 B 分片上正在發生什麼交易,需不需要改寫本分片的狀態,是不可知的,因此必須存在一個通信層,可信地證明 B 分片上發生了一筆試圖改寫 A 分片狀態的交易。而一旦需要讓信標鏈具備處理交易的功能,平方級擴展的效果就會被打破。(順帶說一句,滿足了這一可信通信層的需要的鏈,就變成了事實上的 Layer-1,而其它分片則變成了事實上的 Layer-2,像極了 「Layer-1 + Layer-2」。)

除了存疑的可擴展性,分片化執行還帶來了許多經濟上的有趣問題。例如,如果跨分片交易的處理時間超過一筆分片內交易的處理時間(這是必然的),這就意味着,不同分片上的 ETH 價值也不會相同。就好像美國國內的 1 美元,與美國國外的 1 美元,實際上並不是同一種東西。不論有多少個分片,都至少會有兩種 ETH 價格,一種,是那個金融應用最繁茂的分片(也就是 Eth1 分片)上的 ETH 的價格;另一種是其它分片上的 ETH 的價格;後者必須支付一定的手續費並付出一定的時間,才能換成前者,因此對前者必定有一些折價。同理,即使每個分片上都有 uniswap,不同分片上市場的交易滑點也必定不相同,最終大家都會彙集到一個分片上,因爲大家都在一起的時候,流動性最充沛,資金效率最高。某種程度上,可以認爲跨分片交易的需要是很少的 —— 但這也意味着,其它分片上閒置的交易處理容量,也根本沒有意義。

分片化執行系統的技術難點,此處不再贅述,感興趣者可以自己想想分片化執行系統怎麼支付手續費的問題。但我在這裏想說的是,分片化執行系統的設計理念違背了大家的實際需要,也違背了事物的發展規律。全局狀態(可組合性),並不是一個問題,而正是大家需要的東西;正是因爲以太坊使得所有金融應用都能瞬間組合,創造了一個價值可以零摩擦流通的空間,以太坊纔有了變革世界的潛力;在協議層爲價值流通創造摩擦,是自廢武功。有了一個良好的基礎層時候,應該想辦法維護這個基礎層,剩下的事情讓用戶自己選擇,讓生態自己演化 —— 不要以爲設計能設計出一個生態,過度設計只是給所有人強加成本。

分片化執行(Phase 2)的擱置,側面印證了其中的難度 —— 在可預見的未來,這條道路無法產生令我們滿意的成果。儘管如此,我並不認爲 Eth2.0 的研究員們已經完全放棄了三階段路線圖,Vitalik 也還強調,變更後的路線圖,跟 Phase 2 也是完全兼容的,只是 Phase 2 不再具有優先級。

但是實際上,放棄分片化執行,纔是以太坊應該選擇的道路。

可執行信標鏈路線圖

在以太坊 2.0 的新路線圖中,最令人矚目的一點是:信標鏈區塊將包含合併後的 Eth1 分片的交易,也即信標鏈具備了執行功能。其它分片僅具有保存數據的功能。

實際上,新路線圖中 「數據分片」 的定位是 「供 Rollup 使用的數據可得性(data availability)層」。

沒了執行化分片,平方級擴展就無從談起了。那麼,這種 「PoS Layer-1 + Rollup + Rollup 數據不佔據主鏈區塊空間」 架構的可擴展性如何呢?

要解答這個問題,我們先來看看 Rollup 方案與主鏈的交互模式。

首先,你可以把一個 Rollup 系統理解爲一個無狀態的合約,這個合約的內部狀態(哪個用戶有多少錢),對外是不可見的;但是,該合約內發生的所有交易,其數據會定期公開出來,發佈到主鏈上,使得任一第三方,得到這些數據後,都可以重建出該合約的內部狀態。

使用有效性證明的 Rollup (例如 ZK Rollup)的特點是:該合約每次公開交易數據時,都附帶一個這些交易已被正確執行、因此新的狀態根應是 XXX 的 「計算完整性證明」;如果該證明能通過合約的驗證,則該合約更新狀態根;如果該證明不能通過驗證,則該合約拒絕更新。

使用錯誤性證明的 Rollup (例如 Optimistic Rollup)的方案則相反:任一人每次爲合約公開交易數據時,都必須存入一筆押金,並斷言合約的新狀態根是 YYY;此後一段時間內,任意其他人都能存入押金、發出錯誤性證明來挑戰該斷言;錯誤性證明即證明該批交易有瑕疵,或者交易處理後的新狀態根不是 YYY;如果挑戰成功,則發佈錯誤斷言的人會損失押金;如果一段時間內無人挑戰,則合約更新狀態根爲 YYY。

這兩種方案,都必須在鏈上發佈數據,因此會佔用鏈上空間;而且,鏈上空間的大小,決定了 Rollup 系統在單位時間內的處理量(即 TPS)。想得更深一些,如果這些交易數據,能夠發佈在一個數據量的約束更小的地方,或者說,不去佔用 Layer-1 區塊的空間,則其處理量,能產生倍加的效果。如果這樣的地方有很多,那還可以產生倍乘的效果。

這就是 「數據分片」 及 「以 Rollup 爲中心的路線圖」 的理念:讓 Rollup 方案把交易數據都放到分片區塊中,分片有多少個,處理量就能提升多少倍;當前的以太坊區塊數據量大概是 20~30 KB,這個數據量顯然是安全的,則,如果我們有 64 條分片,我們每 15 秒就能提供 64*30 = 1920 KB = 1.9 MB 的數據量。而且,使用端我提供了這麼大的數據吞吐量,但它不會成爲全節點的負擔,因爲這些數據你想下載就下載,不想下載就可以不下載(也就是 「分片」 的含義),大家你下載一點,我下載一點,節點的負擔還是很輕的 —— 反正,驗證這些 Rollup 合約的狀態,並不要求我擁有該 Rollup 的所有歷史交易數據。以太坊的狀態仍然是安全的。

聽起來很合理,但還是那句話,太樂觀了,太多假設了:

(1)這種 「想下載就下載,不想下載就不下載」 的方法,在 ZK Rollup 上根本行不通:當 ZK Rollup 要更新狀態根時,ZK Rollup 合約更新操作的驗證者(也即 Layer-1 的全節點)在接受證明時也必須獲得與該證明對應的交易數據,否則就無法通過驗證。(不需要提供交易數據,僅驗證證明就推進合約狀態根的方案也有,叫 Validium,那不是 Rollup)。也就是說,如果僅考慮 ZK Rollup,那麼 「數據分片」 的方法,從帶寬上來說,與大區塊沒有任何分別。不管這些數據一開始被髮到了誰手上、存到了哪裏,全節點都要下載它們。

(2)對 Optimistic Rollup 來說,如果你願意採取更樂觀一點的假設,當然可以,你可以平時完全不下載交易數據,僅保留獲得終局性的最新狀態根,僅在發生爭議時,再下載相關的交易數據,從全節點的角度看,並沒有因此喪失對合約狀態的驗證能力;但是從用戶的角度看,事情就完全不同了:你開始不確定自己到底是不是隨時能夠重構自己的狀態,來完成取款。也就是說,用戶將不能確定自己用的到底是 Optimistic Rollup,還是 plasma。本來,Optimistic Rollup 的方案就是保證了所有全節點都有歷史交易的備份,所以用戶可以容易地重建自己的狀態,並提交狀態證明(或斷言)完成取款;但如果這一點保證失去了,你就不確定自己能不能重建狀態了。Optimistic Rollup 的安全性也會受到影響:它的安全假設是,獲得了交易數據的人之中至少有 1 個是遵守協議的;在數據分片模式下,你並不知道,有多少人會去請求這部分交易數據。

總而言之,「數據分片」模式搭配 ZK Rollup 時,在帶寬的意義上,無法提供更大的可擴展性,而與擴大區塊空間的效果相同;在搭配 Optimistic Rollup 時,相對於大區塊,其可擴展性優勢與挑戰發生的頻率成反比;更嚴重的是,它使 Optimistic Rollup 有退化爲 plasma 的風險(從定義上來說,也不存在 Optimistic Rollup 了,應該用另一個名字來指稱這種介於 Optimistic Rollup 和 plasma 之間的東西)。

結論

Rollup 方案其實是從 Layer-2 發展過程中吸取了血淋淋的教訓而飛出來的鳳凰。它最大的特點在於,給用戶的資金安全提供了充分的保護。因爲任意得到了交易數據的人都可以重建狀態,而區塊鏈保證了這些交易數據的永續數據可得性,Rollup 方案得以提供 layer-2 方案中首屈一指的用戶保護。只有這樣的方案,用戶纔敢真的去使用。捨棄了這種好處,按最大化性能的樂觀假設來設計系統,只能設計出用戶不敢去用的東西。

只要你意識到,Rollup 本質上是一種合約的設計模式,「PoS + 數據分片 + Rollup 可以提供更大吞吐量」 的迷思便可一眼洞穿 —— Rollup 不管在哪個共識中,都可以提供同樣的可擴展性,數據分片能提供更多,只是因爲引入了別的安全假設,使 Rollup 犧牲安全性來換取吞吐量而已 —— 問題在於,這樣的合約,比 Rollup 的安全性更弱、可擴展性更強的合約,不是沒出現過,不是在 pow 鏈上就設計不出來,而是設計出來了也沒人用而已。

自 2017 年以來,以太坊社區就爲着實際的需要艱難地探索安全的可擴展性方案。許多人可能都相信過,「PoS + 分片」 能提供強大的可擴展性,但那是 「分片化執行系統」,有自身的一堆問題。眼前的 「可執行信標鏈路線」,也不過是犧牲合約本身的屬性來換吞吐量而已。時至今日,已經找不到證據,證明爲了可擴展性,以太坊應該擁抱 PoS。

歸根結底,只有契合用戶需要的性能提升,纔是真正有意義的性能提升。如果不從用戶的實際需要出發,相反,從技術美感或者最大化性能的假設出發,只能設計出空中樓閣。如果可以,那就讓用戶自己來做決定,在協議層操心太多,往往徒增摩擦。

以太坊的路線圖應該改變嗎?當然,應該放棄這些不切實際的幻想,回頭問問用戶需要什麼。