zkRollup原理與架構

進階5/7/2024, 1:51:10 AM
隨着zk虛擬機的發展和成熟,支持任意智能合約的圖靈完備執行已經成爲可能。zkRollup的潛力將被真正釋放,實現打破區塊鏈三難困境的願景。

Rollup 概述

Rollup 是一類區塊鏈 Layer 擴展解決方案。在 Rollup 方案中,項目運營商在擴展的主鏈(即 Layer 1)之下運行一個相對獨立的 Layer 平台。用戶可以在 Layer 平台上執行合約或劃轉代幣。

Layer 平台的安全性由其所依賴的 Layer 1 區塊鏈來保證。當 Layer 中生成新的區塊時,來自 Layer 區塊的交易信息以及 Layer 的交易後狀態根將被捆綁爲 Rollup 交易並發布在 Layer 1 鏈上。實際的交易執行和狀態變化都是在主鏈下面的 Layer 平台上處理的,Layer 1 只需要驗證 Layer 狀態轉換的正確性。由於驗證狀態轉換正確性的成本遠低於執行這些Layer 1,Layer上的交易可以實現Layer 1平台的擴展。與 Layer 1 相比,Layer 平台可以提供更高的交易吞吐量和更低的交易成本,同時保持同等的安全性。

相比其他鏈下交易方案,Rollups 有兩大特點:

  • Layer 狀態數據的可用性是通過將其存儲在主鏈上來解決的。Layer 平台在主鏈上的區塊中記錄所有交易信息或完整的 Layer 狀態變化。如果 Layer 狀態丟失,任何人都可以從主鏈上存儲的信息中恢復丟失的狀態。
  • Rollup方案中,打包存儲在主鏈上的 Layer 狀態根變化需要通過某種方式在主鏈上進行驗證。經過驗證後,Layer 的狀態將被鎖定在 Layer 1 主鏈上。因此,在安全驗證方案的條件下,Layer 可以享受與 Layer 1 相同級別的安全性。

基於主鏈對 Layer 狀態更新的驗證方式,目前Rollup技術方案主要有兩類。一是樂觀匯總(Optimistic Rollup)。在此類方案中,主鏈合約不會直接驗證 Layer 提交的新狀態,而是爲每個提交的新狀態準備一個質疑期。由於Rollup將所有交易信息提交到主鏈並公開,因此任何人都可以驗證狀態更新(尤其是當更新涉及自己的錢包時)。如果新狀態不正確,驗證者可以針對該錯誤狀態生成欺詐證明並在質疑期內提交,從而使不正確的狀態更新無效。

另一種 Rollup 解決方案是 zk Rollup。在此類方案中,執行 Layer 狀態更新後,Layer 的操作者必須提供狀態更新正確性的零知識證明,並將其與狀態更新一起提交到主鏈。主鏈上的合約將驗證證明以確定狀態更新的正確性。

與樂觀匯總方案相比,zk Rollup 不需要漫長的質疑期來最終確認Layer 上的交易,並且可以更快地得到確認。此外,zk Rollup 並不依賴於這樣的假設:網路中總會有誠實的驗證者,當欺詐發生時,他們會及時提交欺詐證明。但同時,zk Rollup也面臨着零知識證明技術計算成本高、復雜度高、開發難度大等問題,這些阻礙了zk Rollup技術在Rollups中的實際落地。隨着近兩年零知識證明技術的進一步發展,人們正逐漸克服這些障礙。zk Rollup 技術開始在 Layer 市場佔據越來越大的份額。

如下圖所示,在 Rollup Layer 擴展領域,zkRollup已經佔據了一半以上的領地,並且正在快速發展。

來源https://l2beat.com/scaling/summary

數據檢索日期:2024年1月18日

從專業化 zkRollup 到通用化 zkRollup

zkRollup的發展過程主要經歷了兩個階段。第一種是非通用的 zkRollup,第二種是能夠執行圖靈完備任意合約的通用 zkRollup。

這兩類 zkRollup 技術的區別主要在於 Layer 平台是執行平台提供商編寫的有限專門邏輯,還是用戶在交易中編寫的任意智能合約邏輯。

在非通用的 zkRollup 項目中(如上圖中排名第 8 的 zkSync Lite),用戶只能進行少數類型的交易操作,如 FT(可替代代幣)轉帳、支付、互換和 NFT(不可替代代幣)轉帳。這些操作的事務邏輯只能由項目所有者定義和實現。

通過這樣的zkRollup項目,我們能以比以太坊主網低得多的費用進行轉帳,並獲得更高的交易吞吐量。然而,如果我們想在鏈上嘗試一些有趣的合約,我們將無法做到。

爲什麼專用的 zkRollups 不能讓用戶部署並使用自己的智能合約?這就需要我們回到 zkRollup 本身的證明架構。

爲了確保 Layer 的狀態轉換正確且可信,在zkRollup中,所有 Layer 狀態轉換邏輯都需要編寫爲零知識證明電路並由 Layer 1 合約進行驗證。只有通過驗證才能被 Layer 1 接受並最終完成Rollup。這個過程需要zkRollup平台的所有交易執行邏輯都在零知識證明電路中得到驗證。然而,在零知識證明電路中支持任意合約邏輯的執行是一個挑戰(造成這種困難的原因將在本文後面解釋)。因此,早期的 zkRollup 項目往往只支持有限數量的相對簡單的交易。

