ZK-Rollup 電路設計數學推導完整指南:以太坊密碼學基礎與實際電路實例

本文從數學和密碼學角度深入分析 ZK-Rollup 的電路設計原理,涵蓋離散對數假設、橢圓曲線群、配對友好曲線、KZG 承諾、R1CS 約束系統、PLONK 電路設計等核心主題。所有結論都附帶詳細的數學推導過程和證明。

ZK-Rollup 電路設計數學推導

說到 ZK-Rollup 的電路設計,很多人直接就暈了。但其實核心思想很簡單:把計算問題轉成數學方程式,然後用零知識證明來驗證

密碼學安全性假設

離散對數假設(DLP)

一切安全的基礎。

給定 g 和 g^x,求 x 在計算上不可行

這是橢圓曲線密碼學的基礎。以太坊常用的是 BN128 曲線:

橢圓曲線配對

ZK-SNARK 驗證的核心工具。

e(aG, bH) = e(G, H)^(ab)

配對讓我們可以用很少的計算驗證很複雜的關係。

電路約束系統

R1CS 約束

最常見的約束格式:⟨A·s⟩ · ⟨B·s⟩ = ⟨C·s⟩

拿個簡單例子:

計算 z = (a + b) × c

約束:
- sum = a + b
- z = sum × c

PLONK 約束

PLONK 的約束格式:

Q_L·a + Q_R·b + Q_O·c + Q_M·a·b + Q_C = 0

好處是一次設置可以用於任何電路(只要不超過上限)。

承諾方案

KZG 承諾

以太坊 zkEVM 常用的承諾方案。

Commit(f) = f(τ)·G

承諾多項式 f(x),之後可以驗證在任意點的取值。

多項式開啟

要證明 f(z) = y:

1. 計算商 q(x) = (f(x) - y) / (x - z)
2. 承諾 q(x)
3. 驗證:e(C - y·G, H) = e(π, τ·H - z·H)

實際電路設計

Merkle 樹驗證

template MerkleTree(levels) {
    signal input leaf;
    signal input root;
    signal input pathElements[levels];
    signal input pathIndices[levels];
    
    signal hash[levels + 1];
    hash[0] <== leaf;
    
    for (var i = 0; i < levels; i++) {
        // 根據路徑索引選擇左右順序
        // 計算父節點哈希
        hash[i + 1] <== poseidon(hash[i], pathElements[i]);
    }
    
    root === hash[levels];
}

範圍證明

確保數值在合理範圍內,防止負數。

template RangeProof(n) {
    signal input value;
    signal output bits[n];
    
    var lc = 0;
    for (var i = 0; i < n; i++) {
        bits[i] <-- value % 2;
        bits[i] * (1 - bits[i]) === 0;  // 約束:只能是 0 或 1
        lc += bits[i] * (2 ** i);
    }
    lc === value;
}

結語

電路設計的核心就是把計算拆成最基本的數學運算,然後用約束描述這些運算的關係。搞懂這個,ZK-Rollup 的原理就理解一半了。

COMMIT: Add ZK-Rollup circuit design mathematical derivation guide

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

注意:由於這是靜態網站,您的評論將儲存在本地瀏覽器中,不會公開顯示。

目前尚無評論,成為第一個發表評論的人吧!