ZK Rollup 電路設計數學推導完整指南:從代數電路到 STARK/SNARK 證明系統的工程實踐
本文從密碼學數學基礎出發,系統性地推導代數電路(Arithmetic Circuits)、約束系統(Constraint Systems)、多項式承諾(Polynomial Commitments)等核心概念。深入分析 SNARK(Groth16、PLONK)和 STARK(FRI 協議)兩大主流證明系統的數學推導與工程實現差異。提供完整的數學公式推導、實際的電路設計範例(餘額轉帳、Merkle 樹更新、zkEVM)、以及電路優化策略。涵蓋 2026 年最新的 ZK Rollup 技術發展。
ZK Rollup 電路設計數學推導完整指南:從代數電路到 STARK/SNARK 證明系統的工程實踐
概述
零知識 Rollup(Zero-Knowledge Rollup,ZK Rollup)是以太坊最具前景的 Layer 2 擴容方案之一。透過將大量交易在鏈下執行並生成簡潔的零知識證明,ZK Rollup 能夠在保證以太坊主網安全性的前提下,將吞吐量提升數百倍乃至數千倍。截至 2026 年第一季度,zkSync Era、Starknet、Polygon zkEVM、Scroll 等主流 ZK Rollup 網路已累計處理超過 15 億筆交易,總鎖定價值(TVL)突破 180 億美元。
理解 ZK Rollup 的電路設計原理是掌握這項技術的核心關鍵。本文從密碼學數學基礎出發,系統性地推導代數電路(Arithmetic Circuits)、約束系統(Constraint Systems)、多項式承諾(Polynomial Commitments)等核心概念,並深入分析 SNARK 和 STARK 兩大主流證明系統的數學推導與工程實現差異。我們將提供完整的數學公式推導、實際的電路設計範例、以及優化策略,幫助讀者建立對 ZK Rollup 電路的深度理解。
第一章:零知識證明的數學基礎
1.1 計算複雜度理論回顧
在深入零知識證明之前,我們需要回顧一些關鍵的計算複雜度概念,這些概念是理解零知識證明可行性的理論基礎。
NP 類與 NP 完全問題:
定義:非確定性多項式時間(NP)類
語言 L ∈ NP 當且僅當存在多項式時間驗證算法 V 和多項式 p 使得:
x ∈ L ⟺ ∃w ∈ {0,1}* 使得 |w| ≤ p(|x|) 且 V(x,w) = 1
其中 w 稱為「證人」(Witness),V 稱為「驗證算法」
NP 類的直觀含義:
- 「容易驗證」(多項式時間)
- 「可能困難求解」(非多項式時間)
NP 完全問題:
問題 C 是 NP 完全的當且僅當:
1. C ∈ NP
2. 任何 NP 問題都可以在多項式時間內歸約到 C
重要例子:
- 布爾可滿足性(SAT)
- 電路可滿足性(Circuit-SAT)
- 哈密頓回路
- 0-1 整數線性規劃
1.2 算術電路的可滿足性
算術電路是描述 NP 問題的天然工具。給定一個算術電路 C 和輸入 x,我們可以問:是否存在一個秘密輸入 w 使得 C(x, w) = 0?
定義:算術電路
一個算術電路 C over field F 由以下組成:
- n 個輸入變量:x₁, x₂, ..., xₙ
- m 個乘法閘:g₁, g₂, ..., gₘ
- 1 個輸出變量:y
每個乘法閘的形式為:
gⱼ = (Σᵢ aᵢⱼ × vᵢ) × (Σᵢ bᵢⱼ × vᵢ)
其中 vᵢ 是前驅節點(輸入或其他閘)的值
電路可滿足性問題:
輸入:電路 C 和公開輸入 x
證人:秘密輸入 w
目標:驗證 C(x, w) = 0
實例:矩陣乘法電路
1.3 零知識證明的形式化定義
零知識證明(Zero-Knowledge Proof)是一種密碼學協議,它允許「證明者」(Prover)在不透露「證人」(Witness)的情況下,向「驗證者」(Verifier)證明某個陳述是正確的。
定義:零知識證明協議
一個零知識證明協議由三個 PPT(概率多項式時間)算法組成:
1. Gen(1^λ) → (pk, vk)
- 生成證明密鑰 pk 和驗證密鑰 vk
- 安全參數 λ 決定安全性級別
2. P(pk, x, w) → π
- 證明者輸入:pk、公開輸入 x、秘密證人 w
- 輸出:證明 π
3. V(vk, x, π) → {accept, reject}
- 驗證者輸入:vk、公開輸入 x、證明 π
- 輸出:接受或拒絕
零知識性必須滿足三個核心屬性:
屬性 1:完整性(Completeness)
若 x ∈ L 且 P 知道證人 w,則 V 恆接受:
Pr[V(vk, x, P(pk, x, w)) = accept] = 1
屬性 2:可靠性(Sounness)
若 x ∉ L,則任何作弊的證明者都無法說服 V:
Pr[V(vk, x, π*) = accept] ≤ negl(λ)
屬性 3:零知識性(Zero-Knowledge)
存在模擬器 Sim 使得輸出與真實證明不可區分:
{Sim(vk, x)} ≈ {P(pk, x, w)}
1.4 雙線性配對的數學原理
雙線性配對(Pairing)是構建高效零知識證明系統的核心密碼學原語。
定義:雙線性配對
設 G₁, G₂, Gₜ 是具有相同素數階 q 的循環群。
配對 e: G₁ × G₂ → Gₜ 滿足雙線性性:
1. 雙線性:e(a×P, b×Q) = e(P, Q)^{ab},∀P ∈ G₁, Q ∈ G₂, a,b ∈ ℤₚ
2. 非退化:若 P 是 G₁ 的生成元,Q 是 G₂ 的生成元,則 e(P, Q) 是 Gₜ 的生成元
3. 可計算性:對於任意輸入,配對可以在多項式時間內計算
常用配對曲線:
- BLS12-381:用於以太坊 PoS BLS 簽章
- BN254:用於 EVM 操作
- BLS12-377, BW6-761:用於 ZK 系統
第二章:代數電路與約束系統
2.1 從布爾電路到算術電路
布爾電路限制:
- 只使用 AND, OR, NOT 閘
- 輸入為布爾值(0 或 1)
- 計算複雜度以閘的數量衡量
算術電路推廣:
- 使用加法和乘法閘 over field F
- 輸入為 field elements
- 更適合表示代數關係
轉換示例:布爾 AND 到算術
布爾邏輯:a ∧ b = a × b
算術電路表達:
x₁ = a
x₂ = b
x₃ = x₁ × x₂ // AND 閘
真值表驗證:
┌───────┬───────┬─────────┐
│ a │ b │ a × b │
├───────┼───────┼─────────┤
│ 0 │ 0 │ 0 │
│ 0 │ 1 │ 0 │
│ 1 │ 0 │ 0 │
│ 1 │ 1 │ 1 │
└───────┴───────┴─────────┘
2.2 R1CS 約束系統
R1CS(Rank-1 Constraint System,一階約束系統)是以太坊 ZK-EVM 廣泛使用的約束表達方式。
定義:R1CS
一個 R1CS 實例由以下組成:
- m 個變量:v₀, v₁, ..., vₘ
- n 個約束:R₁, R₂, ..., Rₙ
- 每個約束是三個線性組合的乘積等式:
(Aᵢ · v) × (Bᵢ · v) = (Cᵢ · v)
其中:
- Aᵢ, Bᵢ, Cᵢ 是長度為 m+1 的向量
- v = (1, v₁, ..., vₘ) 是所有變量的向量
- · 表示內積
特殊變量:
- v₀ 恆定為 1
- v₁ 通常是公開輸入
- vₘ 是輸出變量
實例:橢圓曲線點加法約束
設 P = (x₁, y₁), Q = (x₂, y₂), R = P + Q = (x₃, y₃)
約束系統:
1. λ × (x₂ - x₁) = (y₂ - y₁) // 斜率約束
2. x₃ = λ² - x₁ - x₂ // x 坐標約束
3. y₃ = λ × (x₁ - x₃) - y₁ // y 坐標約束
轉換為 R1CS:
約束 1:
A = [0, 1, -1, λ, 0]
B = [0, 0, 0, 1, 0]
C = [0, 0, 0, 0, 1]
實際上需要引入中間變量來消除二次項。
2.3 約束系統的合併與複製
電路深度問題:
直接實現 C = A × B 需要將 A, B 作為乘法閘的輸入
使用中間變量:
1. s₁ = A
2. s₂ = B
3. s₃ = s₁ × s₂ // C = s₁ × s₂
R1CS 表示:
約束 1:
A = [0, 1, 0, 0]
B = [0, 0, 1, 0]
C = [0, 0, 0, 1]
變量賦值:
v₁ = A
v₂ = B
v₃ = v₁ × v₂ = C
複製約束(Equality Constraints):
有時需要強制兩個變量相等:
vᵢ = vⱼ
這可以通過添加約束:
(vᵢ - vⱼ) × 1 = 0
或使用 Hadamard 約束:
(1) × (vᵢ - vⱼ) = 0
2.4 Plonkish 電路約束
Plonk 算法使用的約束系統比 R1CS 更加靈活,支援固定數量的「複製約束」和自定義「查找表」。
Plonk 約束形式:
每個 Plonk 閘有以下形式:
qL × a + qR × b + qM × a × b + qO × c + qC = 0
其中:
- qL, qR, qM, qO, qC 是門選擇器(selector)係數
- a, b, c 是三個輸入 wire
常見閘類型:
1. 加法閘:qL = 1, qR = 1, qM = 0, qO = -1, qC = 0
→ a + b - c = 0
2. 乘法閘:qL = 0, qR = 0, qM = 1, qO = -1, qC = 0
→ a × b - c = 0
3. 常量乘法:qL = k, qR = 0, qM = 0, qO = -1, qC = 0
→ k × a - c = 0
Plonk 約束系統的優勢:
- 統一的閘類型簡化電路設計
- 複製約束提供更大的靈活性
- 查找表支援自定義運算
第三章:SNARK 系統的數學推導
3.1 KZG 多項式承諾
KZG(Kate-Zaverucha-Goldberg)承諾是以太坊即將採用的主要多項式承諾方案。
多項式承諾的定義:
承諾者對多項式 f(X) ∈ Fₚ[X] 生成承諾 C
驗證者可以要求證明者在特定點 x 上打開承諾
承諾者提供 (f(x), π)
驗證者檢查 π 來確認 f(x) 的正確性
KZG 承諾的設置:
1. 可信設置(Trusted Setup)
選擇秘密值 τ ∈ Fₚ
計算 Powers of Tau:
G, τG, τ²G, ..., τᵗG
公開參數:
- [1]G, [τ]G, [τ²]G, ..., [τᵗ]G
其中 [a]G = a × G
2. 承諾生成
對於多項式 f(X) = Σᵢ aᵢ Xⁱ:
C = Σᵢ aᵢ × [τⁱ]G = [f(τ)]G
3. 證明生成(Opening)
在點 x 處打開:
定義商多項式:
q(X) = (f(X) - f(x)) / (X - x)
證明:
π = [q(τ)]G
4. 驗證
檢查配對等式:
e(C - [f(x)]G, G) = e(π, [τ]G - [x]G)
等價於:
e(C, G) = e([f(x)]G, G) × e(π, [τ - x]G)
3.2 Groth16 協議推導
Groth16 是最流行的 SNARK 協議之一,以其簡潔的證明大小著稱。
Groth16 三元組生成(Setup):
給定 R1CS 約束系統 (Aᵢ, Bᵢ, Cᵢ) 和安全參數 λ:
1. 選擇橢圓曲線群 G₁, G₂, Gₜ 和配對 e: G₁ × G₂ → Gₜ
2. 選擇隨機值 α, β, γ, δ, τ ∈ Fₚ
3. 計算 CRS(Common Reference String):
α 相關:
[α]₁, {[Aᵢ(τ)]₁}
[β]₁, [β]₂, {Cᵢ(τ)}₁, {Cᵢ(τ)}₂
δ 相關:
{[τⁱ]₁}, {[τⁱ]₂} for i = 0,1,...,n
證明生成:
給定公開輸入 u 和秘密 witness w:
1. 計算 A = A₀(τ) + Σᵢ uᵢAᵢ(τ) + Σⱼ wⱼAⱼ(τ)
2. 計算 B = B₀(τ) + Σᵢ uᵢBᵢ(τ) + Σⱼ wⱼBⱼ(τ)
3. 計算 C = C₀(τ) + Σᵢ uᵢCᵢ(τ) + Σⱼ wⱼCⱼ(τ)
4. 添加 δ 修正:
A' = A + H(τ) × δ
B' = B + H(τ) × δ
C' = C + α × H(τ) × δ + β × H(τ) × δ + H(τ)² × δ²
5. 最終證明:
π = ([A']₁, [B']₂, [C']₁)
驗證:
給定驗證密鑰和證明 (πₐ, πᵦ, πᵧ),驗證:
e(πₐ, πᵦ) = e([α]₁, [β]₂) × e(πᵧ, [γ]₂) × e([Σᵢ uᵢICᵢ(τ)]₁, [β]₂)
這個等式檢查約束是否被滿足。
3.3 PLONK 協議推導
PLONK(Permutations over Lagrange-bases for Oecumenical noninteractive arguments of Knowledge)是一種通用零知識證明協議。
PLONK 約束系統:
定義「副本約束」來連接不同閘之間的相同變量:
副本約束集合 E = {(i, j)} 表示 wire i 和 wire j 必須相等
多項式置換論證:
為每個 wire 定義兩個排列:
- σ: 將每個位置映射到其在「複製前」的位置
- σ': 將每個位置映射到其在「複製後」的位置
目標:證明存在置換 π 使得電路約束成立
具體步驟:
1. 計算 Grand Product Proof
定義多項式:
Z(X) = ∏ᵢ (Pᵢ(X) / Qᵢ(X))
其中 Pᵢ, Qᵢ 是與約束相關的多項式
2. 使用 KZG 承諾來承諾 Z(X)
3. 在隨機點 ζ 處驗證:
Z(ζ) = Z(ζ × ω) × F(ζ) / G(ζ)
其中 ω 是 n 個 root of unity
PLONK 證明協議:
1. Preprocessing(預處理)
- 設置驗證密鑰(包含置換多項式承諾)
- 計算複製多項式承諾
2. 證明者階段
- 計算 witness 多項式
- 計算閘約束多項式
- 計算副本約束多項式
- 生成 Grand Product Proof
3. 驗證者階段
- 隨機抽樣挑戰點
- 驗證 KZG 承諾
- 驗證閘約束
- 驗證副本約束
3.4 Halo2 電路設計
Halo2 是 Zcash 實現的 PLONK 變體,是當前最流行的 ZK 電路設計框架之一。
Halo2 的核心特性:
1. 增量可驗證計算(IVC)
- 允許將大電路分解為多個步驟
- 每步只需驗證相鄰步驟的約束
2. 查找表
- 原生支援電路外的查找操作
- 常用於實現非代數操作
3. 自定義閘
- 可定義任意數量的輸入
- 靈活的約束表達
Halo2 佈局(Layout):
Halo2 使用「佈局」來組織電路結構:
Chip:
- 定義特定功能的邏輯單元
- 如:ECDSA 驗證、Keccak 哈希
Config:
- 定義晶片之間的連接
- 定義佈局大小
實例:ECDSA 簽章驗證晶片
配置:
- 輸入:公鑰 P, 簽章 (r, s), 消息哈希 e
- 輸出:accept/reject
- 約束數量:~20,000 個 R1CS 約束
第四章:STARK 系統的數學推導
4.1 STARK 與 SNARK 的根本差異
SNARK vs STARK 特性對比:
┌─────────────┬────────────┬────────────┐
│ 特性 │ SNARK │ STARK │
├─────────────┼────────────┼────────────┤
│ 信任設置 │ 需要 │ 不需要 │
│ 信任設置類型│ 可信設置 │ - │
│ 安全性假設 │ 代數 │ Hash │
│ 證明大小 │ ~200-400B │ ~50-200KB │
│ 驗證時間 │ ~3-10ms │ ~10-50ms │
│ 證明者時間 │ 中等 │ 高 │
│ 抗量子 │ 否 │ 是 │
│ 電路通用性 │ 是 │ 是 │
└─────────────┴────────────┴────────────┘
安全性假設差異:
SNARK(基於配對):
- 離散對數假設(Pairing-based)
- 代數群模型
- 可信設置泄露不影響安全性
STARK(基於哈希):
- 隨機預言機模型
- 衝突抵抗 Hash 函數
- 量子計算假設下仍安全
4.2 STARK 的多項式交互式論證(PIE)
STARK 的核心是多項式交互式論證框架。
定義:多項式交互式論證
系統由以下組成:
1. 算術化(Arithmetization)
- 將計算問題轉換為多項式約束
- 定義執行追蹤(Execution Trace)
- 定義約束多項式 C(X)
2. 低度測試(Low-Degree Testing)
證明多項式 f(X) 的度數小於 d
方法:
- 隨機選擇直線 L
- 在直線上進行 Reed-Solomon 測試
- 使用 Feldman / IPA 驗證
3. 交互式子集和(Interactive Subset Sum)
證明查詢集合的正確性
方法:
- 使用 Merkle 樹組織數據
- 驗證者隨機選擇查詢位置
- 證明者提供路徑證明
4. 最終消息(Final Message)
驗證者發送隨機挑戰
證明者發送所有證明
4.3 FRI 協議推導
FRI(Fast Reed-Solomon Interactive Oracle Proof of Proximity)是 STARK 實現低度測試的核心協議。
FRI 協議步驟:
1. 初始化
- 選擇有限域 F 和擴展域 F_ext
- 選擇 coset C = {g × ωⁱ | i = 0,1,...,n-1}
- 其中 ω 是 n 個原根,g 是生成元
2. 第一輪
- 令 f₀(X) = 原始多項式
- 將 f₀(X) 在 coset C 上取值為 [f₀(c₀), ..., f₀(c_{n-1})]
- 將序列一分為二:f₀,even 和 f₀,odd
- 定義 f₁(X) = f₀,even(X²) + X × f₀,odd(X²)
3. 遞歸
令 n_{i+1} = n_i / 2
對 i = 1, 2, ..., 直到 n_k 足夠小
在每輪:
- 證明者發送 f_i 的 Commitment
- 驗證者發送隨機挑戰 β_i
- 下一輪多項式:
f_{i+1}(X) = f_i,even(X²) + β_i × f_i,odd(X²)
4. 最終輪
當 n_k 小於閾值時,直接發送 f_k 的所有係數
5. 驗證
檢查:
- 每輪的多項式度數 ≤ n_i/2
- 最終多項式 f_k 的度數很小
定理:若 f₀ 的度數 < n,則 FRI 接受概率 ≥ 1 - δ
若 f₀ 的度數 ≥ n,則 FRI 接受概率 ≤ δ
其中 δ 是驗證者設置的 soundness 參數。
4.4 STARK 證明生成流程
STARK 證明生成完整流程:
步驟 1:算術化
- 將電路約束轉換為多項式約束
- 生成執行追蹤 T[0..m-1]
- 定義約束多項式 q₀(X), q₁(X), ...
步驟 2:Reed-Solomon 編碼
- 選擇域 F 和參數 n, D
- 對追蹤進行 RS 編碼:
T̂(ωⁱ) = T[i] for i = 0, 1, ..., m-1
對於 i ≥ m,填充使度數 < n
步驟 3:約束違反檢驗
- 計算組合多項式:
C(X) = Σᵢ qᵢ(X) × (T̂(X + dᵢ) - 約束值)
- 令 D(X) = C(X) / Z(X)
其中 Z(X) = ∏ (X - cᵢ) 是零化多項式
步驟 4:FRI 承諾
- 對 D(X) 進行 FRI 協議
- 生成 DEEP 組合
步驟 5:Merkle 證明
- 將所有查詢值組織為 Merkle 樹
- 對每個查詢位置提供路徑證明
步驟 6:最終輸出
- 所有 Merkle 根
- 所有 Merkle 路徑
- FRI 協議的最後消息
證明大小分析:
假設:
- n = 2¹⁴ = 16,384(追蹤長度)
- d = 2¹⁰(查詢數量)
- k = log₂(n) = 14(FRI 輪數)
估計大小:
- Merkle 樹:O(n) 個 field elements
- 查詢路徑:O(d × log n) 個 field elements
- FRI 最後消息:O(n^(1/2)) 個 field elements
第五章:ZK Rollup 電路設計實例
5.1 餘額轉帳電路
讓我們設計一個 ZK Rollup 帳戶餘額轉帳的電路。
電路規範:
公開輸入:
- 區塊根 Root_before(舊狀態根)
- 區塊根 Root_after(新狀態根)
私密輸入(Witness):
- 發送者公鑰 P_s
- 接收者公鑰 P_r
- 發送者餘額 B_s(轉帳前)
- 接收者餘額 B_r(轉帳前)
- 簽章 σ
- 隨機數 nonce_s
公開輸出:
- 轉帳金額 amount
- 手續費 fee
約束系統:
1. 簽章驗證
- Verify_Schnorr(σ, P_s, tx_hash) = 1
約束:
- 根據所使用的簽章方案添加約束
2. 餘額約束
- B_s_before ≥ amount + fee
- B_r_before ≥ 0
- B_s_after = B_s_before - amount - fee
- B_r_after = B_r_before + amount
3. 狀態更新約束
- 驗證發送者在原狀態中的餘額
- 驗證接收者在原狀態中的餘額
- 計算新狀態根
4. 非負性約束
- B_s_after ≥ 0
- B_r_after ≥ 0
R1CS 表示(簡化版本):
變量:
v₀ = 1(常數)
v₁ = amount(公開)
v₂ = fee(公開)
v₃ = B_s_before
v₄ = B_r_before
v₅ = B_s_after
v₆ = B_r_after
v₇ = 簽章相關變量
...
約束:
(1) v₃ = amount + fee + v₅ // 發送者餘額守恆
(2) v₄ + amount = v₆ // 接收者餘額守恆
(3) v₅ × 1 = v₅ // 非負(需要特殊處理)
(4) v₆ × 1 = v₆ // 非負
(5) 簽章約束
5.2 Merkle 樹更新電路
狀態管理是 ZK Rollup 的核心,Merkle 樹更新約束是關鍵。
Merkle 樹約束:
參數:
- 樹深度 d = 30
- 每個節點為 32 bytes(以太坊)
輸入:
- 舊根 Root_old
- 新根 Root_new
- 路徑節點:sibling₀, sibling₁, ..., sibling_{d-1}
- 葉節點值:leaf
輸出:
- 驗證路徑正確性
- 驗證根更新正確性
約束:
1. 計算葉節點哈希
leaf_hash = Hash(leaf)
2. 遞歸計算每層的父節點:
設 path_bit₀, path_bit₁, ..., path_bit_{d-1} 為路徑位元
對於 i = 0 到 d-1:
若 path_bitᵢ = 0:
parentᵢ = Hash(0 || nodeᵢ || siblingᵢ)
若 path_bitᵢ = 1:
parentᵢ = Hash(1 || siblingᵢ || nodeᵢ)
其中 node₀ = leaf_hash
nodeᵢ₊₁ = parentᵢ
3. 約束根匹配
Root_new = node_d
4. 約束與原根的關係
Root_old = recompute_root(leaf, path, path_bits)
電路複雜度:
- 每層需要 2 個哈希約束
- 總約束數:2 × d = 60 個哈希
- 以 Keccak-256 為例:~60 × 2700 = 162,000 個 R1CS 約束
優化策略:
- 使用 Poseidon 哈希(ZK-友好)
- 約束數量降至 ~60 × 30 = 1,800 個
- 節省約 90% 的約束
5.3 批量轉帳電路
批量轉帳電路設計:
目標:驗證 N 筆轉帳交易
電路參數:
- N = 最大交易數(如 1000)
- 每筆交易需要驗證簽章、更新餘額、更新 Merkle 樹
電路結構:
1. 交易驗證模組(重複 N 次)
- 驗證簽章
- 提取公鑰
- 讀取餘額
- 驗證餘額足夠
2. 餘額更新模組(重複 N 次)
- 更新發送者餘額
- 更新接收者餘額
- 累積手續費
3. Merkle 樹更新模組(重複 N 次)
- 更新葉節點
- 重新計算路徑
- 最終根計算
4. 聚合驗證
- 驗證所有約束
- 生成單個證明
約束數量估計:
假設:
- 每筆轉帳:簽章(3000) + 餘額更新(100) + Merkle(30) = ~3,130 約束
- 1000 筆轉帳:~3,130,000 約束
證明生成時間(使用高效 prover):
- 假設每秒處理 10,000 約束
- 總時間:~5.2 分鐘
實際優化後(使用 Batch normalization):
- 每筆轉帳:~500 約束
- 1000 筆轉帳:~500,000 約束
- 證明時間:~50 秒
5.4 zkEVM 電路設計
zkEVM 電路是用於驗證 EVM 執行正確性的零知識電路。
zkEVM 架構:
┌─────────────────────────────────────────────────────────────┐
│ zkEVM Circuit Layer │
├──────────────┬──────────────┬──────────────┬────────────────┤
│ Bytecode │ Execution │ MIPS │ State │
│ Circuit │ Trace │ Trap │ Update │
│ │ Circuit │ Circuit │ Circuit │
└──────────────┴──────────────┴──────────────┴────────────────┘
各層職責:
1. Bytecode Circuit
- 驗證合約字節碼的正確性
- 驗證程序計數器(PC)的有效性
- 約束數量:~500,000
2. Execution Trace Circuit
- 驗證 EVM 操作序列的正確性
- 約束每個 opcode 的執行
- 約束數量:取決於交易複雜度
3. MIPS Trap Circuit
- 處理 precompile 調用
- 處理系統合約
- 約束數量:~200,000
4. State Update Circuit
- 驗證狀態讀寫的正確性
- 約束記憶體、堆疊、存儲
- 約束數量:~1,000,000
EVM 操作約束示例:ADD 操作
opcode ADD:
- 功能:a + b = c (mod 2^256)
- gas_cost = 3
約束:
1. 讀取堆疊:pop a, pop b
2. 計算:c = a + b (mod 2^256)
3. 溢出標誌:overflow = (a + b) / 2^256
4. 寫入堆疊:push c
5. 扣除 Gas:gas' = gas - 3
6. PC 遞增:pc' = pc + 1
R1CS 表示:
constraint_1: (a + b) - c - overflow × 2^256 = 0
constraint_2: gas' + 3 - gas = 0
constraint_3: pc' - pc - 1 = 0
第六章:電路設計優化策略
6.1 約束優化技術
技術 1:複製約束減少
問題:大量相等約束導致約束數膨脹
解決方案:使用 PLONK 風格的複製約束
- 使用單個置換論證代替多個等式約束
- 節省:每個相等約束節省 1 個乘法約束
技術 2:查找表
問題:某些操作(如位運算)在 field 上代價高昂
解決方案:使用查找表
- 預先計算常用值
- 使用복數約束替代計算約束
- 節省:複雜操作可節省 50-90%
技術 3:自定義 Gate
問題:標準乘法/加法閘不夠靈活
解決方案:定義具有多個輸入的自定義閘
- 例:橢圓曲線加法閘
- 減少閘之間的連接數
- 節省:可減少 20-40% 的約束數
技術 4:批量歸一化
問題:中間變量增加約束數
解決方案:批量處理多個操作
- 減少中間變量數量
- 使用 SIMD 風格約束
- 節省:可減少 30-50% 的約束數
6.2 Prover 效率優化
技術 1:並列化
策略:
- 使用多核 CPU/GPU 並列計算約束多項式
- 使用 SIMD 指令加速 field 運算
- 對 independent 約束分組並行處理
收益:
- 8 核 CPU:~4-5x 加速
- 高端 GPU:~10-20x 加速
技術 2:快速 FFT
策略:
- 使用 FFT 進行多項式插值
- 使用混合基 FFT 優化
- 使用 Cooley-Tukey 演算法
收益:
- FFT 複雜度:O(n log n)
- 實例:n = 2²⁰,FFT 比直接計算快 ~1000x
技術 3:承諾優化
策略:
- 使用 Kate-Zaverucha-Goldberg (KZG) 承諾
- 使用 Batch 承諾減少通信開銷
- 使用 Vector 承諾優化存儲
收益:
- 承諾大小:恆定 ~48 bytes
- 承諾時間:O(n log n)
6.3 電路安全性審計
審計重點:
1. Soundness 漏洞
- 約束系統是否完整
- 是否存在繞過約束的方式
檢查方法:
- 窮舉測試小實例
- 形式化驗證約束系統
2. Zero-Knowledge 泄露
- Witness 是否被部分暴露
- 約束是否泄露了私有資訊
檢查方法:
- 確認所有 witness 都在 commitment 中
- 檢查是否存在「鬆弛」約束
3. 約束正確性
- 約束是否正確實現所需功能
- 是否存在溢位、精度丟失等問題
檢查方法:
- 符號執行約束系統
- 對比參考實現
常見漏洞模式:
1. 缺少範圍約束
問題:未限制變量取值範圍
後果:可通過構造特殊輸入繞過約束
2. 複製約束不完整
問題:某些相等關係未被約束
後果:狀態不一致
3. 溢出未處理
問題:field 運算結果可能溢出
後果:結果錯誤
結論
本文從數學基礎出發,系統性地分析了 ZK Rollup 電路設計的核心原理與工程實踐。主要內容包括:
數學基礎:我們回顧了計算複雜度理論、NP 類問題、以及零知識證明的形式化定義,為理解電路設計提供了理論基礎。
代數電路與約束系統:詳細介紹了從布爾電路到算術電路的轉換、R1CS 約束系統、以及 PLONKish 電路的設計方法。
SNARK 系統:深入推導了 KZG 多項式承諾、Groth16 協議、以及 PLONK 協議的數學原理與實現細節。
STARK 系統:分析了 STARK 與 SNARK 的根本差異、FRI 協議的多項式交互式論證框架、以及 STARK 證明生成的完整流程。
實例設計:提供了餘額轉帳、Merkle 樹更新、批量轉帳、以及 zkEVM 電路的詳細設計範例。
優化策略:總結了約束優化、Prover 效率優化、以及電路安全性審計的最佳實踐。
參考來源
- Gennaro, R., et al. "Quadratic Span Programs and Succinct NIZKs without PCPs." EUROCRYPT 2013.
- Groth, J. "On the Size of Pairing-based Non-interactive Arguments." EUROCRYPT 2016.
- Gabizon, A., et al. "PLONK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge." EUROCRYPT 2020.
- Ben-Sasson, E., et al. "STARKs: Low-degree testing in polynomial time and applications to STARK." IACR 2021.
- Halo2 Specification. Zcash Foundation.
https://zcash.github.io/halo2/
- zkEVM Specification. Ethereum Foundation.
https://github.com/privacy-scaling-explorations/zkevm-specs
- Vitalik Buterin. "An approximate introduction to how zk-SNARKs are possible."
https://vitalik.ca/general/2021/01/26/snarks.html
標籤
zk-rollup, circuit-design, snark, stark, zk-snark, zk-stark, polynomial-commitment, halo2, plonk, cryptography
難度
advanced
相關文章
- ZK-SNARKs 與 ZK-STARKs 以太坊實戰應用完整指南
- Halo2 PLONK ZK 證明系統深度工程實作指南
- 以太坊零知識證明完整技術指南
- ZK 電路數學推導完整指南
相關文章
- 零知識證明完整技術指南:從基礎密碼學到以太坊應用實踐 — 零知識證明是現代密碼學最革命性的發明之一,允許一方在不透露任何額外信息的情況下向另一方證明某陳述的正確性。本文深入探討零知識證明的數學基礎、主流技術方案(zk-SNARKs、zk-STARKs、PLONK)、以及在以太坊生態系統中的實際應用,包括 ZK Rollup 技術架構、隱私保護應用與開發實踐。我們將從密碼學原語出發,逐步構建完整的零知識證明知識體系。
- HALO2 與 PLONK 家族零知識證明系統深度工程實作指南:折疊方案、遞迴證明與電路設計實務 — HALO2 由 Electric Coin Company(Zcash 團隊)開發,其創新性地採用了「折疊方案」(Folding Scheme)來實現無需可信設置的遞迴證明組合。PLONK 及其衍生協議(UltraPLONK、TurboPLONK、Plonky2)則以其通用性和效率聞名。本文深入分析 HALO2 協議的核心原理、PLONK 家族的數學推導、以及實際電路設計的工程細節。涵蓋 IVC 增量可驗證計算、PLONK 置換論證與門約束系統、折疊方案數學推導、IPA 內積論證、HALO2 電路結構與約束定義、Rust HALO2 電路開發實務、PLONK 變體分析(UltraPLONK 查找表、Plonky2 Goldilocks 域優化)、以及 zkSync、Aztec 等項目的實際應用案例。同時探討電路安全性陷阱、驗證器安全最佳實踐與形式化驗證方法。
- ZK-SNARKs 與 ZK-STARKs 以太坊實戰應用完整指南:從理論到部署的工程實踐 — 零知識證明技術在以太坊生態系統中的應用已從理論走向大規模實際部署。本文深入探討 ZK-SNARKs 和 ZK-STARKs 兩大主流證明系統在以太坊上的實際應用案例,提供可直接部署的智慧合約程式碼範例,涵蓋隱私交易、身份驗證、批量轉帳、AI 模型推理驗證等完整實作。
- Circle STARK 完整技術指南:密碼學原理、效能優化與應用實踐 — Circle STARK 是 Circle 公司在零知識證明領域的重要貢獻,為金融應用提供了一個高效、合規、易用的 STARK 實現。本指南深入解析 Circle STARK 的密碼學基礎、架構設計、效能特性,並探討其在以太坊生態中的實際應用場景,包括隱私支付、身份驗證、DeFi 隱私應用等。
- Verifiable Delay Functions 與進階密碼學:原理、應用與實現 — Verifiable Delay Function(VDF)是密碼學中相對新興的原語,近年來在區塊鏈領域獲得了廣泛關注。VDF 的核心特性是:計算結果需要經過預定時間才能完成,且驗證過程極為高效。這種「時間綁定」的計算特性為區塊鏈系統提供了獨特的安全保障,特別是在隨機數生成、 時間戳記、PoS 共識等場景中具有重要應用價值。本文深入介紹 VDF 的數學原理、主流實現方案、在區塊鏈中的實際應用,以及
延伸閱讀與來源
- Ethereum.org Developers 官方開發者入口與技術文件
- EIPs 以太坊改進提案完整列表
- Solidity 文檔 智慧合約程式語言官方規格
- EVM 代碼庫 EVM 實作的核心參考
- Alethio EVM 分析 EVM 行為的正規驗證
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!