EthSnarks以太坊混币器【零知识证明】

Stella981
• 阅读 874

Miximus是一个用于以太坊区块链的去中心化混币器和匿名转账应用,由EthSnarks作者开发,用于展示零知识证明在以太坊上的实用性。本文介绍Miximus以太坊混币应用的安装使用方法、工作原理和实现细节。

用自己熟悉的语言学习以太坊DApp开发:Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart

1、Miximus混币应用概述

利用Miximus混币应用,你可以存入1个ETH,然后利用zkSNARK证据证明你持有这个币的消费密钥,通过验证之后就可以提币了,整个过程保证了匿名性。

Miximus的主要源代码包括:

  • Miximus.sol
  • miximus.py
  • test_miximus.py
  • miximus.cpp

zkSNARK证明方作为原生库构建,因此可以打包进你的应用,当提供正确的参数后,库会返回JSON格式的zkSNARK证据。你可能会认为zkSNARKs很慢 —— Miximus选择的算法生成证据的平均时间是5秒,不过我们还在研究其安全特征。

2、构建Miximus混币引用

如果在Linux上构建Miximus混币应用,需要先安装以下依赖软件:

  • cmake 3
  • g++ or clang++
  • gmp
  • libcrypto
  • boost
  • npm / nvm

在OSX上需要Brew和nvm:

make git-submodules # Pull sub-repositories
make -C ethsnarks mac-dependencies
make -C ethsnarks python-dependencies
nvm install --lts
make

在Ubuntu上使用如下命令构建:

make git-submodules # Pull sub-repositories
sudo make -C ethsnarks ubuntu-dependencies
make -C ethsnarks python-dependencies
nvm install --lts
make

在CentOS上构建命令如下:

yum install cmake3 boost-devel gmp-devel
nvm install --lts
make git-submodules # Pull sub-repositories
make -C ethsnarks python-dependencies
make CMAKE=cmake3

3、Miximus混币应用的工作原理

假设Alice要给Bob转一个币:

1、Bob给Alice一个只有他自己才知道的密文的哈希 2、Alice使用Miximus智能合约的Deposit()方法向合约存入1个ETH,同时传入Bob给的哈希 3、Alice存入的币插入合约维护的merkle树,在这棵树上所有的币都是1个ETH 4、Bob使用密文生成zkSNARK证据,这可以证明他拥有Miximus合约中对应的币。 在证据中包含了不可链接的消费标签,以避免同一个币被两次消费(双花)。 5、Bob使用Miximus合约的Withdraw()方法提交证据和消费标签,如果对应 的币还没有被消费,那么Miximus向Bob支付1个ETH

4、Miximus混币应用的实现细节

如果Alice希望给Bob转账,那么她需要Bob提供一个密文哈希。Bob首先生成一个随机密文(随机场成员,按zkSNARK素数取模):

coin_secret = FQ.random()

随后Bob将密文的哈希发送给Alice:

bobs_leaf = H(coin_secret)  # Generated using `MakeLeafHash()` method of the smart-contract

Alice调用Miximus合约的Deposit()方法存入以太币的同时传入bobs_leaf参数,该参数也是存入的币在Miximus合约中的merkle树上的叶节点。Bob可以通过监听Miximus合约的OnDeposit事件来监听Alice是否已经完成转账。由于只有Bob知道密文,因此只有Bob能够生成正确的zkSNARK证据。

Bob使用leaf_index参数(从OnDeposit事件得到)调用Miximus合约的GetPath()方法提取Alice存入的币对应的merkle树路径,同时使用合约的GetRoot()方法得到合约的merkle树的根节点。

Bob调用Miximus合约的GethExtHash()方法提取其外部哈希external_hash,即合约地址和Bob以太坊地址的哈希。这意味着只有Bob的账户可以向指定合约提交其生成的证据,目的是避免重放攻击及其他恶意行为。

5、zkSNARK电路伪代码

只有external_hashnullifiermerkle_root参数是公开的并且可以在链上查到,其余数据都是zkSNARK证据的私有输入:

def circuit(secret, path_var, address_bits, nullifier, root, external_hash, pub_hash):
   assert H(root, nullifier, external_hash) == pub_hash
   leaf_hash = H(secret) # Prove we know the secret for the leaf
   assert root == merkle_authenticate(path_var, address_bits, leaf_hash) # Prove that leaf exists within the tree
   assert H(address_bits, secret) == nullifier

上述电路可以验证:

  • 叶节点在merkle树上
  • 证明人知晓叶节点对应的密文(哈希的preimage)
  • 消费标签是从叶节点得出的

由于这时zkSnark证据,因此上述证明过程不会透露到底是merkle树的哪个叶节点,但是如果Bob试图为同一个叶节点生成两个证据,那么由于消费标签是相同的,因此Bob的双花尝试不会成功。