只能執行固定數量的簡單交易顯然不符合我們對 zkRollup 的期望。幸運的是,zkVM(零知識虛擬機)技術解決了在零知識證明電路內證明任意圖靈完備代碼執行的困難,使得通用的 zkRollup 平台成爲可能。接下來,本文將介紹zkVM的實現原理,讓讀者了解通用zkRollup技術中最核心的部分是如何運作的。

zkVM的實現原理

在介紹zkVM原理之前,我們先簡單介紹一下零知識證明技術。在這裏,我們不需要詳細了解零知識證明的底層數學原理,而是只需了解零知識證明可以做什麼、如何使用它們以及其專用證明電路所施加的限制就足夠了。

零知識證明簡介

zkRollup 中的零知識證明用於證明 Layer 上交易已正確執行以及 Layer 狀態已正確更新。

爲了實現這一目的,zkVM電路需要證明部署在 Layer 上的任何智能合約都已正確執行。在介紹zkVM的原理之前,我們需要先討論一下零知識證明的作用及其工作原理。

爲什麼需要零知識證明

零知識證明是一種密碼學原語,它允許證明者讓驗證者相信陳述的正確性,而無需向驗證者透露任何其他信息。

零知識證明具有三個核心屬性:

  • 完整性:如果要證明的陳述是正確的,誠實的驗證者(即正確遵循協議的驗證者)將被誠實的證明者確信這一事實。
  • 可靠性:如果要證明的陳述是錯誤的,則不誠實的證明者只有微乎其微的機會讓誠實的驗證者相信該陳述是正確的。
  • 零知識:除了陳述真實外,驗證者無法從驗證過程中獲得任何其他信息。

憑藉零知識證明的完備性,當證明者完成復雜的計算時,他們可以產生一個證明,使驗證者相信從輸入數據得到的輸出數據是執行者提供的結果。零知識證明的健全性確保當執行者提供錯誤結果時,他們無法生成有效的證明。

因此,憑藉零知識證明的完整性和健全性,我們可以放心地將這些復雜的計算外包給其他人,並通過相對簡單的驗證過程來驗證計算是否正確,而不需要信任外包方。

廣泛使用的zk-SNARK方案除了具備零知識證明的三大核心特性外,還具有簡潔性的特點。這意味着對於使用零知識證明證明的任何復雜邏輯,生成的證明的大小和驗證證明所需的時間都是固定的並且相對較小。這使得 zk-Rollup 能夠將狀態更新計算卸載到鏈下,只驗證鏈上操作的正確性,從而使擴容解決方案變得可行。

零知識證明的過程

接下來,本文將以下面的簡單計算爲例,講解零知識證明的過程。

c=a²+b+5

爲了解釋零知識證明中的零知識方面,我們將變量a和c設置爲該零知識證明的公共值,b作爲只有證明者知道的祕密輸入。由於我們的計算非常簡單,驗證者可以輕鬆地從公共值中推斷出祕密輸入的值。這並不影響零知識證明方法本身的零知識屬性,因爲它僅保證驗證者無法從證明過程中獲取有關祕密輸入的信息。

證明時,證明者首先分別選擇a和b的值作爲輸入,並計算c的值。這裏,我們設置a = 3,b = 2,然後c = 16。完成所有計算後,證明者可以爲這些值和操作生成零知識證明。

完成證明後,證明者將向驗證者提供證明的公共輸入(即a和c的值)以及零知識證明。

收到證明後,驗證者可以通過驗證零知識證明,確信證明者使用了祕密輸入 b,這使得當 a = 3 且 c = 16(即公共輸入值)時上述公式成立。 ),並且無法獲得公衆輸入之外的任何信息(a = 3,c = 16)。

在文章的下一部分,我們將介紹具體的證明過程。當我們需要使用零知識證明方法來證明一個計算時,我們首先需要將計算表示爲零知識證明算法可以接受的算術電路的形式。算術電路是圖靈完備的計算表示。顧名思義,算術電路是由執行算術運算的門組成的計算電路。在我們的例子中,轉換結果如圖所示。您可能會注意到,除了我們提到的公共輸入 a 和 c 以及祕密輸入 b 之外,還有兩個附加值 d 和 e。這些是計算過程中使用的中間變量。

我們可以將算術電路中的每條線視爲一個值,它可以是公共輸入、祕密輸入或中間變量。將計算擴展爲算術電路後,每個中間變量將有其位置並用於證明過程。它們與輸入之間的唯一區別是它們的值不是由證明者直接輸入,而是由算術電路中的其他輸入值確定。

我們可以把算術電路看成兩部分:一部分是電路中出現的所有數值,另一部分是這些值之間的關係(約束)。我們通常將電路中的公共輸入稱爲陳述(在我們的示例中爲 a 和 c),並將所有其他值,包括祕密輸入 (b) 和中間變量(d 和 e)稱爲見證。

根據電路的邏輯,當我們有公共輸入作爲陳述,祕密輸入作爲見證時,我們就可以計算出電路中所有的見證值。

因此,運算電路的門電路也可以表示爲以下形式:

陳述:

一個,c

證人:

乙、丁、乙

約束:

d = a * a

e = b + 5

c = d + e

