天天看點

基于EthSnarks的以太坊Miximus混币器

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以太坊混币應用 — 彙智網