【零知识证明】通读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.后端将证明提供给验证器合约,查看是否有效。若有效,将把零知识证明哈希添加到已花费的零知识证明哈希中,然后合约将以太发送回来。

相关推荐
friklogff27 分钟前
【C#生态园】提升C#开发效率:深入了解自然语言处理库与工具
开发语言·c#·区块链
SunsPlanter11 小时前
02 ETH
区块链
yunteng52118 小时前
零知识证明-ZK-SNARKs基础(七)
区块链·零知识证明·zk-snarks·ricp·qap
山师第一深情20 小时前
solidity-19-fallback
区块链
zhuqiyua20 小时前
TVM和EVM的比较
区块链·智能合约·ton
sino_sound20 小时前
伦敦金的交易差价意味着什么?
人工智能·金融·区块链
计算机学姐1 天前
基于python+django+vue的医院预约挂号系统
开发语言·vue.js·后端·python·mysql·django·tornado
黑色叉腰丶大魔王1 天前
什么是区块链,以及应用场景
去中心化·区块链·分布式账本
qiquandong1 天前
场外期权或成暴利工具?!应该怎么做场外期权?
区块链
链科天下1 天前
全球国家比特币持有量排名!各国政府合谋能否推翻比特币?数字货币的时代已经来临!
区块链