當待證明的電路被算術化後,零知識證明算法需要處理電路的約束,並將其轉換爲算法所需的形式,以生成和驗證證明。經過處理後,電路產生一個與電路大小無關的固定長度的驗證密鑰(VK, Verification Key)。驗證者可以通過驗證密鑰來驗證相應電路的零知識證明。驗證密鑰有點類似於對電路的承諾。如果約束條件發生變化,相應的驗證密鑰也會發生變化。

在實際應用中,零知識證明的使用者需要將自己需要的邏輯寫入zk電路原始碼中,並通過審計生成相應的VK。這個VK交給驗證者。證明者證明的公共輸入以及生成的證明一起被提交,驗證者可以驗證這些公共輸入是否滿足約束。在此示例中,證明者可以使用 a、b 和 c 的值生成證明。驗證者無需執行此操作即可驗證a2 + b是否等於C。

零知識證明電路的局限性

雖然zk電路是圖靈完備的並且可以表示任何計算,但由於需要將計算轉換爲算術電路的特殊表示形式,因此在編寫算術電路時存在一些額外的限制。

在我們比較熟悉的計算機程序中,我們可以通過if-else陳述來控制程序執行的分支。僅執行程序中選定的分支。然而,在零知識證明過程中,計算被扁平化爲電路,並且不存在執行路徑或控制流的概念。因此,我們無法選擇在算術電路中執行的特定分支。

當然,這並不意味着我們不能在電路中使用分支和選擇。它只是意味着在電路中,所有分支,無論是否被選擇,都將被執行並有助於證明的產生。分支的選擇僅影響哪個分支的結果將輸出到下一個變量。

以下面操作爲例:

If (flag) {

c = x + x

}else {

c = x * x

}

當這個運算轉換成運算電路時,就會轉換成如下所示的約束條件。顯然,兩個新見證人 temp1 和 temp2 將添加到電路中。此外,值x+x 和價值x*x 都會被計算。

也就是說,在 zk 電路中,所有分支和邏輯都將被計算,無論它們是否被執行。

temp1 = x + x

temp2 = x * x

c = flag temp1 + (1-flag) temp2

由於這些限制,在零知識證明電路中支持條件選擇非常困難。如何在零知識證明中證明具有多種變化的智能合約邏輯的執行路徑是zk虛擬機面臨的主要挑戰之一。

證明任何程序的執行——證明電路中的通用狀態機

來源https://github.com/0xPolygonHermez/zkevm-doc/blob/main/mkdocs/docs/zkEVM/zkProver/Verifiable-Computations/figures/simple-state-machine-overview-PC.pdf.png

我們通過通用狀態機模型來描述虛擬機。VM 是一種狀態機,在處理指令時轉換狀態。讓我們用一個非常簡單的狀態機示例來說明如何通過零知識電路來證明虛擬機。

我們假設這個通用狀態機具有通用寄存器(A 和 B),此外還有一個存儲當前指令號的程序計數器寄存器。

執行指令前寄存器的狀態

下圖展示了ZK虛擬機證明電路的基本工作流程:

狀態0可以認爲是這個虛擬機運行前的初始狀態。初始狀態經過總共 m 條指令後,達到最終狀態 m。除了初始狀態之外,這個虛擬機還有兩個常規輸入表:

  • 字節碼表:存儲狀態機中執行的程序。
  • I/O表:存儲虛擬機執行過程中產生的所有輸入和輸出。

圖中,第n條指令的執行過程被抽象出來並顯示在左側。執行第 n 條指令後,狀態機的狀態(狀態 n)轉換爲狀態 n+1。同樣的電路,經過m次迭代,實現了vm中m條指令的執行。

這裏有兩個問題。

一是如何在固定電路內執行不同的指令?在執行合約字節碼時,無法確定執行的第n條指令是什麼,因此無法確定這裏的實際電路邏輯。

第二是如何證明要執行的指令數不是m?

對於第一個問題,解決方案是實現電路中所有可能指令的邏輯。然後使用選擇器,根據指令選擇其中一個作爲下一個狀態,類似於前面提到的專用電路中的 if-else。

對於第二個問題,我們不能直接改變電路中的指令數量。這是因爲電路中的每條指令都需要獨立的電路段來實現。如果指令數量增加或減少,電路就會改變,相應的驗證密鑰也會改變。這使得無法滿足驗證固定電路中任何邏輯的要求。

爲了解決這個問題,可以在指令集中添加一條不會改變狀態的noop指令。因此,每個固定電路可以執行的指令數量是有上限的。zkVM 的電路可以看作是一個具有固定數量指令槽的容器。如果需要更多指令,則需要更大的電路。實際證明中,可根據需要選擇合適尺寸的電路。

證明一條基本指令

下面以一些基本的計算指令爲例,說明電路中的基本指令是如何被證明的:

圖片來源

上圖爲指令驗證電路的流程圖。下面的公式是證明的電路約束。

這兩個約束可以證明右上角列出的通用寄存器A和B的幾個基本指令。這些證明可以將輸入表中的值或指令中的立即值加載到寄存器中,或者將寄存器 A 和 B 中的值相加並將它們寫回到寄存器中。

從圖中我們可以看到,爲了構建狀態變化的約束,電路引入了一些輔助控制狀態:

