縱覽以太坊 1.x 與 2.0、Rollup 等協議層的改進,以及在 DeFi 與智能錢包等應用的發展。

原文標題:《觀點 | 以太坊上的諸多進展?》
撰文: 阿劍,EthFans 以太坊愛好者主創

本文原爲參與火星財經的分享活動而作,原題爲 「以太坊上正在發生什麼」,因時間關係,分享難免有所精簡。得到一些朋友的反饋之後,我決定補充內容,並改題爲 「以太坊上的諸多進展」,以示區別。

本文的目的,是集中介紹以太坊網絡在不同方向上的研究和實踐進展,展現以太坊生態參與者此刻的想象力之所投射。因此,此處的 「進展」 不僅限於在協議層的改進,也包括在應用上的努力。

以太坊 1.x

在以太坊 2.0 路線圖剛剛公佈的時候,不少關心以太坊的人都有一個疑問,如果大家的重心都放在以太坊 2.0 上,那這條 PoW 鏈怎麼辦呢?誰來維護呢?

早在 2018 年 Devcon4 期間,就有開發者已經意識到了這個問題。當時備選的有兩種方向:1)對 PoW 鏈僅做基本的維護,放棄大的更新;2)堅持對 PoW 鏈推進重大變革,把 2.0 的研究及開發交給別的團隊。後者就是所謂的 「以太坊 1.x」 方向。這個方向是有其道理的,因爲以太坊 2.0 的發佈時間並不確定,在發佈以前,仍必須保證 PoW 的鏈的長期可持續發展。後來,有更多人接受了以太坊 1.x 方向,這個路線也就確定下來。

基本上,以太坊 1.x 是希望解決以太坊 PoW 鏈面臨的一些根本性問題。其中一個就是衆所周知的 「狀態爆炸問題」。

在以太坊協議的運行中,哪個賬戶有多少錢、合約裏面存儲的數據,都會不斷更新,也會不斷有新合約產生。這些內容(賬戶餘額、合約代碼、合約存儲內容)我們稱爲「狀態」,它們是以太坊區塊鏈處理一些區塊後的結果,表示處理完區塊後該時刻的以太坊網絡全局狀態,也必然隨新區塊的產生而不斷更新。爲實現快速的區塊驗證(也是區塊執行,因爲驗證的方式就是把所有交易重新執行一遍),節點本地會把關於狀態的數據(簡稱「狀態數據」)專門保存起來,並隨着區塊的產生而不斷更新。那麼,從理論上來說,這部分數據的體量會隨着賬戶數量的增加而不斷上升,而且,每次訪問的狀態及輸出的狀態的存儲位置都是不確定的。

狀態數據爆發式增長會帶來兩個問題:1)因爲訪問及輸出的狀態的存儲位置不確定,就會使運行以太坊客戶端的節點產生大量的硬盤隨機讀寫需求(這就是爲什麼需要用固態硬盤來運行以太坊客戶端),而且這部分需求會越來越高,不斷提高參與驗證以太坊網絡的硬件成本,造成網絡節點數量的減少及集中化;2)使得新節點加入網絡變得越來越難,因爲新節點在剛加入網絡時需要向其它節點請求的狀態數據會變得越來越多。

而以太坊 1.x 的解決思路就是 「無狀態以太坊」,讓驗證交易所需的狀態證明(叫做 「witness」)隨區塊一起傳播。收到交易及 witness 的節點可以通過本地儲存的狀態根(以太坊狀態是用默克爾-帕特里夏樹來表達的,所謂狀態根就是默克爾樹的根值,是一個哈希值)來校驗 witness 的有效性,並進一步檢驗交易的有效性。如此一來,節點就不用在本地大量訪問狀態數據並寫入狀態數據(這就是爲什麼它叫做 「無狀態」)。

無狀態模式有很多好處,首先是因爲交易本身整合了驗證交易所需的數據,驗證交易會變得更快,能提高節點的處理速度;其次,無狀態模式下,數據本身被拆解了,那麼一些客戶端就可以根據自己的數據需求做定向的優化,比如可以有僅提供 DeFi 應用的交易及 witness 的節點。

