Tornado 龙卷风混币原理

news/2024/11/17 16:30:32/文章来源:https://www.cnblogs.com/Soy-technology/p/18357465

项目背景

Tornado(https://tornado.cash/)是以太坊隐私赛道著名的混币项目,其混币技术主要使用了 zk-SNARK 零知识证明

1、关于 zk-SNARK 零知识证明的原理可以参见 if(DAO) 之前的文章:

  https://mirror.xyz/0xd05cFA28Eaf8B4eaFD8Cd86d33c6CeD1a1875417/X3qSOjObTknXQ_iGhDBFYETibD0TVW0twz5QDIthjGI

2、混币的意思是混币者通过 Tornado 合约将混币者的以太坊地址和资金去向地址失去关联,从而达到隐匿资金去向的目的。

项目原理

1、Bob 是第 3 个将自己的代币 Deposit 存入龙卷风合约进行混币的客户。

2、Alice 是第 4 个将自己的代币 Deposit 存入龙卷风合约进行混币的客户。

3、Alice 在 Deposit 时

(1)Alice random k4 ,r4。k4 和 r4 in { 0 ,1 } ^ 256。( k4 ,r4 ) 也是 Alice 未来的取款凭证 note4。

(2)Alice 计算得到 C4 = Hash1( k4 ,r4 )。

(3)Alice 将 Deposit 的金额 100 DAI + C4 + MerkleProof(C4) 发送至 Tornado 合约。

(4)Tornado 合约 verify MerkleProof(C4) :通过梅克尔证明验证 C4 账户状态的正确性。

(5)通过 C4 + MerkleProof(C4) update Tornado 合约内存储的与 Tornado 业务相关的全局状态 MerkleRoot。

(6)nf 在下面的 Withdraw 操作时才会用到,暂时不表。

4、Bob 在 Withdraw 时

(1)Bob random k3 ,r3。k3 和 r3 in { 0 ,1 } ^ 256。

(2)Bob 计算得到 C3 = Hash1( k3 ,r3 )。

(3)Bob 计算得到 nf3 = Hash2( k3 )。

(4)Bob 指定 Bob 混币后的收款地址 A。注意:Bob 必须在 statement 中指定收款地址 A,这样可以防止 Miner 矿工将 Bob 的收款地址更换成自己的地址从而盗取混币后的资金。

(5)Bob 构建 zk-SNARK Proof,即在不泄露自己账户信息的情况下证明自己曾经存入合约 100 DAI。具体做法是通过 :

public statement x = ( MerkleRoot ,nf3 ,A )

secret witness w = ( k3 ,r3 ,C3 ,MerkleProof(C3) )

从而构建 zk-SNARK Proof π。这个过程和我们之前学习的零知识证明匹诺曹协议是吻合的:

1)TrustSetup :S ( C ) => ( Sp ,Sv)。(本篇省略了:通过电路 C 构建可信设置并分别生成 Sp 和 Sv,其中 Sp 给 Prover 生成零知识证明 π,Sv 给 Verifier 验证零知识证明 π 的正确性)。

2)P ( Sp ,x ,w ) => Proof π。(Prover 证明者构建零知识证明 π)。

3)V ( Sv ,x ,π ) 是否正确。(Verifier 验证者验证零知识证明 π)。

(6)Tornado 合约将 Bob 提交的 nf3 增加至 nullifier 中存储,用以保证 Bob 的这笔 100 DAI 的混币存款不能被再次 Withdraw。即当 Bob 想再次 Withdraw 此笔存款时,Tornado 合约会检查此笔存款对应的 nf3 是否存在记录,如果存在则拒绝提款。

(7)Tornado 合约返回给 Bob 指定的资金去向地址 A ,金额 100 DAI(因为示例中使用的是 Tornado 100 DAI Pool),完成最终的混币。

一般的资金转移过程中,Bob 必须向区块链网络提交 From 转出账户 + To 转入账户 + Amount 转账金额。而通过 Tornado 合约,Bob 在取款过程中,只向区块链网络提交了 3 项数据:为了防止 Bob 或攻击者重复 Withdraw 的一个由随机数生成的哈希值 nf + 没有透露任何与 Bob 秘密相关的零知识证明 π + 以太坊公开地址 A 但没人知道这是 Bob 的地址。Bob 最终达到了隐匿取款人和资金去向的目的。

项目不足

上面的分析过程中,我们忽略了一件重要的事:以太坊等主流区块链的协议中一般都是谁发起交易谁承担 gas。在上面的流程中,Bob 在 Withdraw 取款过程中花费了无法隐匿的 gas,数据分析人员可以关联 Bob 的地址和最终货币的去向地址 A,从而暴露了 Bob 的身份。

Tornado 的解决方案是让 Bob 、Alice 等使用 Tornado 合约的客户不直接向 Tornado 合约发起 Withdraw 交易,而是让 Relay 这样一个中心化服务器中继 Withdraw 交易,花费 gas:

1、这样做的好处是:所有向 Tornado 合约发起提款交易的地址都是 Relay Address 并由该地址承担 gas,隐匿了 Bob 、Alice 的地址信息。

2、这样做的缺点是:Relay 服务器是中心化的,这也是龙卷风经常被人诟病的一个痛点。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java浅拷贝BeanUtils.copyProperties引发的RPC异常

背景 近期参与了一个攻坚项目,前期因为其他流程原因,测试时间已经耽搁了好几天了,本以为已经解决了卡点,后续流程应该顺顺利利的,没想到 人在地铁上,bug从咚咚来~ 没有任何修改的服务接口,抛出异常: java.lang.ClassCastException: java.util.HashMap cannot be cast t…

RSS 源:在信息洪流中找回你的时间掌控权

简单介绍了 RSS 后,那么关键的一步就是建立好自己的 RSS 源了。200.RSS源管理 简单介绍了 RSS 后,那么关键的一步就是建立好自己的 RSS 源了。 并不是所所有平台都会提供 RSS 源,因此我们也没办法直接去订阅。 目前使用 RSS 的难题之一就是 RSS 源的匮乏,是无数人重新拥抱 …

P5431 【模板】模意义下的乘法逆元 2

看到5e6的数据,500ms的时限,\(O(NlogN)\)快速幂直接跑肯定会T掉,那我们就要考虑优化一下式子。 我们令\(s = \prod_{1}^{n}{a[i]}\) ,那我们给第i个式子通分,就为$ \frac{k^i*s/a[i]}{s} $ \(s/a[i]\) 就相当于$ \prod ^{i-1}_{1}{a[i]}* \prod _{i+1}^{n}{a[i]}$ 因此我们只…

IOS UI自动化脚本

1.安装rethinkdb https://rethinkdb.com/docs/install/osx/ 2.安装bunch包错修复setup.py里面的数据,去掉U 3.imp包变成了importlib需要替换import Imp# moduleFile, pathName, desc = imp.find_module(moduleName, [os.path.dirname(modulePath)])# module = imp.load_module…

Cartographer的扫描匹配

cartographer 代码思想解读(1)- 相关匹配cartographer在2016年开源后一直在使用,但是一直未仔细阅读并分析其核心代码结构。目前网上可以找到许多博主对其分析和理解。其cartographer的基本思想可参考他人的 博主博客。本博客主要目的根据其框架思想,将其核心算法进行提取,…

TapData 信创数据源 | 国产信创数据库 PolarDB MySQL 数据同步指南,加速国产化进程,推进自主创新建设

本专题将以 TapData 正在支持的各国产信创数据源为原点,提供详细的数据库同步、迁移教程,为有需求的用户提供更灵活的工具选择。本文将介绍的 TapData 数据源为——PolarDB。随着国家对自主可控的日益重视,目前在各个行业和区域中面临越来越多的国产化,采用有自主知识产权的…

sqlserver取消阻止表更改

😘宝子:除非不再醒来,除非太阳不再升起,不然都请你好好生活,挣扎着前进,开心的笑。(●◡●)

pbootcms 网站打开提示:未检测到您服务器环境的sqlite3数据库扩展...

pbootcms 网站打开提示:未检测到您服务器环境的sqlite3数据库扩展...按照提示信息操作,检查php.ini中是否已经开启sqlite3扩展。详细介绍->pbootcms提示错误信息 未检测到您服务器环境的sqlite3数据库扩展扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟…

Python网页应用开发神器fac 0.3.0全新版本发布

大家好我是费老师,在Python生态中,有很多以Python为主要开发语言,实现网页应用开发的框架,其中最为知名的有Dash、flet、streamlit、gradio、nicegui等。 如果综合考虑流行度、开发效率、开发自由度、相关生态成熟度、可拓展性、安全性等各方面的能力,Dash是其中天花板级别…

天线选择快速指导

《swra351b-DN035 -- Antenna Quick Guide (Rev. B).pdf》

pbootcms新手必读|安装需知|环境要求|快速部署|获取授权码|模板制作

环境要求服务器:Linux / Windows / Nginx / Apache / IIS PHP版本:不小于5.4,完美支持php7。推荐PHP5.6和PHP7.3 MYSQL版本:5.0以上。推荐使用5.5+快速部署1、将官网下载的压缩包里面所有文件和文件夹上传到你的网站根目录 (支持安装在二级目录)2、数据库默认采用的是sqlit…

pbootcms教程—设置的会话目录创建失败!

pbootcms教程—设置的会话目录创建失败!这个问题常见于宝塔面板,用户将pbootcms模板传到宝塔上,打开域名出现这个问题。解决方法:1、打开宝塔面板,左侧找到文件,找到对应的站点目录,如下图:2、按照下图进行设置,点确定,如果默认就是这样的设置,也要点下确定…