這些輔助寄存器和通用寄存器之間的計算邏輯通過以下公式實現。有興趣的讀者可以將相應的值代入約束公式中進行驗證。可見,有了這兩個約束,就可以實現基本的算術加法指令了。如果需要更多的操作,則必須添加更多的指令約束。

回到基本流程圖,我們可以將本節的計算電路看成是整個流程中的一條指令。選擇器將選擇它產生的結果是否是狀態機要採用的下一個狀態。本節電路所需的輔助狀態由PC寄存器指向的指令產生。

指令檢索是通過專門的查找電路實現的,可以證明通過索引從固定表中檢索到一段數據。因此,zkVM電路可以證明PC指定的虛擬機執行的狀態轉換。

證明條件判斷和控制流跳轉

狀態機執行復雜邏輯的能力依賴於條件和跳轉指令。在實際合約中,我們經常需要處理根據條件改變執行路徑的邏輯,所以這樣的電路是必要的。

這裏需要注意的是,zkVM 電路並不是真正執行合約邏輯並計算結果的模塊。zkVM電路實際上所做的就是證明合約邏輯的計算過程。因此,在證明時,需要將實際執行的指令序列過程填充到電路中,通過電路驗證是否滿足本次跳轉的條件,進而證明執行的指令流程做出了正確的跳轉。

首先我們介紹一下條件判斷的證明:

以判斷第i條指令中的操作數是否爲零爲例。我們爲判斷結果添加一個輔助狀態isZero。如果判斷值爲0,則輔助狀態isZero的值爲1;如果判斷的值爲0以外的任何其他值,則isZero爲0。

這個過程受到圖中兩個公式的約束。

該約束的有效性與零知識證明中使用的橢圓曲線的數學特性有關。零知識證明電路中的每個值都是橢圓曲線上有限域內的元素。如果它的值不爲 0,則必須存在一個逆元素,該元素與自身相乘時結果爲 1。使用此屬性,結合圖中的兩個約束,可以驗證一個值是否爲零並將其轉換爲輔助狀態。

一旦我們有了這個 isZero 條件輔助狀態,我們就可以繼續條件跳轉指令的證明:

回到基本流程圖,如果當前指令是條件跳轉指令。它首先進行isZero檢查,判斷是否滿足跳轉條件,然後修改PC的值。更新PC的值後,執行下一條指令首先會根據PC進行查找,找到跳轉後的指令。

I/O 和復雜操作

當使用通用狀態機證明電路時,爲了正確處理狀態轉換,需要在單個狀態轉換期間爲每個支持的指令添加相應的控制狀態和約束。這些狀態值和約束的數量還必須乘以 zkVM 支持的指令數量。即使zkVM執行的實際程序(都是NOP)中沒有執行任何操作,這些狀態值和約束檢查也不能省略。

因此,使用本文前半部分的通用狀態機電路來執行復雜的計算是非常低效的。如果使用這些方法來實現復雜的計算,其性能很難讓人接受。此外,一般狀態機電路很難執行復雜的指令或直接與外界交互。

爲了解決這個問題,zkVM 的實際實現通常使用通用狀態機電路和專用證明電路的組合來分別證明程序的各個部分,然後將證明聚合到一個解決方案中。

圖片來源:1 2

左圖是Scroll項目的電路架構,右下角的圖是Polygon的電路架構。它們都採用類似的方法,如頂角的圖表所示。

通用狀態機負責證明程序的執行邏輯控制。在大多數合約中,這部分邏輯的實際執行時間很小,因此用低效的通用狀態機來證明從效率上來說還是可以接受的。

更固定的復雜計算,如哈希、MPT樹運算、外部輸入數據等,都是通過專門的電路來證明的。

通用狀態機和專用證明電路使用查找表進行交互。每次狀態機電路調用這些操作時,生成證明見證的模塊都會將調用參數和計算結果寫入查找表中。因此,狀態機電路中對這些操作的調用被簡化爲查找操作。

查找表中的每個調用和返回值的正確性都由專門的電路來約束和證明。

最後,電路中的復制約束連接狀態機電路、專用電路和查找表,檢查查找表中的每一項是否被相應的專用電路證明,最終生成完整塊的證明。

Layer 1 合約只需要驗證這個聚合證明即可確認整個虛擬機執行過程的正確性。

結語

零知識證明技術使得簡單、快速地證明計算成爲可能,爲在不信任的環境中外包計算過程打開了大門。這項技術運用在區塊鏈中,可以將執行從鏈上解放出來,讓主區塊鏈能夠專注於去中心化和安全問題。但專門的零知識證明電路僅執行固定邏輯的特性限制了區塊鏈上零知識證明的潛力,將早期 zkRollup 的功能限制在少數類型的交易上。

但隨着zk虛擬機的發展和成熟,支持任意智能合約的圖靈完備執行已經成爲可能。 zkRollup的潛力將被真正釋放,實現打破區塊鏈三難困境的願景。

聲明:

  1. 本文轉載自[ZAN],著作權歸屬原作者[ZAN and AntChain Open Labs],如對轉載有異議,請聯系Gate Learn團隊,團隊會根據相關流程盡速處理。
  2. 免責聲明:本文所表達的觀點和意見僅代表作者個人觀點,不構成任何投資建議。
  3. 文章其他語言版本由Gate Learn團隊翻譯, 在未提及Gate.io的情況下不得復制、傳播或抄襲經翻譯文章。

zkRollup原理與架構

