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_hash
、
nullifier
和
merkle_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以太坊混币應用 — 彙智網