ZK-SNARK 完整學習路徑:從基礎數學到 Circom/Noir 電路設計再到實際部署
本學習路徑提供零知識證明從理論基礎到實際開發的完整指南。從離散數學、群論、有限域運算開始,深入橢圓曲線密碼學和配對函數,再到 Groth16、PLONK 等主流證明系統的數學推導,最終落實到 Circom 和 Noir 兩種電路描述語言的實戰開發。涵蓋有限域運算、多項式承諾、KZG 方案、信任設置等核心主題,提供從基礎到部署的完整學習地圖。
ZK-SNARK 完整學習路徑:從基礎數學到 Circom/Noir 電路設計再到實際部署
概述
零知識證明(Zero-Knowledge Proof,ZKP)是現代密碼學最具革命性的創新之一,它允許一方(證明者)向另一方(驗證者)證明某個陳述是真實的,而不需要透露任何除了陳述真實性以外的資訊。在區塊鏈領域,ZK-SNARK(Zero-Knowledge Succinct Non-Interactive Arguments of Knowledge)已被廣泛應用於 zkRollup(zkSync Era、Starknet、Polygon zkEVM、Aztec)、隱私協議(Tornado Cash、Railgun、Aztec Network)、身份驗證系統、去中心化身份(DID)等場景。
本學習路徑旨在為具有一定密碼學基礎的讀者提供從零知識證明理論基礎到實際電路開發的完整指南。我們將從離散數學和橢圓曲線密碼學開始,逐步深入到 Groth16、PLONK、Groth-Maller 等主流證明系統的數學推導,最終落實到 Circom 和 Noir 兩種主流電路描述語言的實戰開發。
第一階段:數學基礎建立
1.1 離散數學核心概念
1.1.1 群論基礎
零知識證明的數學根基建立在抽象代數之上。設 $(G, +)$ 為一個阿貝爾群,滿足以下公理:
群公理
封閉性:$\forall a, b \in G: a + b \in G$
結合律:$\forall a, b, c \in G: (a + b) + c = a + (b + c)$
單位元:$\exists 0 \in G: \forall a \in G: a + 0 = 0 + a = a$
逆元:$\forall a \in G: \exists (-a) \in G: a + (-a) = (-a) + a = 0$
交換律:$\forall a, b \in G: a + b = b + a$
循環群
若存在 $g \in G$ 使得每個群元素都可以表示為 $g$ 的冪次,則 $G$ 為循環群,$g$ 為生成元:
$$G = \langle g \rangle = \{g^0, g^1, g^2, ..., g^{n-1}\}$$
其中 $n = |G|$ 為群的階(Order)。
1.1.2 有限域運算
有限域 $\mathbb{F}_p$(其中 $p$ 為質數)是密碼學的基礎運算結構:
加法運算
加法封閉於 $\mathbb{F}_p$:
$$\forall a, b \in \mathbb{F}p: a + b \mod p \in \mathbb{F}p$$
乘法運算
乘法封閉於 $\mathbb{F}p^* = \mathbb{F}p \setminus \{0\}$:
$$\forall a, b \in \mathbb{F}p^: a \cdot b \mod p \in \mathbb{F}p^$$
費馬小定理
$$\forall a \in \mathbb{F}_p^*: a^{p-1} \equiv 1 \mod p$$
模反元素
對於任意 $a \in \mathbb{F}_p^*$,存在唯一的 $a^{-1}$ 使得:
$$a \cdot a^{-1} \equiv 1 \mod p$$
1.1.3 多項式運算
多項式在零知識證明中扮演核心角色。
多項式表達
一個次數為 $d$ 的多項式定義為:
$$f(x) = ad x^d + a{d-1} x^{d-1} + ... + a1 x + a0$$
其中 $ai \in \mathbb{F}p$,$a_d \neq 0$。
多項式除法
對於多項式 $f(x)$ 和 $g(x)$,存在唯一的多項式 $q(x)$ 和 $r(x)$ 使得:
$$f(x) = q(x) \cdot g(x) + r(x)$$
其中 $\deg(r) < \deg(g)$。
多項式插值
給定 $n$ 個點 $(x1, y1), (x2, y2), ..., (xn, yn)$,存在唯一的多項式 $f(x)$ 使得 $\deg(f) < n$ 且 $f(xi) = yi$。
拉格朗日插值公式:
$$f(x) = \sum{i=1}^{n} yi \cdot \prod{j \neq i} \frac{x - xj}{xi - xj}$$
Schwartz-Zippel 引理
這是零知識證明多項式承諾的理論基礎:
對於次數為 $d$ 的多項式 $f(x)$,若 $r$ 為從有限域 $\mathbb{F}_p$ 均勻隨機選取的元素,則:
$$\Pr[f(r) = 0] \leq \frac{d}{p}$$
1.2 橢圓曲線密碼學
1.2.1 橢圓曲線定義
橢圓曲線 $E$ 定義於有限域 $\mathbb{F}_p$ 上:
$$E: y^2 = x^3 + ax + b \mod p$$
其中判別式 $\Delta = 4a^3 + 27b^2 \neq 0 \mod p$ 確保曲線無奇點。
1.2.2 群運算
設 $P = (x1, y1)$、$Q = (x2, y2)$ 為曲線上兩點,$R = P + Q = (x3, y3)$:
當 $P \neq Q$(不同點相加)
$$\lambda = \frac{y2 - y1}{x2 - x1} \mod p$$
$$x3 = \lambda^2 - x1 - x_2 \mod p$$
$$y3 = \lambda(x1 - x3) - y1 \mod p$$
當 $P = Q$(倍點運算)
$$\lambda = \frac{3x1^2 + a}{2y1} \mod p$$
$$x3 = \lambda^2 - 2x1 \mod p$$
$$y3 = \lambda(x1 - x3) - y1 \mod p$$
1.2.3 橢圓曲線參數
以太坊使用的 BN254 曲線是 ZK-SNARK 最廣泛採用的曲線:
| 參數 | 值 | 說明 |
|---|---|---|
| $p$ | $21888242871839275222246405745257275088548364400416034343698204186575808495617$ | 質數(~254 bits) |
| $n$ | $21888242871839275222246405745257275088696311157297823662689037894645226208583$ | 基點的階 |
| $G_1$ | $E(\mathbb{F}_p)$ 上的循環群 | 標量運算群 |
| $G_2$ | $E'(\mathbb{F}_{p^2}})$ 上的循環群 | 配對支援群 |
| $G_T$ | $\mathbb{F}_{p^{12}}$ 的 $n$ 階子群 | 目標配對群 |
1.2.4 標量乘法與循環群
對於基點 $G \in E(\mathbb{F}_p)$,標量乘法定義為:
$$k \cdot G = \underbrace{G + G + ... + G}_{k \text{ times}}$$
離散對數問題(DLP):給定 $P$ 和 $Q = k \cdot P$,求 $k$ 在計算上是不可行的。
1.3 密碼學假設
1.3.1 離散對數假設
離散對數假設(DLA)
對於生成元 $g$ 的循環群 $G$,給定 $g^a$ 和 $g^b$,計算 $g^{ab}$ 在多項式時間內是不可行的。
1.3.2 橢圓曲線離散對數假設
ECDLA
對於橢圓曲線群 $E(\mathbb{F}_p)$,給定點 $P$ 和 $Q = k \cdot P$,求 $k$ 在計算上是不可行的。
1.3.3 配對友好曲線假設
Tate 配對計算假設
對於配對友好的橢圓曲線,從配對結果逆向計算原像是不可行的。
第二階段:零知識證明理論
2.1 零知識證明的定義
2.1.1 直覺理解
想像這樣的場景:Peggy 知道一個迷宮的 secret word,能夠直接走到終點。Victor 站在迷宮入口,他想知道 Peggy 是否真的知道 secret word,但 Peggy 不想透露 word 本身。
零知識證明的解決方案:Peggy 和 Victor 重複以下過程 N 次:
- Victor 隨機選擇左邊或右邊入口,站在中間
- Peggy 從 Victor 指定的那一側進入,確保她從 Victor 看不到的那一側出現
- 如果 Peggy 真的知道 secret word,她總是能這樣做
- 如果她不知道,平均每兩次就有一次會失敗
2.1.2 形式定義
一個互動式證明系統 $(P, V)$ 滿足零知識性,如果存在一個模擬器 $S$ 使得以下兩種分布不可區分:
Completeness(完整性)
如果陳述為真,誠實的驗證者總是接受:
$$\Pr[V \text{ accepts } | \text{ statement is true}] = 1$$
Soundness(可靠性)
如果陳述為假,任何欺騙的證明者都不能讓驗證者接受(概率可忽略):
$$\Pr[V \text{ accepts } | \text{ statement is false}] \leq \epsilon$$
Zero-Knowledge(零知識性)
對於任何可能作弊的驗證者 $V^*$,存在模擬器 $S$ 使得:
$$\{view_{P,V^*}(x)\} \approx \{S(x)\}$$
其中 $view_{P,V^}(x)$ 包含所有隨機硬幣硬擲結果和來自 $V^$ 的消息。
2.2 交互式與非交互式證明
2.2.1 Fiat-Shamir 啟發式
將互動式證明轉換為非互動式證明的標準技術:
原始的互動式協議:
- Prover 發送 commitment $a$
- Verifier 發送隨機挑戰 $c$
- Prover 發送 response $z$
- Verifier 驗證
非互動式版本使用哈希函數模擬 Verifier:
$$c = H(a, x)$$
其中 $H$ 是密碼學哈希函數,$x$ 是公共輸入。
安全性證明
在隨機預言機模型下,Fiat-Shamir 轉換保持零知識性和可靠性。
2.3 ZK-SNARK 的特殊性質
2.3.1 Succinctness(簡潔性)
SNARK 的驗證者運行時間是 $O(\log n)$,與計算規模 $n$ 對數相關,這使得它在區塊鏈場景中特別有價值。
2.3.2 Non-Interactive(非交互性)
只需要一個消息(證明),無需多輪交互。
2.3.3 Arguments(論證)
不同於證明(Proof),論證只對多項式時間的 prover 成立,假設了某些密碼學假設。
2.3.4 of Knowledge(知識論證)
Prover 不僅證明陳述為真,還證明它知道導致陳述為真的 witness。
第三階段:Groth16 系統深度分析
3.1 算術電路與 R1CS
3.1.1 二次算術程序(QAP)
將電路轉換為多項式形式是 Groth16 的第一步。
示例:面積計算電路
輸入:長 $a$、寬 $b$
計算:面積 $c = a \times b$
對應的乘法閘:
- Gate 1: $qL \cdot a + qR \cdot b + qO \cdot c + qM \cdot (a \cdot b) = q_C$
R1CS 表示:
$$\langle Ai, X \rangle \cdot \langle Bi, X \rangle = \langle C_i, X \rangle$$
其中 $X = (1, a, b, c, ...)$ 是所有信號的向量。
3.2 密鑰生成
3.2.1 信任設置(Trusted Setup)
Groth16 需要一個多方計算(MPC)信任設置。
結構化參考字串(SRS)
$$\text{SRS} = \left( g^\alpha, g^{\beta}, g^{\delta}, \left\{ g^{\tau^i} \right\}{i=0}^{d}, \left\{ g^{\beta \tau^i + \alpha \sigmaj(\tau^i)} \right\}_{i=0,j=1}^{d, m} \right)$$
3.2.2 密钥生成算法
Prover:
給定公共輸入 x 和私有 witness w
計算 witness 對應的多項式值
Commitments:
計算 witness 的多項式承諾
使用 Bulletproofs 或 KZG 承諾
Proof:
生成 proof π = (A, B, C)
其中每個元素都是橢圓曲線點
3.3 證明生成
3.3.1 證明者計算
给定 R1CS 約束和 witness,證明者計算:
A 元素
$$A = \alpha + \sum{i=0}^{d} ai \tau^i + \delta \cdot r_A$$
其中 $a_i$ 是電路多項式的係數。
B 元素
$$B = \beta + \sum{i=0}^{d} bi \tau^i + \delta \cdot r_B$$
C 元素
$$C = \frac{\sum{i=0}^{d} \sum{j=0}^{d} c{i,j} \tau^{i+j} - \alpha \cdot \beta}{\delta} + \sum{i=0}^{d} ci \tau^i + \delta \cdot rC$$
3.4 驗證算法
3.4.1 驗證檢查
Groth16 驗證需要一個配對檢查:
$$e(A, B) = e(\alpha, \beta) \cdot e\left( \sum{i} \pii \cdot \text{pub}i, \gamma \right) \cdot e\left( \sum{i} \pi'i \cdot \text{out}i, \delta \right)$$
其中:
- $e: G1 \times G2 \to G_T$ 是 Tate 配對
- $\alpha, \beta, \gamma, \delta$ 是 SRS 的結構化元素
- $\pii, \pi'i$ 是證明中的承諾
3.5 Groth16 的優缺點
| 特性 | 評價 |
|---|---|
| 證明大小 | 非常小(3 個群元素) |
| 驗證速度 | 快速(3 個配對 + 2 個多標量乘法) |
| 信任設置 | 需要結構化的信任設置 |
| 電路特定 | 每個電路需要新的設置 |
| 透明度 | 非通用透明 |
第四階段:PLONK 系統深度分析
4.1 PLONK 的創新
PLONK(Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge)是由 Gabizon、Williamson 和 Ciobotaru 於 2019 年提出的通用簡潔論證系統。
主要創新
- 通用可信賴設置:只需一次設置,可重複用於任何電路(最多到設置上限)
- 自適應配對:利用置換論證實現電線連接約束
- 門檻效應:不需要所有 Prover 都誠實
4.2 多項式承諾
4.2.1 KZG 承諾
PLONK 使用 Kate-Zaverucha-Goldberg(KZG)承諾方案。
承諾生成
$$C = g^{\pi(\tau)}$$
其中 $\pi(\tau)$ 是多項式 $\pi(x)$ 在神秘點 $\tau$ 的估值。
批次開啟
利用多項式除法,可以在單次開啟中驗證多個多項式。
4.3 PLONK 約束系統
4.3.1 標準形式
PLONK 使用以下標準形式的約束:
加法門
$$(a + b) \cdot qL + a \cdot qR + b \cdot qO + qM = q_C$$
複製約束
使用置換論證確保信號連接的正確性。
4.4 PLONK 證明生成流程
1. 計算 witness 多項式
2. 計算約束多項式
3. 生成置換論證
4. 計算商多項式
5. 生成多項式承諾
6. 驗證者挑戰 Fiat-Shamir
7. 打開所有承諾
4.5 PLONK 的實際應用
PLONK 及其變體(Turbo-PLONK、Ultra-PLONK、PLONKup)已被廣泛部署:
| 項目 | 採用版本 | 應用場景 |
|---|---|---|
| Zcash Sapling | Groth16 | 隱私交易 |
| Aztec | PLONK | zkRollup |
| zkSync | PLONKish | zkEVM |
| Polygon zkEVM | PLONKish | zkEVM |
第五階段:Circom 電路開發實戰
5.1 Circom 語法基礎
5.1.1 信號定義
// 公有輸入和私有輸入
signal input a;
signal input b;
signal output c;
// 中間信號
signal temp;
5.1.2 約束
// 強制約束
c <== a * b;
// 雙向約束(等價於兩個單向約束)
a * b === c;
5.1.3 模板定義
template Multiplier() {
signal input a;
signal input b;
signal output c;
c <== a * b;
// 隱式約束:c = a * b
}
5.2 完整電路示例:範圍證明
5.2.1 電路設計
pragma circom 2.0.0;
template RangeProof(nBits) {
signal input in;
signal input bit[nBits];
signal output out;
// 約束:每個 bit 是二進制的
for (var i = 0; i < nBits; i++) {
bit[i] * (1 - bit[i]) === 0;
}
// 約束:bit 是 in 的二進制表示
var lc = 0;
var e = 1;
for (var i = 0; i < nBits; i++) {
lc += bit[i] * e;
e = e * 2;
}
lc === in;
// 約束:in 在允許範圍內(0 或 1)
// 這裡實現一個簡單的 0/1 選擇器
out <== bit[0];
}
template Main() {
signal input secret;
signal input bit[8];
signal output result;
component rangeProof = RangeProof(8);
rangeProof.in <== secret;
rangeProof.bit <== bit;
result <== rangeProof.out;
}
component main = Main();
5.2.2 編譯電路
# 安裝 circom
cargo install circom
# 編譯電路
circom circuit.circom --r1cs --wasm --sym -o ./output
5.2.3 生成強可信賴設置
# 使用 snarkjs 生成 powers of tau
snarkjs powersoftau new bn128 12 -c pot12_0000.ptau -v
# 累計powers of tau
snarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau --name="First contribution" -v
# 準備階段
snarkjs powersoftau prepare phase2 pot12_0001.ptau pot12_final.ptau -v
# 生成初始 zkey
snarkjs groth16 setup circuit.r1cs pot12_final.ptau circuit_0000.zkey
# 進行 trusted setup 貢獻
snarkjs zkey contribute circuit_0000.zkey circuit_0001.zkey --name="Contributor 1" -v
# 導出驗證金鑰
snarkjs zkey export verificationkey circuit_final.zkey verification_key.json
5.3 複雜電路示例:Merkle 樹驗證
pragma circom 2.0.0;
include "../circomlib/poseidon.circom";
// Poseidon 哈希模板
template HashLeftRight() {
signal input left;
signal input right;
signal output out;
component hasher = Poseidon(2);
hasher.inputs[0] <== left;
hasher.inputs[1] <== right;
out <== hasher.out;
}
// Merkle 樹驗證器
template MerkleProof(levels) {
signal input leaf;
signal input root;
signal input pathElements[levels];
signal input pathIndices[levels];
signal computedPath[levels + 1];
computedPath[0] <== leaf;
for (var i = 0; i < levels; i++) {
pathIndices[i] * (1 - pathIndices[i]) === 0;
component hash = HashLeftRight();
if (pathIndices[i] == 0) {
hash.left <== computedPath[i];
hash.right <== pathElements[i];
} else {
hash.left <== pathElements[i];
hash.right <== computedPath[i];
}
computedPath[i + 1] <== hash.out;
}
root === computedPath[levels];
}
template Main() {
signal input leaf;
signal input root;
signal input pathElements[3];
signal input pathIndices[3];
component verifier = MerkleProof(3);
verifier.leaf <== leaf;
verifier.root <== root;
verifier.pathElements <== pathElements;
verifier.pathIndices <== pathIndices;
}
component main = Main();
5.4 Circom 最佳實踐
- 約束優化:避免不必要的約束,優先使用信號賦值
- 模板複用:將常見模式抽象為可重用模板
- 變量與信號:理解
<==和===的區別 - 調試技巧:使用
log()函數輸出中間值 - 庫函數:利用 circomlib 中的預定義組件
第六階段:Noir 電路開發實戰
6.1 Noir 語言特點
Noir 是 Aztecz 開發的領域特定語言,設計目標是:
- 編譯器無關
- 易於審計
- 高效的電路生成
與 Circom 的比較
| 特性 | Circom | Noir |
|---|---|---|
| 語法 | 自定義 DSL | Rust 風格 |
| 類型系統 | 動態 | 靜態強類型 |
| 後端 | 多後端 | 通用後端 |
| 調試 | 困難 | 較好支持 |
| 成熟度 | 成熟 | 新興 |
6.2 Noir 基本語法
6.2.1 函數定義
fn multiply(a: Field, b: Field) -> Field {
a * b
}
fn main(public_array: [Field; 3]) {
let x = public_array[0];
let y = public_array[1];
let result = multiply(x, y);
// 約束:結果必須在某個範圍內
assert(result < 1000);
}
6.2.2 結構體定義
struct ProofInputs {
secret: Field,
public_value: Field,
}
fn main(inputs: ProofInputs) {
// 使用結構體字段
let hash = std::hash::pedersen_hash([inputs.secret]);
assert(hash == inputs.public_value);
}
6.3 Noir 電路示例:承諾開放證明
// 承諾開放電路
// Prover 知道 (x, r) 使得 hash(x, r) = commitment
use dep::std;
// 2-to-1 Poseidon 哈希
fn hash2(a: Field, b: Field) -> Field {
std::hash::pedersen_hash([a, b])
}
fn main(
// 公開輸入
commitment: Field,
// 私有輸入
secret: Field,
randomness: Field
) {
// 驗證者計算承諾
let computed_commitment = hash2(secret, randomness);
// 約束:承諾匹配
assert(computed_commitment == commitment);
// 約束:secret 在允許範圍內(可選)
assert(secret != 0);
}
6.4 Noir 電路示例:範圍證明
use dep::std;
// 檢查 bit 是否為 0 或 1
fn check_bit(b: Field) {
assert((b == 0) | (b == 1));
}
// 將 Field 轉換為二進制
fn field_to_binary(x: Field, num_bits: u32) -> [Field] {
let mut bits = [0; 32];
let mut temp = x;
for i in 0..32 {
bits[i] = temp & 1;
check_bit(bits[i]);
temp = temp >> 1;
}
bits
}
// 範圍證明:證明 secret 在 [lower, upper] 範圍內
fn range_proof(
secret: Field,
lower: Field,
upper: Field,
witness_bits: [Field; 64]
) {
// 驗證 bits 是 secret 的二進制表示
let bits = field_to_binary(secret, 64);
for i in 0..64 {
assert(bits[i] == witness_bits[i]);
}
// 驗證 lower <= secret <= upper
assert(secret >= lower);
assert(secret <= upper);
}
fn main(
secret: Field,
lower: Field,
upper: Field,
witness_bits: [Field; 64]
) {
range_proof(secret, lower, upper, witness_bits);
}
6.5 編譯和部署
6.5.1 安裝 Noir 工具鏈
# 安裝 noirup
curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash
# 安裝 Noir
noirup
# 安裝 Nargo(Noir 編譯器)
noirup -v 0.18.0
6.5.2 編譯電路
# 初始化項目
nargo new my_circuit
cd my_circuit
# 編寫電路代碼
# 編輯 src/main.nr
# 編譯
nargo compile
# 生成 proof
nargo prove
6.5.3 生成驗證合約
# 生成 Solidity 驗證器
nargo codegen verifier
# 輸出在 contracts/plonk_vk.sol
第七階段:實際部署指南
7.1 zkRollup 部署流程
7.1.1 序列器/驗證器設置
// zkSync Era SDK 示例
const { Provider, Wallet, utils } = require('zksync-ethers');
const { Deployer } = require('@matterlabs/hardhat-zksync-deploy');
async function deployZKContract() {
const wallet = new Wallet(PRIVATE_KEY);
const deployer = new Deployer(hwl, wallet);
const artifact = await deployer.loadArtifact('YourVerifier');
const deployment = await deployer.deploy(artifact, []);
console.log('Verifier deployed at:', deployment.address);
}
7.1.2 批次提交
// 提交批次到 zkRollup
const zkProvider = new Provider('https://mainnet.era.zksync.io');
const wallet = new Wallet(PRIVATE_KEY, zkProvider);
// 模擬交易
const txs = await simulateTransactions();
// 生成 zkProof
const proof = await generateProof(txs);
// 提交批次
const batch = {
transactions: txs,
proof: proof,
timestamp: Date.now()
};
await submitBatch(batch);
7.2 隱私協議部署
7.2.1 匿名轉帳合約
// 簡化的隱私轉帳合約介面
interface IPrivacyPool {
function deposit(bytes32 commitment) external payable;
function withdraw(
bytes32 root,
bytes32 nullifierHash,
bytes32[1] calldata proof,
address payable recipient
) external;
}
7.2.2 承諾計算
// 計算存款承諾
function computeCommitment(note, salt) {
// note = secret
// salt = nullifier
const commitment = web3.utils.keccak256(
web3.utils.encodePacked(note, salt)
);
return commitment;
}
// 生成 Merkle 樹更新證明
async function generateMerkleProof(leaf, index) {
// 計算從葉子到根的路徑
const proof = await merkleTree.getProof(index);
return proof;
}
7.3 電路升級策略
7.3.1 版本控制
const circuitVersions = {
v1: {
circom: 'circuit_v1.circom',
ptau: 'pot12_final.ptau',
verificationKey: 'vk_v1.json',
circuitId: 'circuit_v1_001'
},
v2: {
circom: 'circuit_v2.circom',
ptau: 'pot12_final.ptau',
verificationKey: 'vk_v2.json',
circuitId: 'circuit_v2_001'
}
};
7.3.2 遷移策略
- 並行運行:新舊版本同時運行
- 漸進切換:逐步將流量遷移到新版本
- 回滾機制:新版本出現問題時快速回滾
第八階段:學習路徑總結與資源
8.1 推薦學習順序
- 數學基礎(1-2 週)
- 群論基礎
- 有限域運算
- 多項式代數
- 密碼學基礎(2-3 週)
- 橢圓曲線密碼學
- 配對函數
- 哈希函數
- 零知識理論(2-3 週)
- 互動式證明系統
- Fiat-Shamir 轉換
- Groth16/PLONK 原理
- Circom 開發(3-4 週)
- 基礎語法
- R1CS 約束
- 實戰項目
- Noir 開發(2-3 週)
- 語法特點
- 類型系統
- 實戰項目
- 實際部署(持續)
- zkRollup 架構
- 隱私協議
- 最佳實踐
8.2 推薦資源
8.2.1 學術論文
- Groth16: "On the Size of Pairing-based Non-interactive Arguments"
- PLONK: "Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge"
- Halo2: "Recursion Halo2"
8.2.2 開源專案
- circomlib: https://github.com/iden3/circomlib
- snarkjs: https://github.com/iden3/snarkjs
- Noir: https://github.com/noir-lang/noir
- Aztec Connect: https://github.com/AztecProtocol/aztec-connect
8.2.3 線上教程
- ZKProof Standards: https://zkproof.org/
- Zero-Knowledge MOOC: https://www.youtube.com/c/ZKHash
- StarkWare Blog: https://starkware.co/blog/
8.3 常見陷阱與解決方案
| 陷阱 | 描述 | 解決方案 |
|---|---|---|
| 信任設置泄露 | SRS 秘密被泄露 | 使用多方計算設置 |
| 電路不一致 | 編譯器版本不一致 | 固定編譯器版本 |
| 約束不足 | 某些計算未被約束 | 使用 === 而非 <== |
| 溢出 | Field 運算溢出 | 使用範圍約束 |
| 非確定性 | witness 導出不確定 | 使用確定的 witness 生成 |
結論
零知識證明的學習是一個漫長但回報豐厚的旅程。從抽象的數學理論到實際的電路開發,每一步都需要理論與實踐的緊密結合。本學習路徑提供了從基礎數學到 Circom/Noir 電路部署的完整框架,但真正的掌握還需要大量的實際練習。
隨著 zkRollup、隱私協議和去中心化身份等應用的快速發展,零知識證明技術的需求將持續增長。掌握這項技術不僅能夠幫助開發者構建更安全、更私密的區塊鏈應用,也能夠為密碼學研究做出貢獻。
參考文獻
- Groth, J. (2016). "On the Size of Pairing-based Non-interactive Arguments"
- Gabizon, A., Williamson, Z. C., & Ciobotaru, O. (2019). "PLONK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge"
3._boot\`, A. E., & Gabizon, A. (2019). "Halo: Recursive Proof Composition without a Trusted Setup"
- Kate, A., Zaverucha, G. M., & Goldberg, I. (2010). "Constant-Size Commitments to Polynomials and Their Applications"
- Buterin, V. (2022). "An approximate introduction to how zk-SNARKs are possible"
聲明:本網站內容僅供教育與資訊目的,不構成任何投資建議或推薦。在進行任何加密貨幣相關操作前,請自行研究並諮詢專業人士意見。所有投資均有風險,請謹慎評估您的風險承受能力。
相關文章
- ZK-SNARK 數學推導完整指南:從零知識證明到 Groth16、PLONK、STARK 系統的深度數學分析 — 本文從數學基礎出發,完整推導 Groth16、PLONK 與 STARK 三大主流 ZK 系統的底層原理,涵蓋橢圓曲線密碼學、配對函數、多項式承諾、LPC 證明系統等核心技術,同時提供 Circom 與 Noir 電路開發的實戰程式碼範例。截至 2026 年第一季度,ZK-SNARK 已被廣泛部署於 zkRollup、隱私協議、身份驗證系統等場景。
- ZK-SNARKs 數學推導完整指南:從零知識證明基礎到 Groth16 協議工程實踐 — 本文從工程師的視角出發,提供零知識證明數學基礎的完整推導。從密碼學安全假設出發,逐步建立零知識證明的理論框架,深入分析 zk-SNARKs 的核心協議——包括 Groth16、PLONK 與 Halo2 的設計原理與數學推導,並提供完整的程式碼範例說明如何在以太坊上實際部署零知識證明系統。
- 零知識證明數學推導完整指南:從密碼學基礎到以太坊應用實戰 — 本文從數學推導的角度,全面分析零知識證明的基本原理、主要類型(SNARK、STARK、Bulletproofs)、電路設計方法,以及在以太坊上的實際應用部署。涵蓋完整的代數推導、Groth16 和 Plonkish 約束系統、FRI 協議、以及 zkEVM 架構分析。詳細比較不同 ZK 系統的 Gas 消耗與 TPS 表現,提供量化數據支撐的事實依據。
- 以太坊隱私保護技術深度實作:零知識證明、環簽名與 TEE 的工程實踐 — 本文從工程師視角深入探討以太坊隱私保護的三大技術支柱:零知識證明、環簽名和可信執行環境。不僅討論理論原理,更重要的是提供可直接應用的程式碼範例和系統架構設計。涵蓋 Circom 電路設計、ZoKrates 實作、隱私交易合約設計、以及完整的隱私保護系統架構。
- 隱私合約開發實務:從密碼學原理到 Noir 程式設計完整指南 — 隱私是以太坊生態系統中最具挑戰性也最被低估的技術領域之一。本指南從密碼學原理出發,深入探討如何在以太坊上構建真正保護用戶隱私的智慧合約。我們將詳細分析各種隱私技術的優缺點,並提供基於 Noir 語言的完整實作範例,幫助開發者從理論到實踐全面掌握隱私合約開發技術。
延伸閱讀與來源
- zkSNARKs 論文 Gro16 ZK-SNARK 論文
- ZK-STARKs 論文 STARK 論文,透明化零知識證明
- Aztec Network ZK Rollup 隱私協議
- Railgun System 跨鏈隱私協議
這篇文章對您有幫助嗎?
請告訴我們如何改進:
評論
發表評論
注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。
目前尚無評論,成為第一個發表評論的人吧!