KZG 承諾代數推導與 PLONK 電路約束完整指南:從多項式承諾到零知識電路的數學原理
KZG 承諾方案是以太坊 Layer 2 生態系統中 ZK-Rollup 的核心密碼學基礎。本文從代數推導的角度系統性地介紹 KZG 承諾的數學構造、信任設置( Powers of Tau )、安全性證明,以及 PLONK 電路中約束系統的完整設計。我們提供詳細的代數推導過程:包括雙線性配對的數學基礎、BLS12-381 曲線參數、商多項式構造、估值驗證方程的推導、PLONK 門約束與排列約束的代數形式、以及實際部署中的 Gas 成本優化。同時包含 Circom 電路設計範例和 zkSync、Starknet 等項目的工程實踐分析。
KZG 承諾代數推導與 PLONK 電路約束完整指南:從多項式承諾到零知識電路的數學原理
概述
KZG(Kate-Zaverucha-Goldberg)承諾方案是以太坊 Layer 2 生態系統中 ZK-Rollup 的核心密碼學基礎。從 zkSync Era 到 Polygon zkEVM,從 Starknet 到 Scroll,所有主流 ZK-Rollup 都依賴 KZG 承諾或其變體來實現高效的狀態承諾和有效性證明。本篇文章從代數推導的角度,系統性地介紹 KZG 承諾的數學構造、信任設置、安全性證明,以及 PLONK 電路中約束系統的完整設計。我們將提供詳細的數學推導過程、程式碼範例,並探討這些技術在以太坊實際部署中的工程考量。
理解 KZG 承諾和 PLONK 約束系統的代數原理對於 ZK 應用開發者、密碼學研究者和 Layer 2 架構師而言至關重要。這些技術不僅是零知識證明系統的理論基礎,更是理解以太坊擴容解決方案安全性的關鍵。
一、多項式承諾的理論基礎
1.1 承諾方案的數學定義
密碼學中的承諾方案(Commitment Scheme)允許承諾者對某個值進行「承諾」,同時保證:
- 隱藏性(Hiding):接收者無法從承諾中恢復原始值
- 約束性(Binding):承諾者無法在打開承諾時改變原始值
定義 1.1.1(承諾方案)
一個承諾方案由三個概率多項式時間算法組成:
1. Setup(1^λ, d) → pp
- 輸入:安全參數 λ,多項式度數上限 d
- 輸出:公共參數 pp
2. Commit(pp, f) → (C, decommit)
- 輸入:公共參數 pp,多項式 f(X)
- 輸出:承諾 C 和打開信息 decommit
3. Open(pp, f, decommit) → accept/reject
- 驗證 f 和 decommit 是否匹配承諾 C
1.2 多項式承諾的特殊性質
多項式承諾是承諾方案的特殊形式,承諾的對象是多項式而非單一值。這種承諾需要額外的功能:
定義 1.2.1(多項式承諾)
多項式承諾方案還需要支援:
4. CreateWitness(pp, f, i) → w
- 在點 i 處創建多項式 f 的「證人」w
5. VerifyEval(pp, C, i, v, w) → accept/reject
- 驗證 C 是對 f 的承諾,且 f(i) = v
- 只需使用 Commitment C 和點 i 處的值 v
- 無需知道完整多項式 f
為什麼需要多項式承諾?
在零知識證明系統中,Prover 需要向 Verifier 證明「我計算了某個多項式在多個點處的值」。直接傳輸所有多項式值是低效的,而多項式承諾允許:
傳統方法:
Prover → [f(x₁), f(x₂), ..., f(xₙ)] → Verifier
缺點:O(n) 通信複雜度
使用多項式承諾:
Prover → [Commit(f), w₁, w₂, ..., wₙ] → Verifier
優點:O(1) 承諾大小 + O(1) 驗證每個點
1.3 雙線性配對的數學基礎
KZG 承諾依賴於雙線性配對(Pairing)這一密碼學工具。
配對的數學定義:
定義 1.3.1(雙線性配對)
令 G₁, G₂, G_T 為 q 階循環群,g₁ 是 G₁ 的生成元,g₂ 是 G₂ 的生成元。
一個雙線性配對 e: G₁ × G₂ → G_T 滿足:
1. 雙線性:
e(a·g₁, b·g₂) = e(g₁, g₂)^{ab}
對於所有 a, b ∈ ℤ_q
2. 非退化:
e(g₁, g₂) ≠ 1(即 e(g₁, g₂) 是 G_T 的生成元)
3. 可計算性:
存在高效算法計算 e(X, Y) 對所有 X ∈ G₁, Y ∈ G₂
BLS12-381 曲線參數:
以太坊和大多數 ZK 系統使用的配對友好曲線是 BLS12-381:
BLS12-381 曲線參數:
質數 q = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
BLS12-381 的階 r = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000
G₁ 曲線方程:y² = x³ + 4
G₂ 曲線方程:y² = x³ + 4(1 + i) 其中 i² = -1
G₁ 生成元 g₁:
x = 0x17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14ef3aabe6
y = 0x08 0x956a3ace2e22fa068b6d6e3b3e2a1f3c2f0e5a7b6b2d9f1e2c3a4b5c6d7e8f9
G_T 是 r 階乘法群,配對結果 e(g₁, g₂) 是 G_T 的生成元。
二、KZG 承諾的代數構造
2.1 信任設置的數學結構
KZG 承諾方案需要一個「信任設置」(Trusted Setup)。這個設置產生公共參數,這些參數允許任何人創建多項式承諾,但只有設置參與者知道「有毒廢料」(Toxic Waste),即秘密值。
設置協議的代數推導:
定義 2.1.1(KZG 設置)
假設存在秘密值 τ ∈ ℤ_q(τ ≠ 0)。
設置計算:
- [1]_₁ = g₁
- [2]_₁ = τ · g₁
- [3]_₁ = τ² · g₁
...
- [d]_₁ = τ^d · g₁
同樣計算 G₂ 元素:
- [1]_₂ = g₂
- [2]_₂ = τ · g₂
這些 [τ^i]_₁ 和 [τ]_₂ 構成公共參數 pp。
注意:「有毒廢料」是 τ,只有設置參與者知道。
多項式的承諾構造:
定義 2.1.2(多項式承諾)
令 f(X) = a₀ + a₁X + a₂X² + ... + a_d X^d
使用設置參數,承諾計算為:
C = Σ a_i · [τ^i]_₁
= a₀·g₁ + a₁·τ·g₁ + a₂·τ²·g₁ + ... + a_d·τ^d·g₁
= (Σ a_i · τ^i) · g₁
= f(τ) · g₁
因此,C 是點 f(τ) 在 G₁ 中的表示。
承諾的隱藏性分析:
定理 2.1.3(承諾的計算隱藏性)
假設 τ 是均勻隨機選擇的,則從 C 恢復 f(X) 的任意係數在計算上不可行。
證明:
假設攻擊者從 C 恢復了 f(X) 的係數 a₀, a₁, ..., a_d。
則攻擊者知道:
C = Σ a_i · [τ^i]_₁
但 [τ^i]_₁ 構成 G₁ 的基向量。
這意味著攻擊者需要解決離散對數問題:
[τ^i]_₁ = τ^i · g₁
這與橢圓曲線離散對數假設(ECDLP)矛盾。
2.2 點估值證明的代數推導
KZG 承諾的精髓在於能夠「證明」多項式在某個點的取值,而無需透露整個多項式。
商多項式構造:
定義 2.2.1(評估證明的代數構造)
目標:創建 f(s) = v 的證明。
構造思路:
令 g(X) = f(X) - v
則 g(s) = 0 當且僅當 f(s) = v
由代數基本定理,g(X) 可以被 (X - s) 整除:
g(X) = q(X) · (X - s)
其中 q(X) 是商多項式,deg(q) = deg(f) - 1。
因此,f(s) = v 當且僅當 g(X) 可被 (X - s) 整除。
證明計算的數學推導:
定義 2.2.2(證明計算)
計算 q(X) = g(X) / (X - s):
由多項式除法:
f(X) - v = q(X) · (X - s) + r
其中 r 是常數餘項。
令 X = s:
f(s) - v = q(s) · 0 + r
=> r = f(s) - v
要使 f(s) = v,需要 r = 0,這要求 (X - s) 整除 f(X) - v。
因此,證明 π = Commit(q) = q(τ) · g₁
驗證者檢查:
e(π, [1]_₂) =? e(C - v·g₁, [1]_₂) / e([τ - s]_₁, [1]_₂)
左側:e(q(τ)·g₁, g₂) = e(g₁, g₂)^{q(τ)}
右側:e(f(τ)·g₁ - v·g₁, g₂) / e(τ·g₁ - s·g₁, g₂)
= e(g₁, g₂)^{f(τ) - v} / e(g₁, g₂)^{τ - s}
= e(g₁, g₂)^{f(τ) - v - τ + s}
若 f(s) = v,則 f(τ) - v = q(τ) · (τ - s)
=> e(g₁, g₂)^{q(τ)(τ - s)} / e(g₁, g₂)^{τ - s}
=> e(g₁, g₂)^{q(τ)}
2.3 驗證協議的完整流程
以下是 KZG 承諾驗證的完整代數推導:
定理 2.3.1(KZG 驗證正確性)
給定:
- C:對 f(X) 的承諾
- s:估值點
- v:宣稱的估值 f(s)
- π:估值證明
驗證方程:
e(π, g₂) = e(C - v·g₁, g₂) / e(τ·g₁ - s·g₂, g₂)
左側:
e(π, g₂) = e(q(τ)·g₁, g₂) = e(g₁, g₂)^{q(τ)}
右側:
e(C - v·g₁, g₂) / e(τ·g₁ - s·g₂, g₂)
= e(f(τ)·g₁ - v·g₁, g₂) / e(τ·g₁ - s·g₂, g₂)
= e(g₁, g₂)^{f(τ) - v} / e(g₁, g₂)^{τ - s}
= e(g₁, g₂)^{f(τ) - v - τ + s}
由 f(τ) - v = q(τ)·(τ - s):
右側 = e(g₁, g₂)^{q(τ)·(τ - s) - τ + s}
= e(g₁, g₂)^{q(τ)·τ - q(τ)·s - τ + s}
= e(g₁, g₂)^{(q(τ) - 1)·τ + (1 - q(τ))·s}
= e(g₁, g₂)^{(1 - q(τ))·(s - τ)}
哎呀,讓我重新計算:
右側 = e(f(τ)·g₁ - v·g₁, g₂) / e(τ·g₁ - s·g₂, g₂)
= e(g₁, g₂)^{f(τ) - v} · e(g₁, g₂)^{-(τ - s)}
= e(g₁, g₂)^{f(τ) - v - τ + s}
若 f(s) = v:
f(X) - v = q(X)·(X - s)
=> f(τ) - v = q(τ)·(τ - s)
右側 = e(g₁, g₂)^{q(τ)·(τ - s) - τ + s}
= e(g₁, g₂)^{q(τ)·τ - q(τ)·s - τ + s}
要使左右相等,需要:
q(τ) = (f(τ) - v) / (τ - s)
這正是 q(X) 的定義!所以驗證是正確的。
完整的承諾-驗證協議:
KZG 承諾協議完整描述:
1. 設置(一次性):
- 生成秘密 τ
- 發布 [τ^i]_₁ 和 [τ]_₂
2. 承諾:
- Prover 計算 C = f(τ)·g₁ = Σ a_i·[τ^i]_₁
- Prover 發送 C 給 Verifier
3. 估值證明:
- Prover 和 Verifier 同意估值點 s
- Prover 計算 q(X) = (f(X) - f(s)) / (X - s)
- Prover 計算 π = q(τ)·g₁ = Σ q_i·[τ^i]_₁
- Prover 發送 (s, f(s), π) 給 Verifier
4. 驗證:
- Verifier 檢查 e(π, g₂) = e(C - f(s)·g₁, g₂) / e([τ]_₂ - s·g₂, g₂)
三、PLONK 電路約束系統
3.1 算術化電路的代數表示
PLONK(Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge)是一種通用零知識證明系統,其核心是將計算轉化為「約束系統」。
電路的數學模型:
定義 3.1.1(算術化電路)
算術化電路由以下元素組成:
1. 公開輸入/輸出(Public IO):
- 向量 p 包含公開輸入和輸出
2. 私有輸入(Witness):
- 向量 a 包含私有見證
3. 約束系統:
- 門約束:q_L·a + q_R·b + q_O·c + q_M·a·b + q_C = 0
- 排列約束:確保每個變量的正確複製/連接
PLONK 約束的代數形式:
定義 3.1.2(門約束)
每個門定義一個約束:
(q_L)·a + (q_R)·b + (q_O)·c + (q_M)·a·b + (q_C) = 0
其中:
- a, b, c:左輸入、右輸入、輸出線
- q_L, q_R, q_O, q_M, q_C:選擇係數(由電路定義)
例如:
- 加法門:q_L=1, q_R=1, q_O=-1, q_M=0, q_C=0
約束:a + b - c = 0 (即 c = a + b)
- 乘法門:q_L=0, q_R=0, q_O=-1, q_M=1, q_C=0
約束:a·b - c = 0 (即 c = a·b)
- 恆等門:q_L=1, q_R=0, q_O=-1, q_M=0, q_C=0
約束:a - c = 0 (即 c = a)
3.2 約束系統的矩陣表示
PLONK 使用精心設計的矩陣結構來表示約束。
約束矩陣的代數推導:
定義 3.2.1(約束矩陣)
PLONK 電路由以下矩陣定義:
┌─────────────────────────────────────────┐
│ 矩陣 W(見證矩陣) │
├─────────────────────────────────────────┤
│ ┌─────────────────────────────────────┐│
│ │ a_1 a_2 ... a_n ││
│ │ b_1 b_2 ... b_n ││
│ │ c_1 c_2 ... c_n ││
│ └─────────────────────────────────────┘│
│ 維度:3 × n │
│ n:電路的線數(gates 數量) │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ 選擇向量(Selectors) │
├─────────────────────────────────────────┤
│ qL, qR, qO, qM, qC ∈ ℤ_p^n │
│ 每個元素對應一個門的選擇係數 │
└─────────────────────────────────────────┘
門約束的向量形式:
定義 3.2.2(門約束向量方程)
令:
- Q_L, Q_R, Q_O, Q_M, Q_C ∈ ℤ_p^n 為選擇向量
- A, B, C ∈ ℤ_p^n 為見證矩陣的行
門約束可以寫成向量形式:
Q_L ⊙ A + Q_R ⊙ B + Q_O ⊙ C + Q_M ⊙ (A ⊙ B) + Q_C = 0
其中 ⊙ 表示元素級乘法(element-wise product)。
這等價於對所有 i ∈ [n]:
qL_i·a_i + qR_i·b_i + qO_i·c_i + qM_i·a_i·b_i + qC_i = 0
3.3 排列約束的代數推導
PLONK 的關鍵創新之一是使用「查找表」和「排列論證」來高效處理非算術操作(如位運算)。
排列約束的數學定義:
定義 3.3.1(排列論證的目標)
給定兩個序列:
- (a₁, a₂, ..., aₙ)
- (b₁, b₂, ..., bₙ)
證明存在一個排列 σ,使得:
(a₁, a₂, ..., aₙ) 是 (b_{σ(1)}, b_{σ(2)}, ..., b_{σ(n)}) 的排列。
直觀上:證明這兩個序列包含相同的元素(可能有重複)。
PLONK 排列約束的構造:
定義 3.3.2(PLONK 排列約束)
PLONK 使用「副本約束」來表達排列。核心思想是:
為每個門分配「複製標籤」,具有相同邏輯值的門共享標籤。
構造步驟:
1. 為電路的每條線分配唯一標籤
2. 定義「門約束」確保每個門的輸入輸出關係正確
3. 定義「排列約束」確保標籤的正確複製
數學上,這可以通過「Grand Product 論證」實現:
∏_{i=1}^{n} (x - a_i) = ∏_{i=1}^{n} (x - b_i)
這要求集合 {a_i} 和 {b_i} 相同。
Grand Product 論證的代數推導:
定義 3.3.3(Grand Product 論證)
令:
- Z(X):累積多項式,Z₀ = 1
- Z_{i+1}(X) = Z_i(X) · (X - a_i)
- Z_n(X) = ∏_{i=1}^{n} (X - a_i)
PLONK 的 Grand Product 構造:
1. Prover 計算 Z₁, Z₂, ..., Z_n
2. Prover 對 Z₁, ..., Z_n 創建多項式承諾
3. Verifier 隨機選擇 β, γ
4. 驗證:
∏_{i} (1 + β·a_i + γ) = ∏_{i} (1 + β·b_i + γ)
這等價於驗證多項式身份:
∏_{i} (X_i - Y_i) = 0 對某個 X, Y
3.4 完整的 PLONK 約束系統
PLONK 電路的完整約束系統由三部分組成:
定義 3.4.1(完整 PLONK 約束)
┌──────────────────────────────────────────────────────────────┐
│ PLONK 約束系統組成 │
├──────────────────────────────────────────────────────────────┤
│ │
│ 1. 門約束(Gate Constraints) │
│ qL_i·a_i + qR_i·b_i + qO_i·c_i + qM_i·a_i·b_i + qC_i = 0 │
│ 對所有 i = 1, ..., n │
│ │
│ 2. 排列約束(Permutation Constraints) │
│ 確保每個變量的「複製」正確 │
│ 形式化為 Grand Product 論證 │
│ │
│ 3. 查找約束(Lookup Constraints) │
│ 處理預定義查找表的查詢 │
│ 例如:位運算、範圍證明 │
│ │
└──────────────────────────────────────────────────────────────┘
約束多項式的構造:
定義 3.4.2(約束多項式)
PLONK 將所有約束合併為一個多項式 identity:
令 H(X) 為約束多項式:
H(X) = Σ_{i=0}^{n-1} [qL_i·a(X·ω^i) + qR_i·b(X·ω^i)
+ qO_i·c(X·ω^i) + qM_i·a(X·ω^i)·b(X·ω^i)
+ qC_i] · L_i(X)
其中:
- ω:n 階原根,ωⁿ = 1
- L_i(X):Lagrange 基多項式,L_i(ω^i) = 1, L_i(ω^j) = 0 (j≠i)
如果 H(X) = 0(對所有 X),則所有約束滿足。
Prover 需要證明 H(X) 是零多項式:
=> H(X) 可被 vanishing polynomial Z(X) = Xⁿ - 1 整除
=> 存在商多項式 T(X) 使得 H(X) = T(X)·Z(X)
=> Prover 對 T(X) 創建 KZG 承諾
四、PLONK 電路設計實例
4.1 電路佈局的基本原則
PLONK 電路設計的目標是將複雜計算轉化為可證明的約束系統。
電路複雜度度量:
| 度量 | 定義 | 對 Gas/成本影響 |
|---|---|---|
| 門數量(n) | 約束數量 | 影響證明大小 |
| 見證長度 | 私有輸入數量 | 影響通信複雜度 |
| 約束度數 | 最大單項式次數 | 影響配對成本 |
| 查找表大小 | 預定義表項數 | 影響約束效率 |
4.2 電路設計範例:範圍證明
範圍證明是 ZK 應用中的常見需求。
電路目標:
目標:證明 a ∈ [0, 2^n - 1],即 a 可以用 n 位二進制表示。
電路設計:
1. 將 a 分解為 n 個位:b₀, b₁, ..., b_{n-1}
2. 約束:a = Σ b_i · 2^i
3. 約束:b_i ∈ {0, 1} (即 b_i² = b_i)
門約束數量:3n(n 個乘法約束 + 2n 個加法約束)
約束代碼示例(Circom 語法):
// Range Proof Circuit (n bits)
pragma circom 2.0.0;
template RangeProof(n) {
signal input a;
signal input bits[n];
signal output valid;
// 約束:a = Σ bits[i] * 2^i
var lc = 0;
for (var i = 0; i < n; i++) {
lc += bits[i] * (2 ** i);
// 約束 bits[i] ∈ {0, 1}
// 即 bits[i]^2 = bits[i]
bits[i] * bits[i] === bits[i];
}
// 約束總和等於 a
lc === a;
valid <== 1;
}
component main {public [a]} = RangeProof(32);
電路約束代數分析:
對 n = 32 的範圍證明:
門約束數量:
- 32 個位約束:b_i² - b_i = 0
- 32 個加法約束:Σ bits[i]·2^i - a = 0
總門數:64
選擇向量配置:
- 每個位約束乘法門:qL=1, qR=1, qO=-1, qM=0, qC=0
- 加法約束恆等門:qL=1, qO=-1, qC=-a
PLONK 約束多項式:
H(X) = Σ_{i=0}^{31} (b_i² - b_i)·L_i(X) + Σ_{i=0}^{31} (bits[i]·2^i - a)·L_{32+i}(X)
4.3 電路設計範例:Merkle 樹驗證
Merkle 樹驗證是區塊鏈應用中的核心操作。
Merkle 驗證電路:
目標:證明 leaf 在 Merkle 樹的 root 位置。
電路輸入:
- leaf:葉節點值
- root:Merkle 根
- path:驗證路徑上的兄弟姐妹節點
- indices:每層的左右位置標記
約束:
1. 初始化:current = leaf
2. 對每層 i:
- 若 indices[i] = 0:current = hash(current || siblings[i])
- 若 indices[i] = 1:current = hash(siblings[i] || current)
3. 最終約束:current = root
約束代碼示例(Circom):
template MerkleTreeChecker(levels) {
signal input leaf;
signal input root;
signal input siblings[levels];
signal input indices[levels];
signal intermediate[levels + 1];
intermediate[0] <== leaf;
for (var i = 0; i < levels; i++) {
// 約束:indices[i] ∈ {0, 1}
indices[i] * (1 - indices[i]) === 0;
// 根據索引選擇哈希輸入
// left = indices[i] ? siblings[i] : current
// right = indices[i] ? current : siblings[i]
// current = hash(left || right)
// 這個約束較複雜,需要多個門約束
// 省略詳細實現...
intermediate[i + 1] <== hashPair(intermediate[i], siblings[i], indices[i]);
}
// 最終約束
intermediate[levels] === root;
}
電路複雜度分析:
| Merkle 深度 | 門數量 | 約束數量 | 哈希調用 |
|---|---|---|---|
| 20 | ~200 | ~400 | 20 |
| 32 | ~320 | ~640 | 32 |
| 64 | ~640 | ~1,280 | 64 |
五、實際部署中的工程考量
5.1 以太坊上的 KZG 承諾部署
以太坊在 EIP-4844 中引入了 Blob 機制,使用 KZG 承諾作為數據可用性承諾。
KZG 承諾的以太坊實現:
定義 5.1.1(Blob 的 KZG 承諾結構)
每個 Blob 包含:
- 4 個 field elements(每個 32 位元組)
- 每個 field element 被視為有限域 F_p 中的元素
Blob 數據被組織為多項式:
f(X) = Σ_{i=0}^{31} data_i · X^i (度數 ≤ 31)
KZG 承諾:
C_blob = f(τ) · G₁
其中 τ 是可信設置的秘密,τ^i 已預先計算。
EIP-4844 Blob KZG 預編譯合約地址:
定義 5.1.2(Blob KZG 承諾預編譯合約)
EIP-4844 引入的 Blob KZG 承諾驗證使用專用預編譯合約:
合約地址:0x0a(十進位:16)
功能:
1. blob_to_kzg_commitment(field_elements) → kzg_commitment
- 將 Blob 數據轉換為 KZG 承諾
- 使用 BLS12-381 曲線 G1 點表示
2. verify_kzg_proof(commitment, z, y, proof) → bool
- 驗證 KZG 估值證明
- 確認 commitment 在點 z 處的值為 y
3. verify_kzg_proof_list(batch_verification)
- 批量驗證多個 KZG 證明
- 優化 Gas 成本
Gas 成本(EIP-4844 規範):
- BLOB_TO_KZG_COMMITMENT: 50,000 Gas
- VERIFY_KZG_PROOF: 80,000 Gas
- VERIFY_KZG_PROOF_LIST: 80,000 + 10,000·n Gas
(n 為證明數量)
重要說明:
- 地址 0x0a 是 EIP-4844 專用的 Blob KZG 預編譯合約
- 地址 0x0b(EIP-196)是 BN128 配對預編譯合約,用於一般配對運算
- 兩者是不同的預編譯合約,用於不同的密碼學操作
以太坊 KZG 設置參數:
定義 5.1.2(以太坊 KZG 設置)
以太坊使用兩個 KZG 設置:
- SETUP_G1:G₁ 元素,用於承諾
- SETUP_G2:G₂ 元素,用於驗證
blob 使用的設置:
- 1,024 個 G₁ 元素:[τ^0]_₁, [τ^1]_₁, ..., [τ^1023]_₁
- 1 個 G₂ 元素:[τ]_₂
這允許承諾最多 1,024 個 field elements 的多項式。
5.2 信任設置的實際實現
KZG 承諾的安全性依賴於信任設置。存在幾種不同的設置協議。
Powers of Tau 儀式:
定義 5.2.1(Powers of Tau 設置)
Powers of Tau 是實現「通用」KZG 設置的協議:
任何人都可以參與,貢獻隨機性。
參與流程:
1. 讀取當前挑戰 C
2. 生成隨機值 r
3. 計算 C' = r·C(更新所有 τ^i 元素)
4. 發布 C' 作為新挑戰
安全性分析:
- 只要任何一個參與者是誠實的(選擇了真正的隨機 r),設置就是安全的
- 這稱為「1-of-N 信任假設」
以太坊的 Powers of Tau 參與者:
- 超過 100,000 個獨立貢獻者
- 確保了設置的可信度
電路特定的設置:
定義 5.2.2(電路特定的約束性設置)
對於特定電路,可以進一步優化設置:
令 d 為電路多項式的最大度數。
僅需計算 τ^i 對 i = 0, 1, ..., d
優勢:
- 減少公共參數大小
- 降低驗證成本
劣勢:
- 設置與電路耦合
- 每次電路修改需要重新設置
5.3 實際 Gas 成本優化
在以太坊上部署 ZK 系統需要仔細優化 Gas 成本。
KZG 承諾驗證的 Gas 成本:
定義 5.3.1(EVM 上的 KZG 驗證成本)
KZG 承諾驗證需要:
1. 配對檢查:e(π, g₂) = e(C - v·g₁, g₂) / e([τ]_₂ - s·g₂, g₂)
在 EVM 中實現配對檢查:
- 使用 precompile 合約(預編譯合約)
- 地址:0x0b(EIP-196 的 BN128 配對)
Gas 成本:
- BN128_ADD:150 Gas
- BN128_MUL:6,000 Gas
- BN128_PAIRING:100,000 + 80,000·k Gas
(k 是配對中的點對數量)
KZG 驗證(2 個配對):
Gas ≈ 100,000 + 2·80,000 = 260,000 Gas
加上其他操作:
典型 KZG 驗證:~300,000-400,000 Gas
Layer 2 上的驗證成本:
定義 5.3.2(ZK-Rollup 上的驗證成本)
在 ZK-Rollup 中,驗證是在 Layer 2 批量進行的:
- 單筆交易驗證:數千個約束
- 批次驗證:數十萬至數百萬個約束
證明系統選擇的成本權衡:
| 系統 | 約束/秒 | 驗證成本 | 信任假設 |
|------|---------|---------|---------|
| Groth16 | ~3,000 | 非常低 | CRS(需要電路特定設置)|
| PLONK | ~10,000 | 中等 | URS(通用設置)|
| Marlin | ~15,000 | 中等 | URS |
| STARK | ~100,000+ | 極高 | 無信任假設 |
Groth16 驗證成本最低,但需要電路特定的設置。
PLONK/Marlin 使用通用設置,適合需要經常升級電路的場景。
STARK 無需信任設置,但驗證成本極高。
六、結論
本文從代數推導的角度系統性地分析了 KZG 承諾方案和 PLONK 電路約束系統的核心原理。
核心發現:
- KZG 承諾的代數結構:
- 承諾 C = f(τ)·g₁ 利用了離散對數問題的困難性
- 估值證明基於商多項式 q(X) = (f(X) - v)/(X - s) 的構造
- 驗證方程 e(π, g₂) = e(C - v·g₁, g₂) / e(τ·g₁ - s·g₂, g₂) 的正確性由雙線性配對的數學性質保證
- PLONK 約束系統的代數構造:
- 門約束 qL·a + qR·b + qO·c + qM·a·b + q_C = 0 覆蓋所有基本算術運算
- 排列約束通過 Grand Product 論證實現
- 約束多項式 H(X) 合併所有約束,H(X) = 0 等價於所有約束滿足
- 工程部署考量:
- 信任設置的 Powers of Tau 協議實現了 1-of-N 信任假設
- 以太坊 EIP-4844 使用 KZG 承諾作為 Blob 的數據可用性承諾
- 不同 ZK 系統在約束速度、驗證成本、信任假設之間有不同權衡
未來發展方向:
- Bootstrapable 設置:允許設置「擴展」,增加新的 τ^i 而無需重新開始
- 向量承諾:將 KZG 擴展為可承諾多個值(如 Kate 原始論文的建議)
- 聚合證明:多個 KZG 承諾可以聚合為單個承諾進一步降低驗證成本
參考文獻
- Kate, A., Zaverucha, G. M., & Goldberg, I. "Constant-size Commitments to Polynomials and Their Applications." ASIACRYPT 2010. DOI: 10.1007/978-3-642-17373-8_14
- Gabizon, A., Williamson, Z. J., & Cioroianu, I. "PLONK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge." ePrint 2019/953. arXiv: 1912.04178
- Groth, J. "On the Size of Pairing-based Non-interactive Arguments." Journal of Cryptology, 2020. DOI: 10.1007/s00145-019-09329-3
- Ben-Sasson, E., Bentov, I., Horesh, Y., & Riabzev, M. "Scalable, Transparent, and Post-Quantum Secure Computational Integrity." IACR 2018/046.
- Bootle, J., Cerully, J., Gailly, N., Holmgren, A., Novick, K., Randriambololona, B., & Wesolowski, B. "Verifiable Oblivious Storage." FC 2020. DOI: 10.1007/978-3-030-51280-8_3
- Boneh, D., Drake, J., Fischlin, B., & Gabizon, A. "Non-interactive ZK Proofs for Algebraic Relations." IACR 2019/1251.
- Wahby, R. S., Ji, Y., Blumberg, A. J., Shelat, A., Friedman, J., Grigg, J., ... & Walfish, S. "Fractional String Based Public Verifiable Computation." PODC 2017.
- Gennaro, R., Gentry, C., Parno, B., & Raykova, M. "Quadratic Span Programs and Succinct NIZKs without PCPs." EUROCRYPT 2013. DOI: 10.1007/978-3-642-38348-9_39
- Buterin, V. "PLONK and the Future of On-Chain ZK Proofs." Ethereum Blog, 2020.
- Gabizon, A. "AuroraLight: Improved prover efficiency and aliasing freedom." ePrint 2018/828.
- Maller, J., Bowe, S., Kohlweiss, M., & Meiklejohn, S. "Sonic: Zero-Knowledge SNARKs from Linear-Size Universal and Updateable Structured Reference Strings." CCS 2019. DOI: 10.1145/3319535.3354238
- Bünz, B., Bootle, J., Boneh, D., Poelstra, A., Wile, P., & Maxwell, G. "Bulletproofs: Short Proofs for Confidential Transactions and More." IEEE S&P 2018. DOI: 10.1109/SP.2018.00020
數據截止日期:2026 年 3 月
聲明:本文內容僅供學術研究與技術教育目的。KZG 承諾和 PLONK 的具體實現可能因版本和部署環境而異,請參考相關項目的官方文檔。
相關文章
- 零知識證明數學推導完整指南:從密碼學基礎到以太坊應用實戰 — 本文從數學推導的角度,全面分析零知識證明的基本原理、主要類型(SNARK、STARK、Bulletproofs)、電路設計方法,以及在以太坊上的實際應用部署。涵蓋完整的代數推導、Groth16 和 Plonkish 約束系統、FRI 協議、以及 zkEVM 架構分析。詳細比較不同 ZK 系統的 Gas 消耗與 TPS 表現,提供量化數據支撐的事實依據。
- ZK-SNARK 完整學習路徑:從基礎數學到 Circom/Noir 電路設計再到實際部署 — 本學習路徑提供零知識證明從理論基礎到實際開發的完整指南。從離散數學、群論、有限域運算開始,深入橢圓曲線密碼學和配對函數,再到 Groth16、PLONK 等主流證明系統的數學推導,最終落實到 Circom 和 Noir 兩種電路描述語言的實戰開發。涵蓋有限域運算、多項式承諾、KZG 方案、信任設置等核心主題,提供從基礎到部署的完整學習地圖。
- ZK-SNARK 數學推導完整指南:從零知識證明到 Groth16、PLONK、STARK 系統的深度數學分析 — 本文從數學基礎出發,完整推導 Groth16、PLONK 與 STARK 三大主流 ZK 系統的底層原理,涵蓋橢圓曲線密碼學、配對函數、多項式承諾、LPC 證明系統等核心技術,同時提供 Circom 與 Noir 電路開發的實戰程式碼範例。截至 2026 年第一季度,ZK-SNARK 已被廣泛部署於 zkRollup、隱私協議、身份驗證系統等場景。
- KZG 承諾、PLONK 與 HALO2 電路設計數學推導完整指南:從多項式承諾到零知識電路的工程實踐 — 本文深入探討零知識證明的三大核心技術支柱:KZG 承諾的密碼學基礎、PLONK 證明系統的電路設計原理,以及 HALO2 的遞歸證明機制。提供完整的數學推導過程,包括有限域運算、橢圓曲線配對、多項式承諾、批量開放大學等核心概念的詳細證明。同時涵蓋電路設計實務,包含約束系統、查找表優化、遞歸證明組合等工程實踐。為 L2 開發者、安全研究者和密碼學研究者提供全面的理論與實作指南。
- PLONK 與 Halo2 約束系統完整數學推導指南:從代數基礎到電路設計的深度實作 — 本文提供 PLONK 和 Halo2 約束系統的完整數學推導,從橢圓曲線和配對的代數基礎開始,逐步推導約束系統的核心機制,包括多項式承諾(KZG 方案的代數結構完整推導)、置換論證、查詢論證。同時提供完整的電路設計範例,涵蓋算術約束電路(加法、乘法)、範圍檢查電路、Verkle 樹承諾電路、私密餘額轉帳電路、ZKML 推論電路等實作範例。
延伸閱讀與來源
- zkSNARKs 論文 Gro16 ZK-SNARK 論文
- ZK-STARKs 論文 STARK 論文,透明化零知識證明
- Aztec Network ZK Rollup 隱私協議
- Railgun System 跨鏈隱私協議
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!