在 TON 上构建一个简单的 ZK 项目
👋 介绍
零知识(ZK)证明是一种基本的密码学原语,它允许一方(证明者)向另一方(验证者)证明一个陈述是真实的,而不泄露除了该陈述本身的有效性之外的任何信息。零知识证明是构建隐私保护系统的强大工具,已在多种应用中使用,包括匿名支付、匿名消息系统和无信任桥接。
在 2023 年 6 月之前,不能在 TON 上验证加密证明。由于配对算法背后复杂计算的普遍性,有必要通过添加 TVM 操作码来增加 TVM 的功能以执行证明验证。该功能已在 2023 年 6 月更新中添加,截至本文撰写时仅在测试网上可用。
🦄 本教程将覆盖
- 零知识密码学的基础知识,特别是 zk-SNARKs(零知识简洁非互动式知识论证)
- 启动受信任设置仪式(使用 Tau 力量)
- 编写和编译一个简单的 ZK 电路(使用 Circom 语言)
- 生成、部署和测试一个 FunC 合约来验证样本 ZK 证明
🟥🟦 以颜色为重点的 ZK 证明解释
在我们深入了解零知识之前,让我们从一个简单的问题开始。假设你想向一个色盲人证明,可以区分不同颜色是可能的。我们将使用一种互动解决方案来解决这个问题。假设色盲人(验证者)找到两张相同的纸,一张为红色 🟥 一张为蓝色 🟦。
验证者向你(证明者)展示其中一张纸并要求你记住颜色。然后验证者将那张特定的纸放在背后,保持不变或更换它,并询问你颜色是否有变化。如果你能够分辨出颜色的区别,那么你可以看到颜色(或者你只是幸运地猜对了正确的颜色)。
现在,如果验证者完成这个过程 10 次,而你每次都能分辨出颜色的区别,那么验证者对正确颜色的使用有 ~99.90234% 的把握(1 - (1/2)^10)。因此,如果验证者完成这个过程 30 次,那么验证者将有 99.99999990686774% 的把握(1 - (1/2)^30)。
尽管如此,这是一个互动式解决方案,让 DApp 要求用户发送 30 笔交易来证明特定数据是不高效的。因此,需要一个非互动式解决方案;这就是 Zk-SNARKs 和 Zk-STARKs 的用武之地。
出于本教程的目的,我们只会涵盖 Zk-SNARKs。然而,你可以在 StarkWare 网站 上阅读更多关于 Zk-STARKs 如何工作的信息,而关于 Zk-SNARKs 和 Zk-STARKs 之间差异的信息可以在这篇 Panther Protocol 博客文章 上找到。
🎯 Zk-SNARK: 零知识简洁非互动式知识论证
Zk-SNARK 是一个非互动式证明系统,其中证明者可以向验证者展示一个证明,以证明一个陈述是真实的。同时,验证者能够在非常短的时间内验证证明。通常,处理 Zk-SNARK 包括三个主要阶段:
- 使用 多方计算(MPC) 协议进行受信任设置,以生成证明和验证密钥(使用 Tau 力量)
- 使用证明者密钥、公开输入和私密输入(见证)生成证明
- 验证证明
让我们设置我们的开发环境并开始编码!
⚙ 开发环境设置
我们开始这个过程的步骤如下:
- 使用 Blueprint 创建一个名为 "simple-zk" 的新项目,执行以下命令后,输入你的合约名称(例如 ZkSimple),然后选择第一个选项(使用一个空合约)。
npm create ton@latest simple-zk
- 接下来我们会克 隆被调整以支持 FunC 合约的 snarkjs 库
git clone https://github.com/kroist/snarkjs.git
cd snarkjs
npm ci
cd ../simple-zk