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

2024-09-01 17:20

本文主要是介绍【零知识证明】通读Tornado Cash白皮书(并演示),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于【零知识证明】通读Tornado Cash白皮书(并演示)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127570

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

研究人员在RSA大会上演示利用恶意JPEG图片入侵企业内网

安全研究人员Marcus Murray在正在旧金山举行的RSA大会上公布了一种利用恶意JPEG图片入侵企业网络内部Windows服务器的新方法。  攻击流程及漏洞分析 最近,安全专家兼渗透测试员Marcus Murray发现了一种利用恶意JPEG图片来攻击Windows服务器的新方法,利用该方法还可以在目标网络中进行特权提升。几天前,在旧金山举行的RSA大会上,该Marcus现场展示了攻击流程,

【Python知识宝库】上下文管理器与with语句:资源管理的优雅方式

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、什么是上下文管理器?二、上下文管理器的实现三、使用内置上下文管理器四、使用`contextlib`模块五、总结 前言 在Python编程中,资源管理是一个重要的主题,尤其是在处理文件、网络连接和数据库

dr 航迹推算 知识介绍

DR(Dead Reckoning)航迹推算是一种在航海、航空、车辆导航等领域中广泛使用的技术,用于估算物体的位置。DR航迹推算主要通过已知的初始位置和运动参数(如速度、方向)来预测物体的当前位置。以下是 DR 航迹推算的详细知识介绍: 1. 基本概念 Dead Reckoning(DR): 定义:通过利用已知的当前位置、速度、方向和时间间隔,计算物体在下一时刻的位置。应用:用于导航和定位,

Collection的所有的方法演示

import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class TestCollection {/*** @param args* Collection的所有的方法演示* 此程序没有使用泛型,所以可以添加任意类型* 以后如果写到泛型会补充这一方面的内容*/public s

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? ​编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序和有序列表 ​编辑 任务清单 插入链接和图片 内嵌代码和代码块 表格 公式 其他 源代码 预

图神经网络(2)预备知识

1. 图的基本概念         对于接触过数据结构和算法的读者来说,图并不是一个陌生的概念。一个图由一些顶点也称为节点和连接这些顶点的边组成。给定一个图G=(V,E),  其 中V={V1,V2,…,Vn}  是一个具有 n 个顶点的集合。 1.1邻接矩阵         我们用邻接矩阵A∈Rn×n表示顶点之间的连接关系。 如果顶点 vi和vj之间有连接,就表示(vi,vj)  组成了