systemslibrarian/crypto-lab-snark-arena

GitHub: systemslibrarian/crypto-lab-snark-arena

一个基于浏览器的 zk-SNARK(Groth16 vs PLONK)交互式教学演示项目,通过真实证明生成、trusted setup 仪式可视化和有限域算术帮助用户理解零知识证明的核心原理与工程选型。

Stars: 0 | Forks: 0

# crypto-lab-snark-arena ## 1. 它是什么 SNARK Arena 展示了两种部署最广泛的 zk-SNARK 证明系统:Groth16(Groth,EUROCRYPT 2016)和 PLONK(Gabizon 等人,2019)。两者都是简洁的非交互式知识论证:它们在不泄露 witness 的情况下,证明其掌握了满足某个 circuit 的秘密 witness,且生成的证明足够小,可以在几毫秒内完成验证。Groth16 通过针对每个 circuit 的 trusted setup 生成 128 字节的证明。PLONK 通过可跨 circuit 复用的 universal trusted setup 生成约 400 字节的证明。两者都依赖于基于配对的假设,且不具备 post-quantum 安全性。 ## 2. 何时使用 - ✅ Groth16:需要极小证明尺寸和最快验证速度的固定 circuit,例如证明字节数至关重要的 Zcash 和 Semaphore 风格的部署。 - ✅ PLONK:不断演进的 circuit,或者避免为每个 circuit 举行新仪式很重要的场景,例如 Aztec 和 Polygon zkEVM 风格的工作流。 - ✅ Halo2(PLONK 变体):当需要递归证明组合或不需要 trusted setup 时。 - ❌ Groth16 和 PLONK 都不具备 post-quantum 安全性;如果目标是长期的抗量子能力,请使用 STARK 系统。 - ❌ 在需要 setup 的情况下,如果没有经过多方 trusted setup 仪式,请勿部署;单方 setup 等同于没有 setup 的信任模型。 ## 3. 在线演示 链接:https://systemslibrarian.github.io/crypto-lab-snark-arena/ 包含六个展示、一个词汇表和一个自测问答,并配有固定的目录,以及每个展示的学习目标和关键要点: 1. **zk-SNARK 是什么** — 外加一个 **交互式 R1CS circuit 演练场**:拖动秘密 `x`,观察针对 `x³ + x + 5 = 35` 的 witness 向量和三个约束 `(A·s)(B·s) = (C·s)` 如何在真实的域上实时重新计算,并尝试作弊,看看乘法门是如何捕捉到伪造的连线 的。 - **★ 真实证明(特色)** — 一个完全在你的浏览器中使用 snarkjs 针对同一 circuit 生成和验证的**真实 Groth16 证明**。生成它,验证它 (`true`),然后篡改公共输出,观察配对检查如何拒绝它 (`false`)。没有服务器,没有模拟。 2. **Groth16** 及其针对每个 circuit 的 trusted setup 和仪式可视化工具。 3. **PLONK** 及其 universal SRS 和 circuit 灵活性。 4. 在同一 circuit 上的**正面交锋**比较,附带决策树。 5. **深入探讨 trusted-setup 问题** — 一个**实时 powers-of-tau 仪式**,将组合后的秘密 `τ = τ₁·τ₂·…·τₙ` 显示为连乘结果(可以切换谁删除了他们的 toxic waste),以及一个**实时 KZG 伪造演示**,证明诚意的 prover 无法打开对谎言的承诺,但保留 `τ` 的攻击者却可以。 6. 在 Zcash、Polygon zkEVM、WorldID/Semaphore 和 zkLogin 中的**生产级部署**。 ### 真实的数学,而非模型演示 交互面板在浏览器中运行真实的有限域算术(`src/crypto/`):R1CS witness 检查、模逆/模幂、多项式除法、powers-of-tau SRS 以及 KZG 承诺/打开/验证。这些数字使用一个玩具大小的域(`F₁₇`,编码为 mod 103 的群阶 17),因此每个值都足够小,可以手动验证;真实的系统在 254 位曲线上使用相同的构造。密码学核心没有 UI 依赖,可以进行隔离的单元测试。 **真实证明**面板更进一步,运行*生产级*技术栈 —— 即在 circom 编译的 circuit 和真实的 trusted setup proving key 上运行 `snarkjs.groth16.fullProve` / `verify` —— 完全在客户端执行。展示 02–04 中的 Groth16/PLONK 证明大小和时间数据仍然是说明性的(标记为“模拟”),并遵循 snarkjs 的基准测试惯例。 ### 在 GitHub Pages 上的真实 SNARKs 真实的 SNARK 不需要服务器:证明和验证是纯客户端计算。Circuit artifacts 在构建时生成一次,并作为静态文件发布在 `public/zk/` 中(witness 生成器 WASM、proving key、verification key),snarkjs 则打包在 `public/vendor/` 中。唯一的实际限制是 GitHub Pages 无法发送多线程 WASM 所需的 COOP/COEP 标头,因此证明只能单线程运行 —— 这对于中小型 circuit 来说没问题;大型 circuit(数百 MB 的 proving keys)会达到 100 MB 的单文件限制。 要重新生成 artifacts(需要 [circom](https://github.com/iden3/circom) 编译器): ``` circom public/zk/cubic.circom --r1cs --wasm -p bn128 -o build npx snarkjs powersoftau new bn128 8 pot.ptau npx snarkjs powersoftau contribute pot.ptau pot1.ptau -e="random" npx snarkjs powersoftau prepare phase2 pot1.ptau potf.ptau npx snarkjs groth16 setup build/cubic.r1cs potf.ptau zk0.zkey npx snarkjs zkey contribute zk0.zkey public/zk/cubic_final.zkey -e="random2" npx snarkjs zkey export verificationkey public/zk/cubic_final.zkey public/zk/verification_key.json # 复制 build/cubic_js/cubic.wasm -> public/zk/cubic.wasm ``` ## 4. 如何在本地运行 ``` git clone https://github.com/systemslibrarian/crypto-lab-snark-arena cd crypto-lab-snark-arena npm install npm run dev ``` ## 5. Crypto-Lab 套件的一部分 [crypto-lab](https://systemslibrarian.github.io/crypto-lab/) 的一部分 —— 基于浏览器的密码学演示,涵盖了从 2500 年的密码学历史到 NIST FIPS 2024 post-quantum 标准。 所以,你们或吃或喝,或做任何事,都要为神的荣耀而做。—— 哥林多前书 10:31
标签:Web3, 前端可视化, 区块链, 密码学, 手动系统调用, 教学演示, 数据可视化, 暗色界面, 自动化攻击, 零知识证明