您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么構建Miximus混幣引用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么構建Miximus混幣引用”吧!
利用Miximus混幣應用,你可以存入1個ETH,然后利用zkSNARK證據證明你持有這個幣的消費密鑰,通過驗證之后就可以提幣了,整個過程保證了匿名性。
Miximus的主要源代碼包括:
Miximus.sol
miximus.py
test_miximus.py
miximus.cpp
zkSNARK證明方作為原生庫構建,因此可以打包進你的應用,當提供正確的參數后,庫會返回JSON格式的zkSNARK證據。你可能會認為zkSNARKs很慢 —— Miximus選擇的算法生成證據的平均時間是5秒,不過我們還在研究其安全特征。
如果在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
假設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
如果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的賬戶可以向指定合約提交其生成的證據,目的是避免重放攻擊及其他惡意行為。
只有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混幣引用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。