進階5/7/2024, 1:51:10 AM
隨着zk虛擬機的發展和成熟,支持任意智能合約的圖靈完備執行已經成爲可能。zkRollup的潛力將被真正釋放,實現打破區塊鏈三難困境的願景。

Rollup 概述

Rollup 是一類區塊鏈 Layer 擴展解決方案。在 Rollup 方案中,項目運營商在擴展的主鏈(即 Layer 1)之下運行一個相對獨立的 Layer 平台。用戶可以在 Layer 平台上執行合約或劃轉代幣。

Layer 平台的安全性由其所依賴的 Layer 1 區塊鏈來保證。當 Layer 中生成新的區塊時,來自 Layer 區塊的交易信息以及 Layer 的交易後狀態根將被捆綁爲 Rollup 交易並發布在 Layer 1 鏈上。實際的交易執行和狀態變化都是在主鏈下面的 Layer 平台上處理的,Layer 1 只需要驗證 Layer 狀態轉換的正確性。由於驗證狀態轉換正確性的成本遠低於執行這些Layer 1,Layer上的交易可以實現Layer 1平台的擴展。與 Layer 1 相比,Layer 平台可以提供更高的交易吞吐量和更低的交易成本,同時保持同等的安全性。

相比其他鏈下交易方案,Rollups 有兩大特點:

  • Layer 狀態數據的可用性是通過將其存儲在主鏈上來解決的。Layer 平台在主鏈上的區塊中記錄所有交易信息或完整的 Layer 狀態變化。如果 Layer 狀態丟失,任何人都可以從主鏈上存儲的信息中恢復丟失的狀態。
  • Rollup方案中,打包存儲在主鏈上的 Layer 狀態根變化需要通過某種方式在主鏈上進行驗證。經過驗證後,Layer 的狀態將被鎖定在 Layer 1 主鏈上。因此,在安全驗證方案的條件下,Layer 可以享受與 Layer 1 相同級別的安全性。

基於主鏈對 Layer 狀態更新的驗證方式,目前Rollup技術方案主要有兩類。一是樂觀匯總(Optimistic Rollup)。在此類方案中,主鏈合約不會直接驗證 Layer 提交的新狀態,而是爲每個提交的新狀態準備一個質疑期。由於Rollup將所有交易信息提交到主鏈並公開,因此任何人都可以驗證狀態更新(尤其是當更新涉及自己的錢包時)。如果新狀態不正確,驗證者可以針對該錯誤狀態生成欺詐證明並在質疑期內提交,從而使不正確的狀態更新無效。

另一種 Rollup 解決方案是 zk Rollup。在此類方案中,執行 Layer 狀態更新後,Layer 的操作者必須提供狀態更新正確性的零知識證明,並將其與狀態更新一起提交到主鏈。主鏈上的合約將驗證證明以確定狀態更新的正確性。

與樂觀匯總方案相比,zk Rollup 不需要漫長的質疑期來最終確認Layer 上的交易,並且可以更快地得到確認。此外,zk Rollup 並不依賴於這樣的假設:網路中總會有誠實的驗證者,當欺詐發生時,他們會及時提交欺詐證明。但同時,zk Rollup也面臨着零知識證明技術計算成本高、復雜度高、開發難度大等問題,這些阻礙了zk Rollup技術在Rollups中的實際落地。隨着近兩年零知識證明技術的進一步發展,人們正逐漸克服這些障礙。zk Rollup 技術開始在 Layer 市場佔據越來越大的份額。

如下圖所示,在 Rollup Layer 擴展領域,zkRollup已經佔據了一半以上的領地,並且正在快速發展。

來源https://l2beat.com/scaling/summary

數據檢索日期:2024年1月18日

從專業化 zkRollup 到通用化 zkRollup

zkRollup的發展過程主要經歷了兩個階段。第一種是非通用的 zkRollup,第二種是能夠執行圖靈完備任意合約的通用 zkRollup。

這兩類 zkRollup 技術的區別主要在於 Layer 平台是執行平台提供商編寫的有限專門邏輯,還是用戶在交易中編寫的任意智能合約邏輯。

在非通用的 zkRollup 項目中(如上圖中排名第 8 的 zkSync Lite),用戶只能進行少數類型的交易操作,如 FT(可替代代幣)轉帳、支付、互換和 NFT(不可替代代幣)轉帳。這些操作的事務邏輯只能由項目所有者定義和實現。

通過這樣的zkRollup項目,我們能以比以太坊主網低得多的費用進行轉帳,並獲得更高的交易吞吐量。然而,如果我們想在鏈上嘗試一些有趣的合約,我們將無法做到。

爲什麼專用的 zkRollups 不能讓用戶部署並使用自己的智能合約?這就需要我們回到 zkRollup 本身的證明架構。

爲了確保 Layer 的狀態轉換正確且可信,在zkRollup中,所有 Layer 狀態轉換邏輯都需要編寫爲零知識證明電路並由 Layer 1 合約進行驗證。只有通過驗證才能被 Layer 1 接受並最終完成Rollup。這個過程需要zkRollup平台的所有交易執行邏輯都在零知識證明電路中得到驗證。然而,在零知識證明電路中支持任意合約邏輯的執行是一個挑戰(造成這種困難的原因將在本文後面解釋)。因此,早期的 zkRollup 項目往往只支持有限數量的相對簡單的交易。

