0x00 前言算法
距離上次發博客有一兩個月了,這段時間裏潛(ku)心(bi)的看區塊鏈的論文,通過好多好多論文及材料的學習,我發現如今區塊鏈發展的一個頗有意義的方向就是匿名性,早的有匿名交易如ZeroCash和monero,晚點的有以太訪爲了匿名的zk-SNARK不惜進行硬分叉,如今對於匿名合約的研究更是大熱。然鵝,做爲我天朝區塊鏈項目的執牛耳者,NEO竟然咩有匿名相關的任何研究及研發資料或者文檔,這不科學。因此我就試着去研究了一下在NEO上部署匿名交易合約的可行性。安全
0x01 不可能完成的任務學習
和我以前研究NEO上的任意數量安全隨機數的可能性同樣,我對於在NEO上部署匿名交易合約的結論也是不可行。先把結論掛出來,只須要結果的就能夠不用往下看分析了。區塊鏈
爲了親民考慮,咱們徹底拋開什麼零知識證實之類高大上的東西(實際上是沒看懂)。有感興趣的能夠參考零知識證實。可是哇,參考是能夠的,可是不建議深刻研究。這個東西技術細節須要很強的密碼學功底,筆者反正是撤了。加密
0x02 匿名設計設計
這裏我用到的東西是偷的一部分門羅幣裏CryptoNight構造交易時隱藏用戶信息的方法,可是因爲這只是博客而已,因此具體用了多少我也不去深究了。blog
咱們先不考慮這些幣怎麼來的,就說已經存在了。幣採用UTXO的形式設計,每一個UTXO的結構以下:接口
對於這個系統裏的每個UTXO來講,Coin記錄着幣自己的信息,這個信息由用戶的公鑰進行加密,也就是說,假如這個幣是李總的,那麼這個Coin裏的信息就是由李總的公鑰來加密的。每個Coin自己有一個私鑰,這個私鑰能夠在每次交易的時候從新生成,在交易構造完成後,與一般的使用用戶本身的私鑰進行簽名不一樣,這裏使用目標用戶的公鑰進行簽名,以後再用Coin自己私鑰對應的公鑰進行簽名。在交易發佈以後,系統只須要對Coin自己的合法性進行驗證便可,不須要關心究竟轉帳或者傳遞的數據的內容是多少。文檔
也就是說,假如A轉帳給B,那麼交易構造的流程應該是這樣的: 部署
首先A從本身的Coin裏拿出一個Coin,而後用本身的私鑰解密獲取Coin自己的key1,生成新的key2並用這個key2替換key1構造新的Coin,構造完成後用B的公鑰來對Coin進行加密,以後再用key1添加簽名。
交易發出後,系統會驗證key1是否和這個UTXO以前的版本相關聯。
0x03 雙花致使的不可能性 在上面的設計中有一個很嚴重的bug,就是雙花問題,A知道UTXO,並且能夠解密UTXO,那麼A就可能構造許多許多的交易,而系統又要求匿名性,那麼就不能引入對已有交易的直接判斷,那如何即知道這筆錢已經被消費了,而又不知道是花的哪筆錢呢?這裏就須要用到零知識證實,在零知識證實中,最簡單的解釋就是公式:f(x)+f(y)=f(x+y),就是說,咱們只知道f(x),f(y)而不知道x和y,可是咱們就能夠判斷出f(x+y)的結果是正確的。在這個系統中,咱們能夠認爲Coin就是x,用戶就是y,咱們把Coin和用戶都經過算法隱藏起來,可是提供二者交互的結果,那麼系統就能夠驗證這個交互的正確性而不須要知道具體的Coin和用戶。這樣就達到了匿名而又避免了雙花問題。然而,在NEO中,NEO並無對合約開放驗證零知識證實須要的密碼學計算接口。沒有接口也就意味着沒法進行零知識證實。所以,至少以目前的分析來看,在NEO合約中部署匿名交易合約是不可能的,除非官方開放相關密碼學接口。可是話說回來,零知識證實自己須要的計算量比較大,若是NEO中開放零知識證實的算法接口,那麼節點的計算壓力將會暴增。
0x04 結語
本文只是筆者一段時間學習結果的小積累,並不必定徹底正確,也不表明嚴謹的區塊鏈研究。若是有人有相關的思路,歡迎交流。