雖然聽起來有這麼多好處,在實踐中它會遭遇很大的一個問題,就是它需要額外的帶寬。在當前的實際運行中,以太坊區塊的平均數據量大小是 20 多 KB。但是,目前的研究表明,即使我們對以太坊狀態樹的實現作一些改進,無狀態客戶端所需的 witness 大小仍然在 0.5MB 左右。對當前的以太坊網絡來說,負擔太大了。見證數據大小是無狀態模式要克服的首要調整,如果大小降不下來,就幾乎不可能實行。

不過,好消息是,無狀態以太坊的研究(算是)已經產生出了一個成果,就是 Beam 同步方式。Beam 借鑑了 Fast 同步方法和無狀態模式的優點,下載到最新區塊之後便開始一邊請求驗證交易所需的狀態數據,一邊在本地嘗試恢復完整的狀態。這種方法對硬件有一定要求,而且當前實現的效果還不穩定。但是運行良好的情況下,能在下載完區塊頭數據後幾分鐘內轉入完全驗證模式,也是一大突破。

無狀態以太坊的思慮是很深遠的,要解決的問題也是根本性的,涉及到 PoW 鏈的長期穩定性。即使它當前不可行,這一方向的研究也會爲以太坊協議的改進提供許多靈感。

參考文獻:

Layer-2 擴展方案

Layer-2 擴展方案的提法也是由來已久。大概在 2017 年就有人提出這個概念了。所謂 Layer-2,就是把交易的執行放在鏈下,即不是由運行以太坊客戶端的節點來執行,由另一些計算機來執行。比特幣網絡上的閃電網絡,就是著名的 Layer-2 方案。

使用 Layer-2 方案的用意在於提高吞吐量:如果交易的執行不放在區塊鏈上,自然就能組織多羣計算機爲無相關的交易做並行的執行(支付就是這樣一種大多數時候都可以並行的場景),僅在資金需要用於與 Layer-1 的合約和用戶交互時才讓底層區塊鏈來結算 Layer-2 上資金的狀態並執行交易。

那麼,作爲一個大家已經提了一段時間的概念,是什麼讓 Layer-2 在去年年末出現觀念上的爆發並獲得新的關注?因爲大家提出了一個比此前更爲實用的架構

Layer-2 的概念本身只提到了計算(執行)應該在鏈下進行,但沒有提到 Layer-2 交易的原始數據應該放在哪裏,用戶應當如何維護並獲取自己賬戶的最新狀態;這也正是 Layer-2 方案的設計空間。此前的方案爲了減輕 Layer-1 的存儲負擔,在鏈上是不存儲 Layer-2 交易數據的,有些只定期在鏈上存儲 Layer-2 狀態的狀態根(如某些 Plasma 方案),有些是什麼都不存(如大部分狀態通道方案)。

但是問題來了。當用戶的資金從 Layer-2 退出到 Layer-1 的時候,可能會發生爭議,比如我覺得我的賬戶裏應該還有 10 塊錢,但怎麼取款只取出了 5 塊,那我要怎麼證明我的賬戶裏實際上有 10 塊錢呢。要求用戶來保存相關的數據並在此時提交,首先用戶體驗就很差,其次還未必能獲得良好的證明效果。

於是有開發者在這個點上邁出了大膽的一步:把交易數據直接發佈到 Layer-1 上。因爲數據是編碼過的,體積不是太大的問題。這就轉變了 Layer-2 的範式:要麼交易數據有問題,要麼交易數據沒問題,那麼依據一定狀態轉換規則得到的結果自然就沒有爭議。這就是 Rollup 方案的核心。

在此基礎上,我們所聽到的不同 Rollup 方案,其區別在於保證狀態轉換正確性(correctness)的方式不同,比如所謂的 ZK-Rollup,是使用密碼學證明系統(主要是零知識證明技術)來做計算完整性(computational integrity)的證明,簡言之,如果相關證據能通過驗證,就證明計算一定按照相關流程執行了。而比如 Optimistic-Rollup,則是使用經濟激勵和挑戰期的方案來保證上鍊數據的有效性:如果你覺得另一個運營者提出的 rollup 區塊中含有無效交易,就存入押金髮起挑戰。

綜上,Rollup 的概念爲 Layer-2 的發展再添一把新柴,有望爲以太坊網絡解決可擴展性問題提供強大的助力。雖然一個新概念並不能解決所有問題,工程問題遠比概念的推導更復雜(這是我們所有人都應具有的基本認識),比如,Rollup 方案也要面臨用戶取款的時候到賬時延問題,因此需要流動性供應商。但 Rollup 方案確實是吸收了前人的教訓,顯現出不錯的前景。