只能執行固定數量的簡單交易顯然不符合我們對 zkRollup 的期望。幸運的是,zkVM(零知識虛擬機)技術解決了在零知識證明電路內證明任意圖靈完備代碼執行的困難,使得通用的 zkRollup 平台成爲可能。接下來,本文將介紹zkVM的實現原理,讓讀者了解通用zkRollup技術中最核心的部分是如何運作的。

zkVM的實現原理

在介紹zkVM原理之前,我們先簡單介紹一下零知識證明技術。在這裏,我們不需要詳細了解零知識證明的底層數學原理,而是只需了解零知識證明可以做什麼、如何使用它們以及其專用證明電路所施加的限制就足夠了。

零知識證明簡介

zkRollup 中的零知識證明用於證明 Layer 上交易已正確執行以及 Layer 狀態已正確更新。

爲了實現這一目的,zkVM電路需要證明部署在 Layer 上的任何智能合約都已正確執行。在介紹zkVM的原理之前,我們需要先討論一下零知識證明的作用及其工作原理。

爲什麼需要零知識證明

零知識證明是一種密碼學原語,它允許證明者讓驗證者相信陳述的正確性,而無需向驗證者透露任何其他信息。

零知識證明具有三個核心屬性:

  • 完整性:如果要證明的陳述是正確的,誠實的驗證者(即正確遵循協議的驗證者)將被誠實的證明者確信這一事實。
  • 可靠性:如果要證明的陳述是錯誤的,則不誠實的證明者只有微乎其微的機會讓誠實的驗證者相信該陳述是正確的。
  • 零知識:除了陳述真實外,驗證者無法從驗證過程中獲得任何其他信息。

憑藉零知識證明的完備性,當證明者完成復雜的計算時,他們可以產生一個證明,使驗證者相信從輸入數據得到的輸出數據是執行者提供的結果。零知識證明的健全性確保當執行者提供錯誤結果時,他們無法生成有效的證明。

因此,憑藉零知識證明的完整性和健全性,我們可以放心地將這些復雜的計算外包給其他人,並通過相對簡單的驗證過程來驗證計算是否正確,而不需要信任外包方。

廣泛使用的zk-SNARK方案除了具備零知識證明的三大核心特性外,還具有簡潔性的特點。這意味着對於使用零知識證明證明的任何復雜邏輯,生成的證明的大小和驗證證明所需的時間都是固定的並且相對較小。這使得 zk-Rollup 能夠將狀態更新計算卸載到鏈下,只驗證鏈上操作的正確性,從而使擴容解決方案變得可行。

零知識證明的過程

接下來,本文將以下面的簡單計算爲例,講解零知識證明的過程。

c=a²+b+5

爲了解釋零知識證明中的零知識方面,我們將變量a和c設置爲該零知識證明的公共值,b作爲只有證明者知道的祕密輸入。由於我們的計算非常簡單,驗證者可以輕鬆地從公共值中推斷出祕密輸入的值。這並不影響零知識證明方法本身的零知識屬性,因爲它僅保證驗證者無法從證明過程中獲取有關祕密輸入的信息。

證明時,證明者首先分別選擇a和b的值作爲輸入,並計算c的值。這裏,我們設置a = 3,b = 2,然後c = 16。完成所有計算後,證明者可以爲這些值和操作生成零知識證明。

完成證明後,證明者將向驗證者提供證明的公共輸入(即a和c的值)以及零知識證明。

收到證明後,驗證者可以通過驗證零知識證明,確信證明者使用了祕密輸入 b,這使得當 a = 3 且 c = 16(即公共輸入值)時上述公式成立。 ),並且無法獲得公衆輸入之外的任何信息(a = 3,c = 16)。

在文章的下一部分,我們將介紹具體的證明過程。當我們需要使用零知識證明方法來證明一個計算時,我們首先需要將計算表示爲零知識證明算法可以接受的算術電路的形式。算術電路是圖靈完備的計算表示。顧名思義,算術電路是由執行算術運算的門組成的計算電路。在我們的例子中,轉換結果如圖所示。您可能會注意到,除了我們提到的公共輸入 a 和 c 以及祕密輸入 b 之外,還有兩個附加值 d 和 e。這些是計算過程中使用的中間變量。

我們可以將算術電路中的每條線視爲一個值,它可以是公共輸入、祕密輸入或中間變量。將計算擴展爲算術電路後,每個中間變量將有其位置並用於證明過程。它們與輸入之間的唯一區別是它們的值不是由證明者直接輸入,而是由算術電路中的其他輸入值確定。

我們可以把算術電路看成兩部分:一部分是電路中出現的所有數值,另一部分是這些值之間的關係(約束)。我們通常將電路中的公共輸入稱爲陳述(在我們的示例中爲 a 和 c),並將所有其他值,包括祕密輸入 (b) 和中間變量(d 和 e)稱爲見證。

根據電路的邏輯,當我們有公共輸入作爲陳述,祕密輸入作爲見證時,我們就可以計算出電路中所有的見證值。

因此,運算電路的門電路也可以表示爲以下形式:

陳述:

一個,c

證人:

乙、丁、乙

約束:

d = a * a

e = b + 5

c = d + e

