jjzjj

什么是隐私混币协议Tornado Cash?| Tokenview

Tokenview 2023-06-02 原文

Tornado Cash工作原理

Tornado Cash (Tornado) 是一种在以太坊区块链上运行的虚拟货币混合器,通过混淆其来源、目的地和交易对手,不加选择地促进匿名交易,而不试图确定其来源。通过对零知识证明的创新使用,能够以不可追溯的方式将ETH以及ERC20代币(目前支持DAI,cDAI,USDC,USDT,WBTC)发送到任何地址。也就是说,Tornado 接收各种交易并将它们混合在一起,然后再将它们传输给各自的接收者。虽然据称目的是增加隐私,但像 Tornado 这样的混合器通常被非法行为者用来洗钱,尤其是那些在重大抢劫中被盗的资金。

Tornado Cash如何实现隐私保护?

Tornado Cash是一个为以太坊用户提供隐私保护的开源软件项目。与许多此类项目一样,Tornado Cash不是法律实体,而是由不同贡献者群体多年来开发的几个开源软件库。这些贡献者已发布并提供Tornado Cash作为以太坊区块链上的智能合约集合作为一般用途。用户可将ETH或者其他代币发送到Tornado提供的一个智能合约上,并可再提款至不同的地址上,这样就打破了源地址和目标地址之间的链上链接从而提高了交易隐私。

Tornado实现路径如下:用户在存款时需要生成一个秘密(secret),并将其哈希值连同存款的数额发送到 Tornado 的智能合约中。合约接收存款后,将其承诺也添加到合约的存款列表中。日后,当用户想要提款时,需要向合约提供一个证明,证明其拥有一个secret,能和智能合约中的存款列表中未被花费的承诺(commitment)对应起来。得益于零知识证明 技术的加持,Tornado 可以在不公开这个secret与哪笔资金相关的条件下完成匹配。Tornado智能合约将检查这个证明,然后将存款金额转移到指定的提款地址。而对于外部的观察者来说,无从得知这笔提款来自哪笔存款。

Tornado Cash核心合约:Pools

Tornado Cash pools是智能合约,使用户能够在以太坊上进行私秘交易。当用户使用时,Pool将自动执行两种支持的操作之一:“存款”或“取款”。这些操作一起允许用户从一个地址存入代币,然后将同样的代币提取到另一个地址。至关重要的是,即使这些存款和取款事件公开发生在以太坊的透明分类账上,存款和取款地址之间的任何公共链接都被切断了。用户可以提取和使用他们的资金,而不必担心将他们的整个财务历史暴露给第三方。

为了支持存款和取款操作,这些智能合约编码了进一步定义其功能的严格规则。这些规则自动应用于存款和取款操作,以维护所有Tornado Cash pool共享的一个非常重要的属性:用户只能提取他们最初存放的特定代币。

此属性会自动针对池的所有操作强制执行,并确保Tornado Cash池完全是非托管的。也就是说,存入并随后提取代币的用户保持对其代币的完全所有权和控制权,即使它们混入过池子。用户在任何时候都不需要将其代币的控制权交给任何人。

美国财政部制裁 Tornado

2022年8月,美国财政部外国资产控制办公室 (OFAC) 宣布制裁混币器Tornado Cash,将Tornado Cash 相关的USDC和ETH地址添加到特别指定国民 (Specially Designated Nationals, SDN) 名单中。在发布的公告中,OFAC禁止美国居民使用Tornado Cash。Tornado Cash一直以来是一些去中心化金融黑客攻击和利用的核心。自2019年以来,个人和团体使用该混和器清洗了价值超过70亿美元的加密货币。

“尽管公众另有保证,但Tornado Cash 一再未能实施有效控制措施,以阻止其定期为恶意网络行为者洗钱,并且没有采取基本措施来解决其风险,财政部将继续积极采取行动,打击为犯罪分子和协助犯罪分子洗钱的混币者。”负责恐怖主义和金融情报的美国财政部副部长Brian Nelson表示。

此消息一出,USDC稳定币发行方Circle也冻结了价值超过75,000 USDC 的资金,这些资金与OFAC批准的列入SDN名单中的44个Tornado Cash地址有关。

随着加密市场监管制度的逐渐完善,隐私交易越来越受到重视。此前几年里,Tornado已经成为区块链用户(合法和非法用户)的默认平台,用以保护交易中的隐私。区块链交易对隐私的需求尤其迫切,因为所有交易都是公众可见的。没有Tornado来混合资金,区块链要实现隐私将变得更加复杂。

有关什么是隐私混币协议Tornado Cash?| Tokenview的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  7. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  9. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  10. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

随机推荐