ZK-Rollup 已經有上線的案例,就是使用 Loopring zk-Rollup 方案的 WeDEX 去中心化交易所;此外,Starkware 也在這個領域耕耘。Optimistic Rollup 的代表則有 Fuel,這是一個致力於穩定幣支付的側鏈項目。Rollup 概念的提出者 John Adler 也在這個項目裏。

參考文獻:

DeFi

DeFi 應用正變得越來越複雜,在我看來這是一個好事。一開始(包括到現在也是) DeFi 的主要應用就是借貸,在這裏我主要提的就是 Compound (MakerDAO 和 DAI 實際上要更復雜一些,不是借貸二字能簡單概括的,雖然其形式也是借貸)。後來延伸到了保證金交易,即槓桿交易,先行者應屬 dYdX。現在很多去中心化交易所都有保證金交易功能了,包括 DDEX。

現在已經出現了合成資產交易功能,即非實物結算的衍生品交易。比如在 Synthetix 平臺上,可以合成比特幣價格的衍生品。甚至現在還有一種有趣的操作,你可以拿自己的 ETH 中的一部分換成 DAI ,存入 Uniswap 成爲流動性提供者,獲得 Uniswap 的手續費收益,另一部分拿到保證金交易平臺上兩倍看多 ETH,這樣就既不會錯過 ETH 的漲價收益(當然也會面臨 ETH 的跌價損失),又能得到一些手續費收益。DeFiZap 就提供這樣的複合式操作,免去了用戶自主操作的麻煩。

這些新出現的產品,有一些是獨出心裁的,比如 Synthetix,在其系統中,所有合成資產的用戶都是其他用戶的對手方;另一些則一再印證了 「可組合性」 的存在,比如 DeFiZap。不論如何,它們都展現了 DeFi 的生命力,而且絲毫沒有減弱的勢頭。

在 3 月 12 號的 ETH 價格大跌中,鏈上清算壓力極大,也出些了一些不盡如人意的情形,有一些朋友覺得有些幻滅,但我絲毫不這麼覺得。出現挫折是必然的,因爲無論產品設計還是工程,永遠沒有完美無缺的東西。永遠有一些東西是必須在現實中經受壓力測試才能發現的。現在並沒有暴露出哪個問題是不可解決的,反而,它暴露出來的是,DeFi 已經成長了很多 —— 原來根本沒有那麼多清算需求,而現在已經有了。

參考文獻:

改善使用體驗的應用和技術

以太坊生態很早就開始關注區塊鏈的用戶體驗問題了。 所謂的用戶體驗,總結起來就是入門用戶剛上手以太坊時候的都會問出的問題:什麼是 Gas?丟了助記詞,錢就找不回來了,這麼坑的嗎?

關於第一個問題,現在已經有了一種叫做 「元交易(meta-transaction)」 的技術:用戶先對一個有效的交易數據簽名並將其發送給一箇中繼者,由中繼者確認數據的有效性後作爲實際交易發送者發出交易,該交易會觸發一系列的合約操作,完成用戶的交易目的併爲中繼者支付。在這個過程中,Gas 的實際支付者是中繼者,因此,只要用戶和中繼者達成一致意見,用戶就可以不用 ETH 來支付,甚至可以不用付費(也就是中繼者或者 dApp 自己補貼了用戶)。

關於第二個問題,一種解決思路是,這個問題本質上是由以太坊協議帶來的,協議層的賬戶體系不支持用戶使用比助記詞和私鑰更復雜的方式來管理自己的地址和資金。但是,智能合約的表達可能性是沒有這些限制的。因此,用戶可以使用一個自己能控制的智能合約來管理資金,這個智能合約可以支持一些預先定義的方案來更替該智能合約的控制權,這樣,就可以支持比如社交恢復方案了(讓多個你信任的人用地址可以集體幫助你更換合約的控制權,這樣就算你丟了手機或者私鑰,還是可以恢復對該合約和資金的控制權,換個地址就行)。

此外,另一個大家早已熟知的用戶體驗改進方案是 ENS,可以幫助用戶用可讀的 .eth 地址來表示自己的地址。這樣轉賬時就不用瞪大眼睛不斷比較收賬地址了,輸入那個 .eth 地址就可以了(ENS 也有別的後綴)。