Miximus合约没有使用密钥(或secp256k1),其实现仅仅利用了密文和哈希。zkSNARK证据可以证明你的确知道密文而无需透露其具体内容。Miximus合约使用的哈希函数是MiMC,它作用于素数域而非字节数据。


原文链接:Miximus以太坊混币应用 — 汇智网

点赞
收藏
评论区
推荐文章
可莉 可莉
2年前
10个开源的Python区块链项目
Python不是主流的区块链底层平台开发语言,但是在DApp开发、区块链仿真与数据分析、智能合约安全分析等领域,Python依然是不错的选择。本文介绍了10个最流行的Python区块链项并提供了相应的源代码下载地址。<!more区块链开发教程链接:以太坊(https://www.oschina.net/action/GoToLink
Stella981 Stella981
2年前
ERC20接入Uniswap教程【DeFi】
Uniswap是基于以太坊的去中心化数字加密货币交易协议,它为代币持有者提供了简洁的接口来将一种ERC20代币兑换为另一种,并且交易所需的gas成本很低。区块链开发者可以自己的ERC20代币接入Uniswap以增强其流动性。在这个教程中,我们将学习如何将一个ERC20代币接入Uniswap协议,并且在教程的最后提供完整的实现源代码。用自己熟悉的语言学
Stella981 Stella981
2年前
EIP712实现无Gas以太坊交易【含源码】
每个人都在讨论无gas以太坊交易,因为没有人喜欢支付gas费用。但是以太坊网络能够精准地运转恰恰是因为交易需要手续费。那么如何实现无gas交易呢?让我们一起学习无gas以太坊交易的魔法!在这篇文章中,我们将学习如何实现无gas交易模式。你会发现虽然在以太坊上没有免费的午餐,但可以用有趣的方式来转移gas成本。利用本文中学到的知识,你的DApp用户就可以省
Stella981 Stella981
2年前
Solidity合约安全漏洞分析教程【Mythril】
在这个教程中,我们将学习Mythril的安装与使用方法,了解Mythril的工作原理,掌握如何利用EtherThief和Suicide模块分析合约的安全漏洞,以及如何配置Mythril安全分析的交易数量参数和执行超时参数。用自己熟悉的语言学习以太坊DApp开发:Java(https://www.oschina.net/action/GoToLi
Wesley13 Wesley13
2年前
37个常见的智能合约安全问题【以太坊】
SWCRegistry是以太坊安全人员和开发人员的必备知识库。它是SmartContractSecurity提供的以太坊智能合约安全漏洞分类及测试用例集,其中包含了37种以太坊Solidity智能合约开发中常见的安全问题的描述及后果,例如重入、溢出等,同时也给出了CWE漏洞分类、解决方案和作为示例的合约程序代码。用自己熟悉的语言学习以太坊DA
Stella981 Stella981
2年前
Fabtoken
HyperledgerFabric2.0(alpha)中有一个新特性:Fabtoken,可以原生支持数字加密货币的发行与管理。我们都知道以太坊的ERC20标准可以用来在以太坊区块链上创建数字加密代币,现在有了Fabtoken,开发者使用HyperledgerFabric也可以轻松实现数字加密货币的发行、转账等功能了!HyperledgerF
Stella981 Stella981
2年前
DeFi研究资源大全,超过100个!
本文为DeFiPulse提供的去中心化金融DeFi协议及应用大全的中文翻译版,内容涵盖借贷产品、DeFi交易、去中心化支付、DeFi钱包、用户接口、DeFi基础设施、数据分析等11个分类,是区块链开发人员及金融从业者研究去中心化金融的必备资源。用自己熟悉的语言学习以太坊DApp开发:Java(https://www.oschina.
Stella981 Stella981
2年前
DeFi Compound开发REST API
在这个教程中,我们将学习如何为DeFi协议Compound的智能合约创建一个可以通过HTTP访问的API开发接口,并学习如何使用Infura作为以太坊网络和应用之间的桥梁。Compound是一个基于以太坊的数字资产借贷利率协议。Infura(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%
Stella981 Stella981
2年前
Solidity内联汇编简明指南
在用Solidity开发以太坊智能合约时,使用汇编可以直接与EVM交互,降低gas开销成本,更精细的控制智能合约的行为,因此值得Solidity开发者学习并加以利用。本文是Solidity汇编开发的简明教程,旨在帮助你快速熟悉如何在Solidity智能合约代码中嵌入汇编代码。以太坊教程链接:Dapp入门(https://www.oschina.n
Stella981 Stella981
2年前
Optimsim Rollup详解
OptimismRollup是目前最流行的以太坊L2解决方案。本文将解释OptimismRollup每个设计决策背后的动机,剖析Optimism的系统实现,并提供指向每个分析组件的相应代码的链接,适用于希望了解Optimism解决方案的工作原理并评估所提议系统的性能和安全性的开发人员。区块链开发教程链接:以太坊(https://www.osc