Miximus以太坊混币应用EthSnarks/零知识证明
Posted 跨链技术践行者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Miximus以太坊混币应用EthSnarks/零知识证明相关的知识,希望对你有一定的参考价值。
Miximus是一个用于以太坊区块链的去中心化混币器和匿名转账应用, 由EthSnarks作者开发,用于展示零知识证明在以太坊上的实用性。 本文介绍Miximus以太坊混币应用的安装使用方法、工作原理和实现细节。
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:
1 2 3 4 5 | make git-submodules # Pull sub-repositories make -C ethsnarks mac-dependencies make -C ethsnarks python-dependencies nvm install --lts make |
在Ubuntu上使用如下命令构建:
1 2 3 4 5 | make git-submodules # Pull sub-repositories sudo make -C ethsnarks ubuntu-dependencies make -C ethsnarks python-dependencies nvm install --lts make |
在CentOS上构建命令如下:
1 2 3 4 5 | 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素数取模):
1 | coin_secret = FQ.random() |
随后Bob将密文的哈希发送给Alice:
1 | 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_hash
、 nullifier
和merkle_root
参数是公开的并且可以在链上 查到,其余数据都是zkSNARK证据的私有输入:
1 2 3 4 5 | 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以太坊混币应用EthSnarks/零知识证明的主要内容,如果未能解决你的问题,请参考以下文章