【零知识证明】通读Tornado Cash白皮书(并演示)

1 Protocol description

协议描述有以下功能:

1.insert:向智能合约中存入资金,通过固定金额的单笔交易完成,金额由N表示(演示时用1 ETH)

2.remove:从智能合约中提取资金,交易由收款人发起,收款人应该有足够的以太币支付gas费,在这种情况下费用为0(无中继者)

在演示案例中,将实现存款功能和提款功能,无论谁调用提款函数都将是收款人

1.1 Setup(技术设置)

为在snark证明中使用的配对操作,它定义在素数阶 Q的群上。为二进制组合0,1。

2.

H1是pederden哈希函数,意味着一系列位,所以是一系列0和1。让这些哈希到素域中的一个整数是pedersen哈希函数。(将一堆位哈希到一个整数)

3.

作用是将两个叶子节点值哈希在一起,因此将一整组哈希到单一的整数,也就是之前实现的MiMC哈希函数。定义为海绵操作模式中Feistel模式下的MiMC置换。

4.

为高度20的merkle树(演示时将高度设置为10),其中,非叶子节点使用哈希两个叶子节点,该merkle树的叶子节点初始值为一个默认值,这些默认值会逐渐被来自的其他值替换。(因为当你存款时,树内节点的哈希值会变,并且被新的值填充)

5.

是索引为的叶子节点的merkle开口,为从叶子节点到根节点路径上的姐妹节点值集合。(当你想要从某叶子节点构建路径到根节点时,你需要这条路径上的姐妹节点的值,来一起哈希,才能得到最终的根哈希值,因此为值集,包含了所有姐妹节点的值。)

6.,

为一串位序列。为秘密值,这是你用你的零知识证明和你的存款一起构建承诺哈希提交给torcash的东西。为代币接收者的以太坊地址,也就是接收者地址。

7.零知识证明的目标:

使用一组姐妹节点值集,以及零知识证明的pederden哈希,所以,外加接收者地址

零知识证明试图证明:已知一个零知识证明和一个秘密都是256位,被称为承诺commitment,因此零知识证明试图构建这个承诺。接收者地址包含在零知识证明中是为了防止抢跑。

8.

D是一组密钥,是证明密钥,是验证密钥。是groth16中生成的zkey,包含在由groth16过程生成的验证器合约中。

9.

是构造的最后的证明。其中你需要证明:。你将使用提交证明给验证器(验证器是之前使用solidity部署在链上的),证明器将验证你的证明。

  1. 是智能合约,具有以下功能:

--1.存储最后的个历史根植在字典中。对于最新的Merkel树,合约还存储从最后一个添加的叶到根的路径上节点的值,这些值是计算下一个根所必需的。(一旦构建新的哈希路径,将保存每一层的哈希值给合约,当未来某一时刻存款人想用自己的存款检索姐妹节点哈希值时,可以只要求智能合约从内存中给出)

--2.它接受用数据为1ETH 进行的支付,其中是承诺。将值添加到 Merkle 树中,(注意:此承诺添加到叶子节点)。重新计算从最后添加的值到最新根的路径,并将上一个根值添加到历史数组中。

--3.针对所提供的证明,验证提交公共值。如果验证成功,合约会向地址发送1ETH.

--4.验证代币之前是否被提取,通过检查证明中的零知识证明哈希以前是否出现过。如果该零知识证明哈希以前从未出现过,则将其添加到零知识证明哈希列表中。这意味着,每次提交有效证明并提取以太时,零知识证明的哈希都将被存储,并且不能再次花费,因此只能花费一次。

1.2 Deposit

要存入一枚代币,用户需按照如下方式进行:

1.生成两个随机数零知识证明k和密码s,是256位的数,并使用pederden哈希计算承诺(可以简单的理解为将这两个序列切割在一起后给pedersen)

2.发送一以太和数据(也就是承诺)的交易给合约,如果Merkel树没有满,合约将接受交易并将承诺添加到树中作为一个新的非零叶子节点。(演示时设定树的高度为10,则叶子节点就有2^9个叶子节点)

1.3 Withdrawal

要从树中位置为的地方提取一枚代币,用户需要按照如下方式进行:

1.选择接收的地址

2.在合约中存储的根中选择一个根,计算以结尾的开口

3.计算零知识证明的pedersen哈希,nullifier hash。

4.通过在(密钥)上调用Prove来计算证明

5.采用下列方式进行取款:

发送一个以太坊交易到合同,在交易数据中提供(根植),(零知识证明哈希),(接收者地址),(证明)。

该合约验证证明P和零知识证明哈希的唯一性,在成功的情况下,它发送给,并把添加到无效哈希列表中(已花费零知识证明哈希列表)。

2 Implementation

链下使用的加密函数在cricom库中实现。Merkel树、存款和取款逻辑以及MiMC由Solidity 实现。SNARK 密钥对和 Solidity 验证器代码使用 SnarkJs 生成。

3 Security claims

Tornado声称具有以下安全特性:

1.只有存入合约的代币才能提取;

2.任何代币不得提取两次;

3.任何代币如果参数是已知的,则可以提取一次,除非已存放并提取了具有相同k的代币;

4.如果未知,则无法提取代币。如果攻击者不知道,则无法阻止知道的人提取代币(这包括所有抢先交易的情况) 。

4 Planning

整体分为前端和后端两部分,前端使用JavaScript,后端使用solidity。

4.1 前端

前端使用JavaScript

1.存款人存款时需要提供一个256位的和秘密

2.计算的承诺哈希

3.调用存款函数,携带1ETH和承诺哈希。合约将承诺添加到Merkel树的叶子节点,并根据合约提供的重新计算根节点。

4.新计算的根节点和姐妹节点值集将会作为一个事件发出,存款人可以这些将信息提供给取款人,以构建证明。

4.2 后端

后端使用solidity

1.提款人提款时需要构建证明。构建证明需要值、秘密、存款时生成的新根植、姐妹节点值集以及接收者地址

2.计算证明

3.计算值的pedersen哈希。

4.提款函数需要:证明、存款时生成的新根植值的哈希以及接收者地址

5.后端将证明提供给验证器合约,查看是否有效。若有效,将把零知识证明哈希添加到已花费的零知识证明哈希中,然后合约将以太发送回来。

相关推荐
yunteng5217 小时前
solidity之Foundry安装配置(一)
web3·区块链·solidity·foundry
qiquandongkh11 小时前
2025年股指期货和股指期权合约交割的通知!
大数据·金融·区块链
yoona10201 天前
Rust编程语言入门教程 (七)函数与控制流
开发语言·rust·区块链·学习方法
MetaverseMan2 天前
从sumsub获取用户图片
区块链
电报号dapp1193 天前
区块链虚拟币资产去中心化私钥钱包开发
人工智能·去中心化·区块链·智能合约
漠缠4 天前
股票与比特币投资困境分析及解决方案
人工智能·区块链
AC使者4 天前
解释区块链技术的应用场景和优势。
区块链
YSGZJJ4 天前
怎么查股指期货持仓量?
区块链
yoona10204 天前
Rust编程语言入门教程(三) Hello Cargo
开发语言·后端·rust·区块链·学习方法