零知識電路開發完整教學:從理論基礎到智能合約整合的開發者路徑

本文提供從電路設計基礎到實際智能合約整合的完整開發者路徑。涵蓋:零知識證明的形式化定義與代數電路視角、Circom 開發環境架設與工具鏈配置、常見電路設計模式(比較器、範圍證明、Merkle 樹驗證)、複雜電路設計原則與調試技巧、從電路到 Solidity 驗證合約的完整工作流、信任設置(Powers of Tau)詳解、以及 NOIR 和 Halo2 等新一代工具的入門介紹。提供完整的代碼範例和開發實踐指導。

ZK 電路開發完整教程

手把手帶你寫第一個電路!

環境準備

# 安裝 circom
cargo install --git https://github.com/iden3/circom.git

# 安裝 snarkjs
npm install -g snarkjs

# 創建項目
mkdir zk-learning && cd zk-learning
npm init -y

寫第一個電路

目標:證明你知道 a 和 b 使得 a × b = out

新建 multiplier.circom

pragma circom 2.1.6;

template Multiplier() {
    signal input a;
    signal input b;
    signal output out;
    
    // 約束:out = a * b
    out <== a * b;
    
    // 附加約束:a 和 b 必須是 0-9
    a * (a - 1) === 0;
    b * (b - 1) === 0;
}

component main = Multiplier();

編譯電路

circom multiplier.circom --r1cs --wasm --sym -o ./build

生成:

信任設置(Groth16)

# 下載 powers of tau
snarkjs powersoftau new bn128 12 pot12_0000.ptau -v

# 貢獻 entropy
snarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau -e="my entropy"

# 電路特定設置
snarkjs groth16 setup multiplier.r1cs pot12_0001.ptau multiplier_0000.zkey

# 貢獻
snarkjs groth16 contribute multiplier_0000.zkey multiplier_final.zkey -e="final"

生成證明

const { proof, publicSignals } = await snarkjs.groth16.fullProve(
    { a: "3", b: "4" },
    "multiplier_js/multiplier.wasm",
    "multiplier_final.zkey"
);

驗證證明

const vKey = await snarkjs.zKeyVerificationKeyFromUri("multiplier_final.zkey");
const res = await snarkjs.groth16.verify(vKey, ["12"], proof);
console.log(res); // true

常見錯誤

錯誤原因解決
Constraint not satisfied約束不成立檢查輸入
Signal not defined變量未聲明檢查語法
Invalid input輸入格式錯誤轉字符串

結語

搞定了乘法電路,可以試試更複雜的:Merkle 樹驗證、範圍證明、DeFi 交互等。

COMMIT: Add ZK circuit development complete tutorial

延伸閱讀與來源

這篇文章對您有幫助嗎?

評論

發表評論

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

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