當待證明的電路被算術化後,零知識證明算法需要處理電路的約束,並將其轉換爲算法所需的形式,以生成和驗證證明。經過處理後,電路產生一個與電路大小無關的固定長度的驗證密鑰(VK, Verification Key)。驗證者可以通過驗證密鑰來驗證相應電路的零知識證明。驗證密鑰有點類似於對電路的承諾。如果約束條件發生變化,相應的驗證密鑰也會發生變化。

在實際應用中,零知識證明的使用者需要將自己需要的邏輯寫入zk電路原始碼中,並通過審計生成相應的VK。這個VK交給驗證者。證明者證明的公共輸入以及生成的證明一起被提交,驗證者可以驗證這些公共輸入是否滿足約束。在此示例中,證明者可以使用 a、b 和 c 的值生成證明。驗證者無需執行此操作即可驗證a2 + b是否等於C。

零知識證明電路的局限性

雖然zk電路是圖靈完備的並且可以表示任何計算,但由於需要將計算轉換爲算術電路的特殊表示形式,因此在編寫算術電路時存在一些額外的限制。

在我們比較熟悉的計算機程序中,我們可以通過if-else陳述來控制程序執行的分支。僅執行程序中選定的分支。然而,在零知識證明過程中,計算被扁平化爲電路,並且不存在執行路徑或控制流的概念。因此,我們無法選擇在算術電路中執行的特定分支。

當然,這並不意味着我們不能在電路中使用分支和選擇。它只是意味着在電路中,所有分支,無論是否被選擇,都將被執行並有助於證明的產生。分支的選擇僅影響哪個分支的結果將輸出到下一個變量。

以下面操作爲例:

If (flag) {

c = x + x

}else {

c = x * x

}

當這個運算轉換成運算電路時,就會轉換成如下所示的約束條件。顯然,兩個新見證人 temp1 和 temp2 將添加到電路中。此外,值x+x 和價值x*x 都會被計算。

也就是說,在 zk 電路中,所有分支和邏輯都將被計算,無論它們是否被執行。

temp1 = x + x

temp2 = x * x

c = flag temp1 + (1-flag) temp2

由於這些限制,在零知識證明電路中支持條件選擇非常困難。如何在零知識證明中證明具有多種變化的智能合約邏輯的執行路徑是zk虛擬機面臨的主要挑戰之一。

證明任何程序的執行——證明電路中的通用狀態機

來源https://github.com/0xPolygonHermez/zkevm-doc/blob/main/mkdocs/docs/zkEVM/zkProver/Verifiable-Computations/figures/simple-state-machine-overview-PC.pdf.png

我們通過通用狀態機模型來描述虛擬機。VM 是一種狀態機,在處理指令時轉換狀態。讓我們用一個非常簡單的狀態機示例來說明如何通過零知識電路來證明虛擬機。

我們假設這個通用狀態機具有通用寄存器(A 和 B),此外還有一個存儲當前指令號的程序計數器寄存器。

執行指令前寄存器的狀態

下圖展示了ZK虛擬機證明電路的基本工作流程:

狀態0可以認爲是這個虛擬機運行前的初始狀態。初始狀態經過總共 m 條指令後,達到最終狀態 m。除了初始狀態之外,這個虛擬機還有兩個常規輸入表:

  • 字節碼表:存儲狀態機中執行的程序。
  • I/O表:存儲虛擬機執行過程中產生的所有輸入和輸出。

圖中,第n條指令的執行過程被抽象出來並顯示在左側。執行第 n 條指令後,狀態機的狀態(狀態 n)轉換爲狀態 n+1。同樣的電路,經過m次迭代,實現了vm中m條指令的執行。

這裏有兩個問題。

一是如何在固定電路內執行不同的指令?在執行合約字節碼時,無法確定執行的第n條指令是什麼,因此無法確定這裏的實際電路邏輯。

第二是如何證明要執行的指令數不是m?

對於第一個問題,解決方案是實現電路中所有可能指令的邏輯。然後使用選擇器,根據指令選擇其中一個作爲下一個狀態,類似於前面提到的專用電路中的 if-else。

對於第二個問題,我們不能直接改變電路中的指令數量。這是因爲電路中的每條指令都需要獨立的電路段來實現。如果指令數量增加或減少,電路就會改變,相應的驗證密鑰也會改變。這使得無法滿足驗證固定電路中任何邏輯的要求。

爲了解決這個問題,可以在指令集中添加一條不會改變狀態的noop指令。因此,每個固定電路可以執行的指令數量是有上限的。zkVM 的電路可以看作是一個具有固定數量指令槽的容器。如果需要更多指令,則需要更大的電路。實際證明中,可根據需要選擇合適尺寸的電路。

證明一條基本指令

下面以一些基本的計算指令爲例,說明電路中的基本指令是如何被證明的:

圖片來源

上圖爲指令驗證電路的流程圖。下面的公式是證明的電路約束。

這兩個約束可以證明右上角列出的通用寄存器A和B的幾個基本指令。這些證明可以將輸入表中的值或指令中的立即值加載到寄存器中,或者將寄存器 A 和 B 中的值相加並將它們寫回到寄存器中。

從圖中我們可以看到,爲了構建狀態變化的約束,電路引入了一些輔助控制狀態:

這些輔助寄存器和通用寄存器之間的計算邏輯通過以下公式實現。有興趣的讀者可以將相應的值代入約束公式中進行驗證。可見,有了這兩個約束,就可以實現基本的算術加法指令了。如果需要更多的操作,則必須添加更多的指令約束。

