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

news2024/9/21 0:49:11

1 Protocol description

协议描述有以下功能:

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

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

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

1.1 Setup(技术设置)

1.  \mathbb{B}= \left \{ 0,1 \right \}       

\mathbb{B}为在snark证明中使用的配对操作,它定义在素数阶 Q的群上。\mathbb{B}= \left \{ 0,1 \right \}为二进制组合0,1。

2._{}H_{1}:\mathbb{B}^{^{*}}\rightarrow \mathbb{Z}_{p}        

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

3.H_{2}:\left \{ \mathbb{Z}_{p},\mathbb{Z}_{p} \right \}\rightarrow \mathbb{Z}_{p}        

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

4.\tau

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

5.O\left ( \tau , l \right )

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

6.k,s\in \mathbb{B}^{256},A

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

7.零知识证明的目标:

S\left [ R,h,A \right ] 使用一组姐妹节点值集R,以及零知识证明k的pederden哈希h,所以h = H_{1}\left ( k \right ),外加接收者地址A

S\left [ R,h,A \right ] = \left \{ \textrm{I KNOW} k,s \in \mathbb{B}^{256}, O\in Z_{16}^{p}, \textrm{SUCH THAT} \ h = H_{1} ( k ) \textrm{AND O is the opening of } H_{1}(k || s) \ \textrm{at position } l \ \textrm{to} R\right \} 零知识证明试图证明:已知一个零知识证明和一个秘密都是256位,C=H_{1}\left ( k || s \right )被称为承诺commitment,因此零知识证明试图构建这个承诺。接收者地址包含在零知识证明中是为了防止抢跑。

8.D = (d_{p}, d_{v}) 

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

9.P

 \textrm{Prove}(d_{p},R,k,l,A)\rightarrow P是构造的最后的证明。其中你需要证明:d_{p},R,k,l,A。你将使用d_{p}提交证明给验证器(验证器是之前使用solidity部署在链上的),证明器将验证你的证明。

10. \mathfrak{C}是智能合约,具有以下功能:

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

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

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

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

1.2 Deposit

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

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

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

1.3 Withdrawal

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

1.选择接收的地址A

2.在合约中存储的根中选择一个根R^{*},计算以R^{*}结尾的开口0(l)s

3.计算零知识证明的pedersen哈希h=H_{1}(k),nullifier hash。

4.通过在d_{p}(密钥)上调用Prove来计算证明P

5.采用下列方式进行取款:
发送一个以太坊交易到合同\mathfrak{C},在交易数据中提供R^{*}(根植),h(零知识证明哈希),A(接收者地址),P(证明)。

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

2 Implementation

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

3 Security claims

Tornado声称具有以下安全特性:
1.只有存入合约的代币才能提取;
2.任何代币不得提取两次;
3.任何代币如果参数\left ( k,s \right )是已知的,则可以提取一次,除非已存放并提取了具有相同k的代币;
4.如果ks未知,则无法提取代币。如果攻击者不知道k,则无法阻止知道\left ( k,s \right )的人提取代币(这包括所有抢先交易的情况) 。

4 Planning

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

4.1 前端

前端使用JavaScript

1.存款人存款时需要提供一个256位的k和秘密s(k,s \in \mathbb{B}^{256})

2.计算ks的承诺哈希CC = H_{1}\left ( k || s \right )

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

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

4.2 后端

后端使用solidity

1.提款人提款时需要构建证明。构建证明需要k值、秘密s、存款时生成的新根植R^{*}、姐妹节点值集R以及接收者地址A\left ( k,s,R^{*},R,A \right )

2.计算证明PP=\left ( d_{p},k,s,R^{*},R,A \right )

3.计算k值的pedersen哈希。h=H_{1}(k)

4.提款函数需要:证明P、存款时生成的新根植R^{*}k值的哈希h以及接收者地址A

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ncnn之yolov5(7.0版本)目标检测pnnx部署

一、pnxx介绍与使用 pnnx安装与使用参考: https://github.com/pnnx/pnnxhttps://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnxhttps://github.com/Tencent/ncnn/tree/master/tools/pnnx 支持python的首选pip,否则就源码编译。 pip3 …

Webpack打包常见问题及优化策略

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介Webpack打包常见问题及优化策略1. 引言2. Webpack打包常见问题2.1 打包时间过长问题描述主要原因 2.2 打包体积过大问题描述主要原因 2.3 依赖包版本冲突问题描述主要原因 2.4 动态导入和代码拆分问题问题描述主要原因 2.5 文件路径…

C++系列-继承方式

继承方式 继承的语法继承方式:继承方式的特点继承方式的举例 继承可以减少重复的代码。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。基类父类,派生类子类,派生类是在继承了基类的部分成员基础…

编程效率进阶:打造你专属的 Git 别名与 PyCharm 完美结合

在日常开发中,Git 是我们不可或缺的工具。掌握常用 Git 命令可以帮助我们更高效地进行版本控制,但随着命令的复杂性增加,记住所有命令变得困难。这时,Git 别名的设置就显得尤为重要。此外,许多开发者使用 PyCharm 作为…

【Android自定义控件】Kotlin实现滚动效果的数字加减控件

前言 因业务上的需要,在APP中点餐时要有商品数目增减操作,数目增减的过程中有翻动的动画效果展现。在Android中有多种方式可以实现,本篇文章记录通过自定义View结合控件的平移动画相结合来实现此需求。 需求分析 根据上图分析控件的实现过程以…

Pillow:一个强大的图像处理Python库