這些方法,最近都集中在一種應用上爆發了:智能合約型錢包。用戶用智能合約來管理自己的資金,該智能合約可以有 ENS 地址,也往往直接集成了元交易功能,甚至支持社交恢復、每日轉賬限額這樣的高級功能。現在智能合約錢包領域風頭正勁的項目有兩個:Argent 和 Authereum。

參考文獻:

以太坊 2.0

以太坊 2.0 可能是大家最關注的領域,但可能也是信息最不普及的一個話題。這一方面是因爲以太坊 2.0 本身比較複雜,它不像上面提到的比如 DeFi 那麼切身可感,易於理解其中的邏輯。另一方面是因爲許多設計也還沒有完成,沒有定論。

以太坊 2.0 的主體有兩部分:權益證明共識機制 + 分片;主要分成 3 個階段來部署:Phase 0 (第一階段,因爲程序員數數都從 0 開始數)的部署目標是信標鏈,就是用 PoS 機制來運行的鏈,這條鏈也是以太坊 2.0 的核心,因爲涉及到向全網提供隨機性(相應關聯着分片安全性)和分片間交互的任務。信標鏈本身不是用來執行交易的,所以它並不像以太坊 PoW 鏈具備用戶轉賬、運行合約的功能。

Phase 1 的部署目標是分片鏈。即有關分片的各種設計開始部署, PoS 共識機制的參與者(「驗證者」)開始要被分配到不同分片上出塊並把分片的一些信息(「crosslink」)提交到信標鏈上。但是,在此階段,分片仍不能執行交易,所以分片鏈上的區塊只是一些單純的數據,沒有什麼意義。這個階段更像是在測試網絡能不能滿足分片的帶寬需求。

Phase 2 是爲分片鏈添加執行引擎。到了 Phase 2 階段,分片就具有了執行交易的功能,到時候就可以像現在的以太坊一樣部署合約了。做分片,是爲了並行化處理交易,提高以太坊的交易處理吞吐量。

根據這個分階段部署的路線圖,可知網上流傳着許多對以太坊 2.0 的誤解:

(1)「以太坊 2.0 今年就要上線了」,這種說法是不夠準確的。因爲計劃在今年部署的是 Phase 0,即信標鏈階段,樂觀估計會在今年夏季末上線。信標鏈上線之後,用戶就可以在 PoW 鏈的保證金合約內存入 32 ETH 然後成爲信標鏈上的驗證者了。但是,這並不意味着以太坊 2.0 已經全面部署了。所以,說 「以太坊的 PoS 階段將從信標鏈上線開始」,是沒有問題的,但說 「這就意味着以太坊 2.0 完成了」 則是錯誤的。

(2)「以太坊 PoS 來了之後,礦機就不能再挖礦了」 也是誤會。如上所述,信標鏈本身並無執行交易的功能,不可能一上線就完全取代 PoW 鏈。PoW 鏈和信標鏈會共存很長一段時間,並不是 PoS 一推出就完全廢棄掉 PoW 鏈。兩者的共存至少要等到 Phase 2 上線之後纔會終止(如果分階段部署的路線圖以及各階段的內容都無改動的話)。而 Phase 2 的推出時間,雖然沒有明確的時間表,但在 Phase 0 上線之後樂觀估計也要兩年。

(3)以太坊 2.0 完全部署之後,Eth1 也會合併到 Eth2 系統中,可能的方式是變成 Eth2.0 中的一個分片,其已有的狀態也會完全遷移過去。但具體怎麼做,我沒有深入瞭解。

那麼,關於即將到來的信標鏈,還有哪些細節是希望參與的人需要了解的呢?

(1)迄今爲止,關於 PoW 鏈與信標鏈的連接方式,主流意見還是單向鏈橋,即用戶可通過在 PoW 鏈的保證金合約內存入 32 ETH 來獲得信標鏈上的驗證者資格和信標鏈 ETH (BETH),但在 BETH 不能發回到 PoW 鏈上來;

(2)在目前的設計中,BETH 持有者之間也是不能相互轉賬的,因爲信標鏈沒有執行交易的功能。但是這個功能可能在信標鏈穩定運行一段時間後加上,與後續的部署沒有很強的先後依賴關係。

