摘要

我們提出了一種新的 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 :tada:

在本文中,我們要演示一種新的、基於零知識證明的擴展方案,它有望能解決上述所有問題: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 中的可組合性:打了激素的區塊鏈互聯網:pill:

同步的跨分片(或者說跨區塊鏈)互操作性 公認是非常難的 (編者注:中譯本見文末《區塊鏈分片的理念與挑戰,Part-1》)。這就是爲什麼現有的分配解決方案(Cosmos、Polkadot、Eth2)都選擇了更簡單的異步互操作性,用 交易收據 方法來實現。但是從同步模式轉變成異步互操作性,會在協議交互和用戶體驗上產生許多令人頭疼的麻煩,尤其是對那些對時間敏感的應用(即,Aave 的 15 秒閃電貸)。

那就讓 zkPorter 來試試!zkPorter 裏面的所有賬戶都共享同一個地址空間,而且可以通過運行在 zkPorter 中的基礎分片 shard 0 上的 zkRollup 與其它賬戶互操作。一個對流量有很高要求 以及/或者 特定數據可用性需求的協議可以將自己的協議接口放在自己(在 zkPorter 中)的分片裏面。其中的安全性、成本和吞吐量權衡,我們下文再說。

zkPorter 讓任意數量的協議都可以平滑地互操作。單筆原子交易可以在不同的 zkPorter 分片上調用任意數量的智能合約。不僅如此,分片內的交易將可以 訪問整個 zkPorter 的狀態 —— 包括其它分片上的數據。這一特性可被用於(例如)讀取來自某個信息輸入機制的信息。

你可以把 zkPorter 模式想象成打了 zk 激素的區塊鏈互聯網。

zkPorter 分片:安全性與開銷 :money_with_wings:

zkPorter 的 Shard 0 就是一個 zkRollup,有完整的數據可用性和以太坊的安全性保證。Shard 0 會成 zkPorter 內部運行的分片中最貴的一個,交易成本大約是主網交易的 1/100。

Shard 0 以外的分片會在自己的智能合約中定義自己的數據可用性方案。這些其它分片,犧牲了鏈上數據可用性,換來了進一步的 10~100 倍的交易成本節約和吞吐量提升。zkPorter 會引入一個可選的驗證者機制,我們稱之爲 “zkPorter 衛士”,它讓協議可以邀請協議的利益相關者作爲協議分片的數據可用性保證人而參與進來。使用衛士機制的分片會運行一種權益證明共識機制,因此,只要 1/3 的參與驗證者保持誠實,該分片的用戶就能隨時帶着自己的數據退出。

各協議可以自由選擇自己的數據可用性方案,可以包括 zkPorter 衛士,也可以不使用這種機制。協議所選數據可用性方案的效率就會影響到所在分片的吞吐量和交易成本。

分片 吞吐量 安全性 交易成本
zkRollup 分片 3k TPS 通過 zkRollup 實現與 Layer-1 等同的安全性 約爲 0.01 美元(當 Gas Price 爲 100 Gwei 時)
衛士分片 10k~20k TPS 上限爲 2/3 的zkSync 衛士押金 約爲 0.01 美元
X 協議分片 基於協議的複雜性 由 X 協議的驗證者保證安全性

靈活的數據可用性就是 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 內的一些分片交易,那必須遵循下述規則:

  1. 分片 S 子樹的根哈希必須公開一次,作爲 calldata 放到 Layer-1 上。這是爲了讓所有其它分片的用戶能夠重構自己的狀態
  2. 該分片配套的智能合約必須被調用來執行額外的要求(例如:驗證分片共識參與者的簽名)

案例分析 :briefcase:

我準備用 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 社區積分的持有者都能夠:

  1. 容易地與其它分片上的智能合約互動,比如使用部署在 zkSync 上的 DeFi 協議(Curve on zkSync、Compound on zkSync,等等)來 交易/出借/貸款
  2. 把他們的社區積分轉移給一個 zkRollup 分片上的用戶(以獲得最大的安全性)
  3. 快速取出他們的代幣到以太坊主網上,與 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 高企時候的競爭優勢,另一方面也給了他們對可擴展性技術/犧牲的更深刻理解。

不僅如此,對於渴望支持高頻交易的去中心化交易所來說,單筆交易的費用必須儘可能小,因爲喫下一個單需要非常高的交易數量。

不過,這一方法面前橫亙着兩大問題:

  1. 孤立的可擴展性缺乏 可組合性 ,或者說 網絡效應
  2. 隨着零知識證明技術的潛力完全展現,越來越多人意識到,零知識證明是大規模普及的關鍵。與此同時,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

翻譯:阿劍

相關文章