摘要
我們提出了一種新的Layer-2 可擴展技術“zkPorter”,可以將zkRollup 和分片結合在一個高度可擴展且原子化可組合(atomically composable)的區塊鍊網絡中。
問題#1:交易吞吐量≠ 可擴展性 ⚖️
交易吞吐量是用全網處理的總交易數量來度量的;而可擴展性是單個節點處理的交易數量。 zkRollup 可以被認為是滿足了安全性和有用性的終極Layer-2 擴展方案。 (編者註:見文末超鏈接《各以太坊Layer 2 擴容方案的評估對比》)但是zkRollup 相對於主網僅僅提供了約100 倍的可擴展性提升,因為交易數據還是需要廣播到所有全節點。有人可能會說,zkRollup 只是線性提升了吞吐量,但並沒有提供指數級的可擴展性。
zkRollup 在Eth1 上的處理速度可達3000 TPS,但保守估計—— 取決於Eth2 實現的細節—— 在分片化的Eth2 上的處理速度至少是20000 TPS。相比於Visa 最高可達24k TPS 的吞吐量,這已經是個巨大的成就了,但因為我們想要幫助今天還不能享受到銀行服務的數十億人,我們還要爭取更多。
問題#2:孤立的可擴展性是死胡同?
DeFi 的崛起意味著可組合性(composability)是成功的關鍵。作為可以自由組合的“貨幣積木”,DeFi 應用證明了把免信任的協議層層疊加可以解鎖的潛在價值。如果一個項目只盯著自己的擴展方案,最終他們會發現自己孤立於由社區共享的、可組合的擴展機制所創造的安全性和網絡效應之外。
介紹zkPorter ?
在本文中,我們要演示一種新的、基於零知識證明的擴展方案,它有望能解決上述所有問題:zkPorter。
解釋zkPorter ?
zkPorter 是一個賬戶模式的、基於簡潔的零知識證明來保障安全性的免信任型擴展協議。類似於zk 家族的其它擴展方案(例如zkRollup 和Validum),zkPorter 中的計算可以指數級擴展:任意多的交易都可以用幾乎恆定的開銷來驗證。每一筆交易都會由Layer-1 上的智能合約來驗證,所以zkPorter 中的賬戶狀態的正確性與Layer-1 上的狀態有同樣的安全性保證。
另一方面,基於零知識證明的擴展方案仍不能直接解決數據可用性問題:如果狀態數據變得不可用,資金就會被凍結。 zkRollup 和Validium 是用不同的方法來處理數據可用性問題的(編者註:見文末超鏈接《ZK rollup 與Validium 對比》)。
zkPorter 使用了一個結合zkRollup 理念和分片理念的混合方法來解決數據可用性問題。它可以支持任意多數量的分片,每一個分片都有自己的數據可用性方案(由該分片的智能合約來定義)。同時,對分片的選擇是在個體賬戶層面上控制的(The choice of the shard is controlled at individual account level)。
zkPorter 將對狀態有效性和數據可用性的顧慮分離開來。狀態有效性—— 有效的狀態轉換才能發生—— 由零知識證明工具來統一實現,這就能提供指數級的可擴展性,同時繼承Layer-1 的安全性保證。另一方面,數據可用性則委託給各分片自己解決,可以自由實驗不同的解決方案。必要之處求聯合,未決之事任自由(In necessariis unitas, in dubiis libertas)!
zkPorter 中的可組合性:打了激素的區塊鏈互聯網?
同步的跨分片(或者說跨區塊鏈)互操作性公認是非常難的(編者註:中譯本見文末《區塊鏈分片的理念與挑戰,Part-1》)。這就是為什麼現有的分配解決方案(Cosmos、Polkadot、Eth2)都選擇了更簡單的異步互操作性,用交易收據方法來實現。但是從同步模式轉變成異步互操作性,會在協議交互和用戶體驗上產生許多令人頭疼的麻煩,尤其是對那些對時間敏感的應用(即,Aave 的15 秒閃電貸)。
那就讓zkPorter 來試試! zkPorter 裡面的所有賬戶都共享同一個地址空間,而且可以通過運行在zkPorter 中的基礎分片shard 0 上的zkRollup 與其它賬戶互操作。一個對流量有很高要求以及/或者特定數據可用性需求的協議可以將自己的協議接口放在自己(在zkPorter 中)的分片裡面。其中的安全性、成本和吞吐量權衡,我們下文再說。
zkPorter 讓任意數量的協議都可以平滑地互操作。單筆原子交易可以在不同的zkPorter 分片上調用任意數量的智能合約。不僅如此,分片內的交易將可以訪問整個zkPorter 的狀態 —— 包括其它分片上的數據。這一特性可被用於(例如)讀取來自某個信息輸入機制的信息。
你可以把zkPorter 模式想像成打了zk 激素的區塊鏈互聯網。
zkPorter 分片:安全性與開銷?
zkPorter 的Shard 0 就是一個zkRollup,有完整的數據可用性和以太坊的安全性保證。 Shard 0 會成zkPorter 內部運行的分片中最貴的一個,交易成本大約是主網交易的1/100。
Shard 0 以外的分片會在自己的智能合約中定義自己的數據可用性方案。這些其它分片,犧牲了鏈上數據可用性,換來了進一步的10~100 倍的交易成本節約和吞吐量提升。 zkPorter 會引入一個可選的驗證者機制,我們稱之為“zkPorter 衛士”,它讓協議可以邀請協議的利益相關者作為協議分片的數據可用性保證人而參與進來。使用衛士機制的分片會運行一種權益證明共識機制,因此,只要1/3 的參與驗證者保持誠實,該分片的用戶就能隨時帶著自己的數據退出。
各協議可以自由選擇自己的數據可用性方案,可以包括zkPorter 衛士,也可以不使用這種機制。協議所選數據可用性方案的效率就會影響到所在分片的吞吐量和交易成本。
靈活的數據可用性就是zk Porter 的核心設計目標。允許了各協議自行設計方案,zkPorter 就能支持非常多不同的方案,可以適應每個人的需要。安全假設以受信任的中心化參與者作為保證人的應用可以實現權威證明共識機制。而帶有治理代幣的應用可以實現自己的權益證明共識機制來保護自己的分片—— 只不過要避免讓分片內的資金體量超過已鎖定的驗證者押金體量。糾刪碼(erasure coding)機制可以用於證明驗證者沒有刪除數據。比如,考慮到比特幣網絡相對比較簡單、交易數量也低,一個zkPorter 分片的驗證者完全可以在他們的分片內創造一個比特幣實現,運行基於工作量證明的中本聰共識。所有這些都可以與zkPorter 的衛士驗證者設置相結合,也都可以與之獨立運行。
zkPorter 在一開始設計時就把擴展當成目標。 zkPorter 協議將每一個分片的數據可用性和有效性開銷降低到了一個很低的水平。增加新分片的邊際成本比起在基礎的zkRollup 上包含嵌套數據所引起的成本是對數級別的。這就讓zkPorter 可以高效地擴展到支持數億個賬戶。
最後,用戶的隱私可以得到零知識證明技術的保護。使用一個zkRollup 作為zkPorter 的基本元素有一個內在的優勢,就是狀態轉換的有效性是可以被證明的,而且可以不用公開這些交易的內容。
架構?
究其實,zkPorter 很像zkRollup 和Validium。一個放在Layer-1 上的智能合約託管著資金、保存著一份對賬戶狀態默克爾根的記錄。實際狀態數據由zkPorter 驗證者和各分片的數據保證人保存在鏈下:我們也管它叫“狀態樹”。
一個分片的智能合約定義了自己的狀態轉換規則。當一個zkPorter 區塊被接受的時候,該塊會引起一次狀態轉換:一筆在Layer-1 上的交易會把默克爾根替換成新值。這筆交易必須驗證用於證明新值有效的零知識證明:即,要驗證該區塊中的每一筆交易都是有效的。
在zkPorter 中,每個分片的賬戶都必須存儲狀態樹的一棵獨立的子樹中。此外,每一個分片子樹都必須包含關於自身分片類型的信息,並引用定義其狀態可用性策略的智能合約賬戶。
假設一個分片的類型是zkRollup,那麼該分片中每一筆改變賬戶狀態的交易都必須把對狀態的更改作為Layer-1 的calldata 發佈出來(就跟一個zkRollup 一樣)。
所有會同時修改兩個及以上分片狀態的交易都必須用zkRollup 模式來執行。
而所有其它僅會影響特定一個分片內賬戶的交易都可以用正常的分片模式來執行(我們稱之為“分片交易”)。如果一個區塊包含了分片S 內的一些分片交易,那必須遵循下述規則:
分片S 子樹的根哈希必須公開一次,作為calldata 放到Layer-1 上。這是為了讓所有其它分片的用戶能夠重構自己的狀態該分片配套的智能合約必須被調用來執行額外的要求(例如:驗證分片共識參與者的簽名)
案例分析?
我準備用4 個案例來展示zkPorter 的潛能,演示它是如何無縫組合不同的應用、同時擴展交易量來滿足每個應用的需要的。
案例1:Reddit 社區積分
2020 年6 月,Reddit 啟動了The Great Reddit Scaling Bake-Off 計劃,讓各個社區有機會通過一個社區積分系統來主持自己的子論壇(subreddit),也讓各Layer-2 方案能一展身手。顯然,社區積分系統的解決方案必須是安全的、去中心化的和易用的,同時還能保持與其它第三方應用(錢包、合約)的互操作性,還有,能處理數以十萬計的交易。社區積分可以用zkPorter 來實現,有三種不同的方式。
選項1:運行在zkSync 上(zkPorter shard 0)
為讓社區積分連接到以太坊主網,Reddit 可以直接在zkSync 上使用現有的zkRollup 功能。 zkSync 在Eth1 上可達到3000 TPS。假設所有5 億Reddit 月活用戶都踴躍參與。再假設平均每個用戶在每個月裡要發送一筆鑄幣交易、一筆銷毀交易(支付訂閱費用)和兩筆轉賬,則社區積分系統要求的平均負載是:
5 億× 4 /(30×24×60×60) 約等於700 TPS
這只佔zkRollup 當前吞吐量的1/4。
選項2:放到一個Reddit 專屬的分片上,由zkPorter 衛士來驗證
若有意提高交易吞吐量的彈性並降低用戶的使用成本,Reddit 可以將Reddit 交易從基礎分片下放到一個Reddit 專屬的分片上。 Reddit 可以自己選擇向用戶提供數據可用性保證的方案。最簡單的辦法就是現有的zkSync 衛士實現,向用戶提供由權益證明實現的數據可用性保證。我們會建議Reddit 除了使用衛士模板,還要把數據存儲在Reddit 的服務器裡。在這種模式下,即使衛士遭受2/3 多數攻擊, Reddit 也能應付下來,這樣用戶就高枕無憂了。相應地,用戶的數據也不會因Reddit 服務器出錯、被攻擊而傾覆。
選項3:放到一個Reddit 專屬分片上,使用專屬的數據可用性策略
第三種方法是, Reddit 可以選擇最大化交易吞吐量、最小化用戶成本,就是將Reddit 社區放到一個專屬分片上,同時使用一個定制化的數據可用性方案,而不用衛士機制。一種基於權益證明共識的可行方案是,基於社區驅動的數據可用性,再加上2/3 的多簽名機制(two-third multisignature)。
設想一種可能的方案實現:Reddit 和Reddit 的用戶會發送簽名來見證每一個狀態轉換的有效性。 Reddit 可以,比如說,佔據1/3 的總簽名權重,把2/3 分發給用戶。再加上一個簽名權重的2/3 多數機制(A combined two thirds in signature weight),足以保證Reddit 分片上的狀態轉換是有效的。可以激勵用戶發布關於自己所見無效轉換的證明,比如扣減該無效狀態轉換的發布者的押金。
交易成本在這種方案中會變成僅覆蓋零知識證明的生成所需的成本(在當前是每筆交易千分之一美元,在將來還將指數級下降)
互操作性
在所有這些場景中,Reddit 社區積分的持有者都能夠:
容易地與其它分片上的智能合約互動,比如使用部署在zkSync 上的DeFi 協議(Curve on zkSync、Compound on zkSync,等等)來交易/出借/貸款把他們的社區積分轉移給一個zkRollup 分片上的用戶(以獲得最大的安全性)快速取出他們的代幣到以太坊主網上,與zkSync 以外的智能合約互動
案例2:智能錢包/密碼學貨幣銀行(Argent、Dharma、MyKey,等等)
智能錢包就是用智能合約來實現的錢包,可以幫助用戶獲得隱私功能和互操作功能(舉個例子,可以無縫對接Layer-2 擴展方案)。一些智能錢包比如Argent,甚至在引導新用戶的過程中會選擇性地為用戶補貼一定比例的交易手續費。以當前的Gas Price(75 Gwei)和以太坊價格(320 美元)來算,一筆交易就是0.5 美元。智能錢包可以使用智能合約調用zkRollup 函數來降低整體的Gas 開銷。
這裡提供一種可能的實現方案,分3 個簡單的步驟。
步驟1:zkRollup 分片
智能錢包的賬戶可以遷移到一個zkRollup 解決方案(比如zkSync)上。 zkSync 內部的錢包之間的轉賬是很便宜的,雖然從zkSync 發送到主網的交易會稍微貴一點,而且耗時也更久(約5~10 分鐘才能確定)。
步驟2:zkSync 衛士+ 錢包運營者分片
在引入足夠多的新用戶之後,在zkRollup 上運營的成本可能會讓錢包運營者考慮開啟一個專屬分片。在上文的Reddit 部分中,我們就詳細講解過這種方案:把用戶基礎遷移到一個獨立的、由zkSync 衛士(在Reddit 的案例中是社區成員,在這裡可以是協議的參與者)和錢包運營者來保證其數據可用性。只要錢包運營者或者zkSync 衛士中的大部分沒有被攻破,分片就是安全的。這一選項也為錢包運營者的靈活手續費分享方案打開了可能性。
步驟3:錢包DAO 分片
到了某一刻,錢包的用戶基礎可能會變得非常大,達到錢包需要遷移到一個由治理代幣來治理的分片上。這個分片仍會是zkSync 網絡的一部分,而且可以用zkRollup 模式訪問所有其它分片上的服務。
隱私考慮
還需進一步說明的是:隱私功能在上述任一步中都很容易實現。沒有零知識證明,就很難實現隱私性。但zkRollup 的好處就在於,賬戶可以即時獲得隱私性、大幅降低參與網絡的費用,而且無需犧牲安全性和去中心化。
案例3:DeFi 協議和DEX(Loopring、IDEX、Curve、Coumpound,等等)
預見到了未來會出現的吞吐量瓶頸,多個主流的DeFi 應用(例如IDEX 和Loopring)都投資於部署自己的可擴展性解決方案。這是很聰明的一步,因為這一方面給了他們在Gas Price 高企時候的競爭優勢,另一方面也給了他們對可擴展性技術/犧牲的更深刻理解。
不僅如此,對於渴望支持高頻交易的去中心化交易所來說,單筆交易的費用必須盡可能小,因為吃下一個單需要非常高的交易數量。
不過,這一方法面前橫亙著兩大問題:
孤立的可擴展性缺乏可組合性,或者說網絡效應。隨著零知識證明技術的潛力完全展現,越來越多人意識到,零知識證明是大規模普及的關鍵。與此同時,ZKP 領域的創新速度很快,以至於要跟上節奏必須有自己專門的研究開發團隊。但是,如果不能很好地審計和實現複雜的密碼學算法,等待他們的可能是嚴重的安全漏洞。密碼學領域的黃金法則還是對的:不要閉門造車搞一套只有你自己知道的密碼學。
zkPorter 就解決了這個問題。 DeFi 協議可以建立在先進的可擴展性技術和強大的網絡效應上,同時控制交易成本。要擁有這些,一個協議可以在zkPorter 內創建一個自己的分片,用協議代幣持有者的共識來保護它。這也為靈活的手續費共享(或者說手續費補貼)提供了機會。
案例4:微交易(Brave、Livepeer、Storj,等等)
需要處理大量低價值轉賬(微交易)的協議可以實現一個類似於Validum 的分片(就是一個讓多個參與者的簡單多簽名來保證數據可用性的分片),讓交易手續費低到彌補零知識證明的生成成本即可(當前是每筆交易0.001 美元左右,預計在未來還將大幅降低)。
如此整合微交易平台,則用戶還可以在餘額超過一定額度之後自動將餘額轉移到一個zkRollup 分片中。
前進的道路?
zkPorter 將作為zkSync 路線圖的一部分而初步實現。
對於這一願景,接下來我們要做的有:
為zkSync 提供對通用的智能合約的支持實現一種多驗證者的共識機制分發zkSync 代幣來啟動衛士保護型分片
zkSync 已經上線以太坊主網,現在就可以使用免准入的zkRollup 模式了。我們相信它的吞吐量對於滿足以太坊社區接下來兩年內(也就是遷移到以太坊2.0 之前的這段時間)的需要是足夠的了。不過,我們歡迎大家討論和實現定制化的分配解決方案、締結密切的合作夥伴關係。
請在這里聯系我們。
提醒
zkSync 現在還沒有發行過代幣,暫時也沒有銷售和分發計劃。請警惕騙局。
原文鏈接:
https://medium.com/matter-labs/zkporter-composable-scalability-in-l2-beyond-zkrollup-2a30c4d69a75
作者: Alex Gluchowski
翻譯:阿劍