回到基本流程圖,我們可以將本節的計算電路看成是整個流程中的一條指令。選擇器將選擇它產生的結果是否是狀態機要採用的下一個狀態。本節電路所需的輔助狀態由PC寄存器指向的指令產生。

指令檢索是通過專門的查找電路實現的,可以證明通過索引從固定表中檢索到一段數據。因此,zkVM電路可以證明PC指定的虛擬機執行的狀態轉換。

證明條件判斷和控制流跳轉

狀態機執行復雜邏輯的能力依賴於條件和跳轉指令。在實際合約中,我們經常需要處理根據條件改變執行路徑的邏輯,所以這樣的電路是必要的。

這裏需要注意的是,zkVM 電路並不是真正執行合約邏輯並計算結果的模塊。zkVM電路實際上所做的就是證明合約邏輯的計算過程。因此,在證明時,需要將實際執行的指令序列過程填充到電路中,通過電路驗證是否滿足本次跳轉的條件,進而證明執行的指令流程做出了正確的跳轉。

首先我們介紹一下條件判斷的證明:

以判斷第i條指令中的操作數是否爲零爲例。我們爲判斷結果添加一個輔助狀態isZero。如果判斷值爲0,則輔助狀態isZero的值爲1;如果判斷的值爲0以外的任何其他值,則isZero爲0。

這個過程受到圖中兩個公式的約束。

該約束的有效性與零知識證明中使用的橢圓曲線的數學特性有關。零知識證明電路中的每個值都是橢圓曲線上有限域內的元素。如果它的值不爲 0,則必須存在一個逆元素,該元素與自身相乘時結果爲 1。使用此屬性,結合圖中的兩個約束,可以驗證一個值是否爲零並將其轉換爲輔助狀態。

一旦我們有了這個 isZero 條件輔助狀態,我們就可以繼續條件跳轉指令的證明:

回到基本流程圖,如果當前指令是條件跳轉指令。它首先進行isZero檢查,判斷是否滿足跳轉條件,然後修改PC的值。更新PC的值後,執行下一條指令首先會根據PC進行查找,找到跳轉後的指令。

I/O 和復雜操作

當使用通用狀態機證明電路時,爲了正確處理狀態轉換,需要在單個狀態轉換期間爲每個支持的指令添加相應的控制狀態和約束。這些狀態值和約束的數量還必須乘以 zkVM 支持的指令數量。即使zkVM執行的實際程序(都是NOP)中沒有執行任何操作,這些狀態值和約束檢查也不能省略。

因此,使用本文前半部分的通用狀態機電路來執行復雜的計算是非常低效的。如果使用這些方法來實現復雜的計算,其性能很難讓人接受。此外,一般狀態機電路很難執行復雜的指令或直接與外界交互。

爲了解決這個問題,zkVM 的實際實現通常使用通用狀態機電路和專用證明電路的組合來分別證明程序的各個部分,然後將證明聚合到一個解決方案中。

圖片來源:1 2

左圖是Scroll項目的電路架構,右下角的圖是Polygon的電路架構。它們都採用類似的方法,如頂角的圖表所示。

通用狀態機負責證明程序的執行邏輯控制。在大多數合約中,這部分邏輯的實際執行時間很小,因此用低效的通用狀態機來證明從效率上來說還是可以接受的。

更固定的復雜計算,如哈希、MPT樹運算、外部輸入數據等,都是通過專門的電路來證明的。

通用狀態機和專用證明電路使用查找表進行交互。每次狀態機電路調用這些操作時,生成證明見證的模塊都會將調用參數和計算結果寫入查找表中。因此,狀態機電路中對這些操作的調用被簡化爲查找操作。

查找表中的每個調用和返回值的正確性都由專門的電路來約束和證明。

最後,電路中的復制約束連接狀態機電路、專用電路和查找表,檢查查找表中的每一項是否被相應的專用電路證明,最終生成完整塊的證明。

Layer 1 合約只需要驗證這個聚合證明即可確認整個虛擬機執行過程的正確性。

結語

零知識證明技術使得簡單、快速地證明計算成爲可能,爲在不信任的環境中外包計算過程打開了大門。這項技術運用在區塊鏈中,可以將執行從鏈上解放出來,讓主區塊鏈能夠專注於去中心化和安全問題。但專門的零知識證明電路僅執行固定邏輯的特性限制了區塊鏈上零知識證明的潛力,將早期 zkRollup 的功能限制在少數類型的交易上。

但隨着zk虛擬機的發展和成熟,支持任意智能合約的圖靈完備執行已經成爲可能。 zkRollup的潛力將被真正釋放,實現打破區塊鏈三難困境的願景。

聲明:

  1. 本文轉載自[ZAN],著作權歸屬原作者[ZAN and AntChain Open Labs],如對轉載有異議,請聯系Gate Learn團隊,團隊會根據相關流程盡速處理。
  2. 免責聲明:本文所表達的觀點和意見僅代表作者個人觀點,不構成任何投資建議。
  3. 文章其他語言版本由Gate Learn團隊翻譯, 在未提及Gate.io的情況下不得復制、傳播或抄襲經翻譯文章。
即刻开始交易
注册并交易即可获得
$100
和价值
$5500
理财体验金奖励!