我是东哥,一个热衷于探索Python世界的自媒体人。今天,我要向大家介绍一个在Python图像处理领域中不可或缺的库——Pillow。如果你对图像处理感兴趣,或者正在寻找一个简单易用的库来处理图片,那么Pillow绝对是你的不二之选。 基本…

【前端】代码Git提交规范之限制非规范化提交信息

需求背景 在我们目前的前端项目中,我们采用 git 作为版本控制工具。使用 git 管理项目意味着我们经常需要提交代码。当我们执行 git commit -m "描述信息" 命令时,我们被要求提供一个描述信息。现在使用约定式规范提交,和Commitiz…

用纯 div 实现一个选中和未选中状态

在现代网页设计中&#xff0c;利用 div 元素自定义样式&#xff0c;可以让界面更具有吸引力。通过一些简单的 CSS 样式和布局技巧&#xff0c;可以轻松实现交互自然的选中和未选中效果&#xff0c;而不需要依赖传统的 input 元素。 举个 &#x1f330; HTML <body><…

金融POS三层密钥体系 银行卡网络安全系统

银行卡网络安全系统的三层密钥体系 银行卡网络安全系统的三层密钥体系为金融POS系统提供了高度安全的密钥管理。这个体系从上到下分为三层&#xff1a;系统密钥、主密钥、和工作密钥。每一层密钥都负责保护下一层密钥的安全性&#xff0c;确保系统整体的安全性。 三层密钥体系…

[图解]强化自测题解析-总纲(一)01 这属于什么工作流

1 00:00:00,680 --> 00:00:05,350 今天我们开始来解析一些强化自测题 1 00:00:01,100 --> 00:00:03,980 因为现在强化自测题本身 2 00:00:05,010 --> 00:00:06,720 我们出得已经比较多了 3 00:00:07,700 --> 00:00:12,570 自测题是用来测试我们的开发人员 4 00…

华为OD机试真题 - 字符串排序(Python/JS/C/C++ 2024 D卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、…

QT教程-十六,QT中如何解析JSON

一&#xff0c;对json的初步认识 &#xff08;这里我们主要说明最常用的&#xff0c;以一个宏观的概念来说一下&#xff09;&#xff0c;json是一种数据格式&#xff0c;作用就是便于传递信息&#xff0c;我们可以按其结构和对应关系&#xff0c;拿到我们想要的数据。其主要结构…

【专题】2024全球电商消费电子市场研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37552 在如今数字经济蓬勃发展的大环境下&#xff0c;电商行业正以前所未有的迅猛之势&#xff0c;对全球商业版图进行着深刻的重塑。据 Stocklytics 发布的有关全球电商市场价值及未来增长趋势的专项调查报告显示&#xff0c;2024…

团队比赛时如何给小组记分?

在团队比赛中&#xff0c;确保每个小组的成绩和排名准确无误是组织者的重要任务。云分组小程序提供了一个便捷的“项目记分”功能&#xff0c;帮助您轻松管理比赛记分过程。以下是如何使用该功能进行团队比赛记分的详细步骤。一、准备工作 1. 打开云分组小程序。 2. 点击“我的…

SQLi-LABS靶场51-55通过攻略

less-51 1.判断注入点 ?sort1 加上单引号会引起报错 2.判断闭合方式 ?sort1-- 可以闭合成功 3.查询数据库名 使用报错注入查询 ?sort1 and updatexml(1,concat(1,database()),1)-- 4.查询数据库的所有表 ?sort1 and updatexml(1,concat(1,(select group_concat(tab…

中锂天源:卡车锂电池的领跑者

随着新能源产业的飞速发展&#xff0c;卡车锂电池市场也呈现出旺盛的生命力。在我国锂电池产业中&#xff0c;中锂天源作为一家专注于新能源锂电池研发与制造的企业&#xff0c;成为了卡车锂电池领域的佼佼者。 中锂天源卡车锂电池采用先进的锂电池技术&#xff0c;具有安全性…

Linux:网络编程之TCP/IP模型,UDP协议

一、OSI模型七层结构 OSI&#xff08;Open Systems Interconnection&#xff09;模型&#xff0c;即开放系统互连参考模型&#xff0c;是一个概念性框架&#xff0c;用于促进全球通信。它定义了网络通信的七层结构&#xff0c;每一层都执行特定的功能&#xff0c;并且每一层都使…

25考研人数预计下降?这一届考研有哪些新趋势?

2025年考研时间线&#xff1a; 2024年9月&#xff1a;公共课及各院校考试大纲公布&#xff1b; 2024年9月下旬&#xff1a;预报名&#xff1b; 2024年10月&#xff1a;正式报名&#xff1b; 2024年11月&#xff1a;线上/线下确认&#xff1b; 2024年12月中下旬&#xff1a…

腾讯版GPT-4o平替方案:VITA

引言 庙内无僧风扫地&#xff0c;寺中少灯月照明。 小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;买黑神话的小男孩&#xff0c;紧接卖黑神话的小女孩的小作文&#xff0c;今天这篇小作文主要介绍腾讯开源(截至2024年8月25日尚未真正开源&…

【软考】数字签名

目录 1. 说明2. 过程2.1 数字签名过程2.2 数字加密过程 3. 公开密钥4. 报文加密5. 例题5.1 例题1 1. 说明 1.书信或文件是根据亲笔签名或印章来证明其真实性。2.在计算机网络中传送的文电用数字签名来解决问题。3.数字签名必须保证三点&#xff1a;接收者能够核实发送者对报文…