零知識匯總
零知識匯總 (ZK-rollup) 是第二層 (L2) 擴容解決方案,透過將運算和狀態儲存移至鏈下,來提高以太坊主網的吞吐量。ZK-rollup 可以在一個批次中處理數千筆交易,然後只將最少的摘要資料發佈到主網。這些摘要資料定義了應該對以太坊狀態進行的變更,以及證明這些變更正確的密碼學證明。
先決條件
你應該已經閱讀並理解我們關於以太坊擴容和第二層 (L2) 的頁面。
什麼是零知識匯總?
零知識匯總 (ZK-rollup) 將交易打包(或「匯總」)成在鏈下執行的批次。鏈下運算減少了必須發佈到區塊鏈的資料量。ZK-rollup 營運者提交代表批次中所有交易所需變更的摘要,而不是單獨發送每筆交易。他們還會產生來證明其變更的正確性。
ZK-rollup 的狀態由部署在以太坊網路上的智能合約維護。為了更新此狀態,ZK-rollup 節點必須提交有效性證明以供驗證。如前所述,有效性證明是一種密碼學保證,確保匯總提出的狀態變更確實是執行給定交易批次的結果。這意味著 ZK-rollup 只需要提供有效性證明即可在以太坊上將交易已定案,而不需要像樂觀匯總那樣將所有交易資料發佈到鏈上。
將資金從 ZK-rollup 轉移到以太坊時沒有延遲,因為一旦 ZK-rollup 合約驗證了有效性證明,就會執行退出交易。相反地,從樂觀匯總提款會受到延遲,以允許任何人使用來挑戰退出交易。
ZK-rollup 將交易作為 calldata 寫入以太坊。calldata 是儲存包含在對智能合約函式外部呼叫中的資料的地方。calldata 中的資訊發佈在區塊鏈上,允許任何人獨立重建匯總的狀態。ZK-rollup 使用壓縮技術來減少交易資料——例如,帳戶由索引而不是地址表示,這節省了 28 個位元組的資料。鏈上資料發佈對匯總來說是一項重大成本,因此資料壓縮可以降低使用者的費用。
ZK-rollup 如何與以太坊互動?
ZK-rollup 鏈是一種在以太坊區塊鏈之上運作的鏈下協定,並由鏈上以太坊智能合約管理。ZK-rollup 在主網之外執行交易,但會定期將鏈下交易批次提交給鏈上匯總合約。此交易記錄是不可變的,就像以太坊區塊鏈一樣,並構成了 ZK-rollup 鏈。
ZK-rollup 的核心架構由以下元件組成:
-
鏈上合約:如前所述,ZK-rollup 協定由在以太坊上運行的智能合約控制。這包括儲存匯總區塊、追蹤存款和監控狀態更新的主合約。另一個鏈上合約(驗證者合約)驗證區塊生產者提交的零知識證明。因此,以太坊作為 ZK-rollup 的基礎層或「第一層 (L1)」。
-
鏈下虛擬機 (VM):雖然 ZK-rollup 協定存在於以太坊上,但交易執行和狀態儲存發生在獨立於 EVM 的獨立虛擬機上。這個鏈下虛擬機是 ZK-rollup 上交易的執行環境,並作為 ZK-rollup 協定的次要層或「第二層 (L2)」。在以太坊主網上驗證的有效性證明保證了鏈下虛擬機中狀態轉換的正確性。
ZK-rollup 是「混合擴容解決方案」——獨立運作但從以太坊獲得安全性的鏈下協定。具體來說,以太坊網路強制執行 ZK-rollup 上狀態更新的有效性,並保證匯總狀態每次更新背後資料的可用性。因此,ZK-rollup 比純鏈下擴容解決方案安全得多,例如負責自身安全屬性的側鏈,或同樣使用有效性證明在以太坊上驗證交易但將交易資料儲存在其他地方的 validium。
ZK-rollup 依賴以太坊主協定來實現以下功能:
資料可用性
ZK-rollup 將鏈下處理的每筆交易的狀態資料發佈到以太坊。有了這些資料,個人或企業就可以重現匯總的狀態並自行驗證該鏈。以太坊將這些資料作為 calldata 提供給網路的所有參與者。
ZK-rollup 不需要將大量交易資料發佈到鏈上,因為有效性證明已經驗證了狀態轉換的真實性。儘管如此,將資料儲存在鏈上仍然很重要,因為它允許對 L2 鏈的狀態進行無需許可的獨立驗證,這反過來又允許任何人提交交易批次,防止惡意營運者審查或凍結該鏈。
使用者與匯總互動需要鏈上資料。如果無法存取狀態資料,使用者就無法查詢其帳戶餘額或發起依賴狀態資訊的交易(例如提款)。
交易最終性
以太坊充當 ZK-rollup 的結算層:只有當 L1 合約接受有效性證明時,L2 交易才會已定案。這消除了惡意營運者破壞鏈(例如竊取匯總資金)的風險,因為每筆交易都必須在主網上獲得批准。此外,以太坊保證使用者操作一旦在 L1 上已定案就無法撤銷。
抗審查性
大多數 ZK-rollup 使用「超級節點」(營運者)來執行交易、產生批次並將區塊提交給 L1。雖然這確保了效率,但它增加了審查的風險:惡意的 ZK-rollup 營運者可以透過拒絕將使用者的交易包含在批次中來審查使用者。
作為一項安全措施,如果使用者認為自己受到營運者的審查,ZK-rollup 允許使用者直接將交易提交給主網上的匯總合約。這允許使用者強制從 ZK-rollup 退出到以太坊,而無需依賴營運者的許可。
ZK-rollup 如何運作?
交易
ZK-rollup 中的使用者簽署交易並提交給 L2 營運者進行處理並包含在下一個批次中。在某些情況下,營運者是一個中心化實體,稱為定序器,負責執行交易、將它們聚合到批次中並提交給 L1。該系統中的定序器是唯一被允許產生 L2 區塊並將匯總交易新增至 ZK-rollup 合約的實體。
其他 ZK-rollup 可能會透過使用權益證明 (PoS) 驗證者集來輪換營運者角色。潛在的營運者將資金存入匯總合約中,每次質押的規模會影響質押者被選中產生下一個匯總批次的機會。如果營運者有惡意行為,他們的質押可能會被罰沒,這會激勵他們發佈有效的區塊。
ZK-rollup 如何在以太坊上發佈交易資料
如前所述,交易資料作為 calldata 發佈在以太坊上。calldata 是智能合約中的一個資料區域,用於將參數傳遞給函式,其行為類似於記憶體。雖然 calldata 不作為以太坊狀態的一部分儲存,但它作為以太坊鏈歷史日誌 (opens in a new tab)的一部分保留在鏈上。calldata 不會影響以太坊的狀態,使其成為在鏈上儲存資料的一種廉價方式。
calldata 關鍵字通常標識交易正在呼叫的智能合約方法,並以任意位元組序列的形式保存該方法的輸入。ZK-rollup 使用 calldata 在鏈上發佈壓縮的交易資料;匯總營運者只需透過呼叫匯總合約中所需的函式來新增一個新批次,並將壓縮資料作為函式參數傳遞。這有助於降低使用者的成本,因為匯總費用的一大部分用於在鏈上儲存交易資料。
狀態承諾
ZK-rollup 的狀態(包括 L2 帳戶和餘額)表示為默克爾樹。默克爾樹根(默克爾根)的密碼學雜湊值儲存在鏈上合約中,允許匯總協定追蹤 ZK-rollup 狀態的變更。
在執行一組新交易後,匯總會轉換到新狀態。發起狀態轉換的營運者被要求計算新的狀態根並提交給鏈上合約。如果與批次關聯的有效性證明通過驗證者合約的驗證,新的默克爾根將成為 ZK-rollup 的規範狀態根。
除了計算狀態根之外,ZK-rollup 營運者還會建立一個批次根——包含批次中所有交易的默克爾樹的根。當提交新批次時,匯總合約會儲存批次根,允許使用者證明某筆交易(例如提款請求)包含在該批次中。使用者必須提供交易詳細資訊、批次根以及顯示包含路徑的默克爾證明。
有效性證明
ZK-rollup 營運者提交給 L1 合約的新狀態根是匯總狀態更新的結果。假設 Alice 發送 10 個代幣給 Bob,營運者只需將 Alice 的餘額減少 10,並將 Bob 的餘額增加 10。然後,營運者對更新後的帳戶資料進行雜湊運算,重建匯總的默克爾樹,並將新的默克爾根提交給鏈上合約。
但匯總合約不會自動接受提議的狀態承諾,直到營運者證明新的默克爾根是匯總狀態正確更新的結果。ZK-rollup 營運者透過產生有效性證明來做到這一點,這是一種簡潔的密碼學承諾,用於驗證批次交易的正確性。
有效性證明允許各方在不透露陳述本身的情況下證明陳述的正確性——因此,它們也被稱為零知識證明。ZK-rollup 使用有效性證明來確認鏈下狀態轉換的正確性,而無需在以太坊上重新執行交易。這些證明可以採用 零知識簡短非互動式知識論證 (ZK-SNARK) (opens in a new tab) 或 ZK-STARK (opens in a new tab)(零知識可擴展透明知識論證)的形式。
SNARK 和 STARK 都有助於證明 ZK-rollup 中鏈下運算的完整性,儘管每種證明類型都有其獨特的特徵。
ZK-SNARK
為了讓 ZK-SNARK 協定運作,建立共同參考字串 (CRS) 是必要的:CRS 為證明和驗證有效性證明提供公共參數。證明系統的安全性取決於 CRS 設置;如果用於建立公共參數的資訊落入惡意行為者手中,他們可能就能夠產生虛假的有效性證明。
一些 ZK-rollup 試圖透過使用涉及受信任個人的多方運算儀式 (MPC) (opens in a new tab) 來解決這個問題,以產生 ZK-SNARK 電路的公共參數。每一方都貢獻一些隨機性(稱為「有毒廢料」)來建構 CRS,他們必須立即銷毀這些隨機性。
使用可信設置是因為它們增加了 CRS 設置的安全性。只要有一位誠實的參與者銷毀了他們的輸入,ZK-SNARK 系統的安全性就能得到保證。儘管如此,這種方法需要信任參與者會刪除他們採樣的隨機性,並且不會破壞系統的安全保證。
撇開信任假設不談,ZK-SNARK 因其較小的證明大小和恆定時間驗證而受歡迎。由於 L1 上的證明驗證構成了營運 ZK-rollup 的較大成本,L2 使用 ZK-SNARK 來產生可以在主網上快速且廉價地驗證的證明。
ZK-STARK
與 ZK-SNARK 一樣,ZK-STARK 證明鏈下運算的有效性而不透露輸入。然而,由於其可擴展性和透明度,ZK-STARK 被認為是對 ZK-SNARK 的改進。
ZK-STARK 是「透明的」,因為它們可以在沒有共同參考字串 (CRS) 的可信設置的情況下運作。相反,ZK-STARK 依賴可公開驗證的隨機性來設置產生和驗證證明的參數。
ZK-STARK 還提供了更高的可擴展性,因為證明和驗證有效性證明所需的時間與底層運算的複雜性呈_擬線性_增加。對於 ZK-SNARK,證明和驗證時間與底層運算的大小呈_線性_擴展。這意味著當涉及大型資料集時,ZK-STARK 證明和驗證所需的時間比 ZK-SNARK 少,使其適用於高容量應用程式。
ZK-STARK 對量子電腦也是安全的,而 ZK-SNARK 中使用的橢圓曲線密碼學 (ECC) 普遍被認為容易受到量子運算攻擊。ZK-STARK 的缺點是它們產生的證明大小較大,在以太坊上驗證的成本更高。
有效性證明在 ZK-rollup 中如何運作?
證明產生
在接受交易之前,營運者將執行常規檢查。這包括確認:
- 發送者和接收者帳戶是狀態樹的一部分。
- 發送者有足夠的資金來處理交易。
- 交易正確且與匯總上發送者的公鑰相符。
- 發送者的隨機數正確等。
一旦 ZK-rollup 節點有足夠的交易,它就會將它們聚合到一個批次中,並編譯證明電路的輸入,以編譯成簡潔的零知識證明。這包括:
- 包含批次中所有交易的默克爾樹根。
- 交易的默克爾證明,以證明包含在批次中。
- 交易中每個發送者-接收者對的默克爾證明,以證明這些帳戶是匯總狀態樹的一部分。
- 一組中間狀態根,源自於在為每筆交易應用狀態更新(即減少發送者帳戶和增加接收者帳戶)後更新狀態根。
證明電路透過「循環」每筆交易並執行營運者在處理交易之前完成的相同檢查來計算有效性證明。首先,它使用提供的默克爾證明驗證發送者的帳戶是現有狀態根的一部分。然後它減少發送者的餘額,增加他們的隨機數,對更新後的帳戶資料進行雜湊運算,並將其與默克爾證明結合以產生新的默克爾根。
這個默克爾根反映了 ZK-rollup 狀態的唯一變更:發送者餘額和隨機數的變更。這是可能的,因為用於證明帳戶存在的默克爾證明被用來推導新的狀態根。
證明電路對接收者的帳戶執行相同的過程。它檢查接收者的帳戶是否存在於中間狀態根下(使用默克爾證明),增加他們的餘額,重新對帳戶資料進行雜湊運算,並將其與默克爾證明結合以產生新的狀態根。
該過程對每筆交易重複進行;每個「循環」都會從更新發送者的帳戶建立一個新的狀態根,並從更新接收者的帳戶建立隨後的新根。如前所述,對狀態根的每次更新都代表匯總狀態樹的一部分發生變更。
零知識證明電路迭代整個交易批次,驗證在最後一筆交易執行後產生最終狀態根的更新序列。計算出的最後一個默克爾根成為 ZK-rollup 最新規範的狀態根。
證明驗證
在證明電路驗證狀態更新的正確性之後,L2 營運者將計算出的有效性證明提交給 L1 上的驗證者合約。合約的驗證電路驗證證明的有效性,並檢查構成證明一部分的公共輸入:
-
前狀態根:ZK-rollup 的舊狀態根(即在執行批次交易之前),反映 L2 鏈最後已知的有效狀態。
-
後狀態根:ZK-rollup 的新狀態根(即在執行批次交易之後),反映 L2 鏈的最新狀態。後狀態根是在證明電路中應用狀態更新後推導出的最終根。
-
批次根:批次的默克爾根,透過將批次中的交易_默克爾化_並對樹的根進行雜湊運算而推導出來。
-
交易輸入:與作為提交批次一部分執行的交易相關聯的資料。
如果證明滿足電路(即它是有效的),這意味著存在一系列有效的交易,將匯總從先前的狀態(由前狀態根進行密碼學指紋識別)轉換到新狀態(由後狀態根進行密碼學指紋識別)。如果前狀態根與儲存在匯總合約中的根相符,並且證明有效,則匯總合約從證明中獲取後狀態根,並更新其狀態樹以反映匯總變更後的狀態。
進入和退出
使用者透過將代幣存入部署在 L1 鏈上的匯總合約中來進入 ZK-rollup。該交易會排隊,因為只有營運者才能將交易提交給匯總合約。
如果待處理的存款佇列開始填滿,ZK-rollup 營運者將獲取存款交易並將其提交給匯總合約。一旦使用者的資金進入匯總,他們就可以透過將交易發送給營運者進行處理來開始交易。使用者可以透過對其帳戶資料進行雜湊運算,將雜湊值發送給匯總合約,並提供默克爾證明以針對當前狀態根進行驗證,從而驗證匯總上的餘額。
從 ZK-rollup 提款到 L1 非常簡單。使用者透過將其在匯總上的資產發送到指定帳戶進行銷毀來發起退出交易。如果營運者將該交易包含在下一個批次中,使用者可以向鏈上合約提交提款請求。此提款請求將包含以下內容:
-
證明使用者的交易包含在交易批次中發送至銷毀帳戶的默克爾證明
-
交易資料
-
批次根
-
接收存入資金的 L1 地址
匯總合約對交易資料進行雜湊運算,檢查批次根是否存在,並使用默克爾證明檢查交易雜湊值是否為批次根的一部分。之後,合約執行退出交易並將資金發送到使用者在 L1 上選擇的地址。
ZK-rollup 和 EVM 相容性
與樂觀匯總不同,ZK-rollup 並不輕易相容於以太坊虛擬機 (EVM)。在電路中證明通用 EVM 運算比證明簡單運算(如前面描述的代幣轉帳)更困難且更耗費資源。
然而,零知識技術的進步 (opens in a new tab)正在重新點燃人們對將 EVM 運算包裝在零知識證明中的興趣。這些努力旨在建立一個零知識 EVM (zkEVM) 實作,可以有效地驗證程式執行的正確性。zkEVM 重新建立現有的 EVM 操作碼以在電路中進行證明/驗證,從而允許執行智能合約。
就像 EVM 一樣,zkEVM 在對某些輸入執行運算後會在狀態之間轉換。不同之處在於,zkEVM 還會建立零知識證明來驗證程式執行中每個步驟的正確性。有效性證明可以驗證涉及虛擬機狀態(記憶體、堆疊、儲存)的操作以及運算本身的正確性(即,操作是否呼叫了正確的操作碼並正確執行了它們?)。
引入相容 EVM 的 ZK-rollup 預計將幫助開發人員利用零知識證明的可擴展性和安全保證。更重要的是,與原生以太坊基礎設施的相容性意味著開發人員可以使用熟悉(且經過實戰測試)的工具和語言來建構對 ZK 友好的去中心化應用程式 (dapp)。
ZK-rollup 費用如何運作?
使用者在 ZK-rollup 上為交易支付多少費用取決於 Gas 費,就像在以太坊主網上一樣。然而,Gas 費在 L2 上的運作方式不同,並受以下成本影響:
-
狀態寫入:寫入以太坊狀態(即在以太坊區塊鏈上提交交易)有固定成本。ZK-rollup 透過批次處理交易並將固定成本分攤給多個使用者來降低此成本。
-
資料發佈:ZK-rollup 將每筆交易的狀態資料作為
calldata發佈到以太坊。calldata成本目前受 EIP-1559 (opens in a new tab) 管轄,該提案規定calldata的非零位元組成本為 16 單位燃料,零位元組成本為 4 單位燃料。每筆交易支付的成本受其需要在鏈上發佈多少calldata的影響。 -
L2 營運者費用:這是支付給匯總營運者的金額,作為處理交易所產生運算成本的補償,非常類似於以太坊主網上的交易「優先費(小費)」。
-
證明產生和驗證:ZK-rollup 營運者必須為交易批次產生有效性證明,這是資源密集型的。在主網上驗證零知識證明也需要花費燃料(約 500,000 單位燃料)。
除了批次處理交易之外,ZK-rollup 還透過壓縮交易資料來降低使用者的費用。你可以查看即時概覽 (opens in a new tab),了解使用以太坊 ZK-rollup 的成本。
ZK-rollup 如何擴展以太坊?
交易資料壓縮
ZK-rollup 透過將運算移至鏈下來擴展以太坊基礎層的吞吐量,但擴容的真正推動力來自於壓縮交易資料。以太坊的區塊大小限制了每個區塊可以容納的資料,進而限制了每個區塊處理的交易數量。透過壓縮與交易相關的資料,ZK-rollup 顯著增加了每個區塊處理的交易數量。
ZK-rollup 可以比樂觀匯總更好地壓縮交易資料,因為它們不必發佈驗證每筆交易所需的所有資料。它們只需發佈重建匯總上帳戶和餘額最新狀態所需的最少資料。
遞迴證明
零知識證明的一個優點是證明可以驗證其他證明。例如,單個 ZK-SNARK 可以驗證其他 ZK-SNARK。這種「證明的證明」被稱為遞迴證明,並顯著增加了 ZK-rollup 的吞吐量。
目前,有效性證明是逐塊產生的,並提交給 L1 合約進行驗證。然而,驗證單個區塊證明限制了 ZK-rollup 可以實現的吞吐量,因為當營運者提交證明時,只能將一個區塊已定案。
然而,遞迴證明使得用一個有效性證明將幾個區塊已定案成為可能。這是因為證明電路遞迴地聚合多個區塊證明,直到建立一個最終證明。L2 營運者提交這個遞迴證明,如果合約接受它,所有相關的區塊將立即已定案。有了遞迴證明,可以定期在以太坊上已定案的 ZK-rollup 交易數量就會增加。
ZK-rollup 的優缺點
| 優點 | 缺點 |
|---|---|
| 有效性證明確保鏈下交易的正確性,並防止營運者執行無效的狀態轉換。 | 與計算和驗證有效性證明相關的成本很高,並且可能會增加匯總使用者的費用。 |
| 提供更快的交易最終性,因為一旦在 L1 上驗證了有效性證明,狀態更新就會獲得批准。 | 由於零知識技術的複雜性,建構相容 EVM 的 ZK-rollup 很困難。 |
| 依賴無須信任的密碼學機制來確保安全,而不是像樂觀匯總那樣依賴受激勵參與者的誠實。 | 產生有效性證明需要專門的硬體,這可能會鼓勵少數幾方對鏈進行中心化控制。 |
| 在 L1 上儲存恢復鏈下狀態所需的資料,這保證了安全性、抗審查性和去中心化。 | 中心化營運者(定序器)可以影響交易的排序。 |
| 使用者受益於更高的資金效率,並且可以毫無延遲地從 L2 提款。 | 硬體要求可能會減少能夠強制鏈取得進展的參與者數量,從而增加惡意營運者凍結匯總狀態和審查使用者的風險。 |
| 不依賴活躍度假設,使用者不必驗證鏈來保護他們的資金。 | 某些證明系統(例如 ZK-SNARK)需要可信設置,如果處理不當,可能會損害 ZK-rollup 的安全模型。 |
更好的資料壓縮有助於降低在以太坊上發佈 calldata 的成本,並將使用者的匯總費用降至最低。 |
ZK-rollup 的視覺化解釋
觀看 Finematics 解釋 ZK-rollup:
誰在致力於 zkEVM?
用於 L2 與 L1 的 zkEVM
致力於 zkEVM 的專案包括:
-
zkEVM (opens in a new tab) - zkEVM 是一個由以太坊基金會資助的專案,旨在開發相容 EVM 的 ZK-rollup 以及為以太坊區塊產生有效性證明的機制。
-
Polygon zkEVM (opens in a new tab) - 是以太坊主網上的一個去中心化 ZK-rollup,致力於零知識以太坊虛擬機 (zkEVM),以透明的方式執行以太坊交易,包括具有零知識證明驗證的智能合約。
-
Scroll (opens in a new tab) - Scroll 是一家技術驅動型公司,致力於為以太坊建構原生的 zkEVM 第二層 (L2) 解決方案。
-
Taiko (opens in a new tab) - Taiko 是一個去中心化、等效於以太坊的 ZK-rollup(第 1 類 ZK-EVM (opens in a new tab))。
-
ZKsync (opens in a new tab) - ZKsync Era 是由 Matter Labs 建構的相容 EVM 的 ZK-rollup,由其自有的 zkEVM 提供支援。
-
Starknet (opens in a new tab) - Starknet 是由 StarkWare 建構的相容 EVM 的第二層 (L2) 擴容解決方案。
-
Morph (opens in a new tab) - Morph 是一種混合匯總擴容解決方案,利用零知識證明來解決第二層 (L2) 狀態挑戰問題。
-
Linea (opens in a new tab) - Linea 是由 ConsenSys 建構的等效於以太坊的 zkEVM 第二層 (L2),與以太坊生態系統完全一致。
關於 ZK-rollup 的進一步閱讀
- 什麼是零知識匯總? (opens in a new tab)
- 什麼是零知識匯總? (opens in a new tab)
- 以太坊匯總實用指南 (opens in a new tab)
- STARK 與 SNARK (opens in a new tab)
- 什麼是 zkEVM? (opens in a new tab)
- ZK-EVM 類型:等效於以太坊、等效於 EVM、第 1 類、第 4 類和其他神秘的流行語 (opens in a new tab)
- zkEVM 簡介 (opens in a new tab)
- 什麼是 ZK-EVM L2? (opens in a new tab)
- Awesome-zkEVM 資源 (opens in a new tab)
- 深入了解 ZK-SNARK (opens in a new tab)
- SNARK 是如何實現的? (opens in a new tab)
教學:以太坊上的隱私與零知識
- 使用零知識實現秘密狀態 – 如何使用零知識證明和鏈下伺服器元件在鏈上維護秘密遊戲狀態。
- 使用隱形地址 – ERC-5564 隱形地址如何使用密碼學金鑰衍生來實現匿名的 ETH 轉帳。
- 使用以太坊進行 Web2 驗證 – 如何將以太坊錢包簽章與基於 SAML 的 Web2 驗證系統整合。