(3)如果你想自己運營驗證者,那麼除了存入 32ETH,你還需要一臺能運行驗證者客戶端軟件的電腦和穩定的網絡連接(單臺電腦可運行多個驗證者客戶端),還需要找到一個節點來爲你提供必要的信息,否則就不能參與共識了,當然你也可以自己搭建信標鏈節點。運行驗證者客戶端的硬件要求並不高,但運行信標鏈節點的硬件要求會高一些。顯然,到時候也會出現質押服務的提供商,但受以太坊協議本身的限制,這種質押服務應該做不到完全免信任,因此,你需要好好選擇提供商。

這裏要額外提一下的是,有些朋友可能混淆了驗證者和信標鏈節點的概念。信標鏈節點是參與網絡的基本單位,驗證者是參與共識的基本單位。驗證就像礦工,並不一定要自己部署節點,但一定要依靠節點才能參與共識;另一方面,節點部署者也不一定是驗證者。

從網絡的去中心化角度看,不僅要關心驗證者客戶端的硬件需求,信標鏈節點的硬件需求其實更加關鍵。

(4)在充當驗證者時,不僅有賬戶餘額的概念,還有一個 「有效餘額」 的概念。前者是你的賬戶裏有多少 BETH,後者是你在參與共識時的權益權重(決定你所遭受的獎懲力度),它是有上限的,就是 32BETH。隨着你在信標鏈上接受獎勵和懲罰,你的餘額會變動,有效餘額也會跟着變動(在有效餘額上升時會有一些滯後性),然而一旦有效餘額達到 32ETH ,它就不會繼續上升了。你的餘額可能是 100 BETH,但你參與共識時,你所投出的票仍記爲 32BETH 的權重。這就決定了,以太坊的 PoS 像是一個發放單利的系統,而不是一個發放複利的系統。

最後,關於分片,我得承認,我並不瞭解這個概念的全部內涵及其設計空間。在我看來,分片似乎是說,由不同羣組的驗證者並行地對一些交易達成共識,同時又要保證,這些分別只經過一些驗證者共識的狀態、並沒有固定保存位置的狀態,彼此之間是可以溝通的。因此,「跨分片通信」 纔是真正的難題。

以我們現有的認識來看,可以把區塊鏈當成一種追蹤狀態變更的方法,其關鍵是保證區塊內容的可驗證。對於以太坊協議而言,只要交易所改動的狀態是由參與驗證交易的人所共享的(或者說,只要想參與驗證的人能獲得交易所基於的狀態),區塊就是可驗證的。甚至於,參與驗證交易的人不斷替換(如同在以太坊 2.0 設想中的 「驗證者不斷被分配到不同分片上」),也沒有問題,因爲無狀態性(statelessness)可以讓交易自身攜帶自己所改變的狀態。在這一點上,我們即使算不上有經驗,起碼是能夠想象的。真正難以想象的問題在於:如果各分片是並行運行的,這就意味着各分片的運行是異步的(如果我們想保留可擴展性的話),那麼,怎麼使得當 A 分片使用了 B 分片的狀態並輸出了結果時,讓 B 分片的狀態也隨之改動呢?發生在 A 分片的交易想使用 B 分片的狀態似乎並沒有問題,仍是可驗證的,但如何在執行完之後立即改變 B 分片的狀態呢,如果處理該交易的驗證者們並沒有辦法告訴大家 B 分片的狀態已經被改變了?換種問法,B 分片上的驗證者怎麼知道不在 B 分片的狀態變更歷史中的某筆交易要求改變 B 分片的狀態呢?(光靠跟蹤狀態根的變化似乎不行)(在可想象的情形中,似乎都要求某個各分片都必須同步的分片存在,即,該分片本身成了事實上的 Layer-1,而其它分片成了事實上的 Layer-2)。

去年末,分片領域的研究取得了不少成果,研究人員已經成功把研究的重點凝聚爲兩個關鍵問題:(1)因爲驗證者需要在不同分片間混洗,要求他們在短時間內下載分片交易歷史、得出該分片的最新狀態,是不現實的,也會破壞可擴展性;因此,分片要求無狀態性;但這種無狀態性也使得在發起交易時,必須有人能爲這些交易提供 witness,這就是中繼者網絡問題;(2)在用戶發起交易時,如何保證交易處理和手續費支付的原子性?這個問題勾連着 「分片如何分」 以及 「跨分片交易(支付)」 怎麼做的問題。這就是手續費市場問題。

這兩個問題已經很精準了,但我也仍然期待更好的問題定義。好的問題,纔有好的答案。

參考文獻: