6.5 零幣和零鈔

在零幣和零鈔陸續出現之前,還沒有哪個加密數字貨幣的匿名化方案可以讓人如此興奮,不光是因為它們所實施的密碼學原理非常高妙,也因為它們承諾可以達到的匿名性非常強大有效。到目前為止,所有我們看到過的匿名加強技術,都是在原來的核心技術協議之上加載匿名化處理,零幣和零鈔則是在協議層就融合了匿名化處理。我們將在這裡以比較大的輪廓闡述一下這個協議,並對某些細節進行了必要的簡化,但讀者可以在本章結尾的延伸閱讀部分找到原始論文作為參考。

兼容性(compatibility)。零幣和零鈔為保證很強的匿名性,是有代價的:不同於中心化的混幣服務和合幣交易,這些協議和現在的比特幣不兼容。通過軟分叉(soft fork)[1]比特幣協議的方式去實施零幣在技術上是可行的,但實際操作的難度會對此造成很大的障礙。零鈔甚至不能通過軟分叉比特幣協議的方式去實現,而只能以一種另類幣(altcoin)的方式存在。

加密學保證(cryptographic guarantees)。零幣和零鈔在協議層已經融入了混幣功能,其匿名屬性來自加密學的保證,從性質上說,這些保證比我們之前討論的其他混幣技術更好。在隱私保護方面,你不需要信賴任何人,比如,混幣服務提供商、混幣節點,或其他任何形式的中介,甚至是礦工和共識機制協議。和大多數密碼學保證一樣,這種匿名性的保證僅僅依賴於攻擊者的計算能力上限。

零幣

為了解釋零幣,我們首先要介紹一下基礎幣(Basecoin)的概念,基礎幣是一種類似於比特幣的另類幣,而零幣是這種數字貨幣的一種延伸,其所提供的匿名性的核心特點在於,你可以將基礎幣和零幣進行來回轉換,並且當你這麼做的時候,就打破了舊的基礎幣和新的基礎幣之間的關聯。在系統裡,基礎幣是你需要進行交易的貨幣,零幣只是提供了一種交易基礎幣的機制,這種機制可以確保新幣和舊幣之間毫無關聯。

你可以把你所擁有的每一個零幣當作一個令牌,用來證明你擁有這麼一個零幣並且使其不能再被消費。這種證明機制並不會顯示你所擁有的是哪一個零幣,而僅僅是證明你確實擁有一個零幣,稍後你可以將這個證明給礦工看,以贖回這個證明並取得一個新的基礎幣。用一個比喻來說,就好比你去賭場用現金換了一些撲克籌碼,這些籌碼就是一種證明,證明你存了多少現金,等你離開賭場時,就可以拿著這些證明去換相同數量的但並不一樣的現金。當然,不像撲克籌碼,除了你可以稍後用來贖回一個基礎幣,你並不能拿零幣做任何事情。

為了在加密數字貨幣中讓這樣的機制正常運轉,我們要用密碼學的方式來執行這些證明,我們需要確保每一個證明只能贖回一個基礎幣,否則你就可以通過把一個基礎幣轉換成一個零幣,然後多次贖回獲取更多的免費基礎幣。

零知識驗證

我們使用的核心加密學工具是零知識驗證,這種方式可以證明一個聲明(數學上的)是正確的,而不需要展示可推導該聲明正確性的任何其他信息。例如,假設你已經做了很多工作解決了一個哈希謎題,並且你想要向其他人證明你做到了。換而言之,你想要證明「我做到了」這個聲明。

I know x such that H(x∥〈other known inputs〉)<〈target〉

當然,你可以展示上述公式裡的x值來證明你做到了,但是零知識驗證可以讓你向別人證明你做到了這一點,同時不需要透露x的值,即便在看過你的證明之後。

你也可以證明一個如「我知道一個x值,而公式H(x)的結果屬於下面這一個集合{…}」這樣的聲明。該證明既沒有展示x值是什麼,也沒有證明集合裡面到底哪一個元素等於H(x)。至關重要的是,零幣就是利用零知識驗證來實現其功能的。事實上,零幣中被這種方式證明的聲明,與後面要提到的例子非常相似。本書中,我們把零知識驗證當成一個黑匣子,只說明了零知識驗證可以實現的屬性以及在這個協議中的哪個部分是必需的,我們並沒有深究如何實現這一功能的技術細節。零知識驗證是現代密碼學的一個基石,是很多相關技術協議的基礎。再一次強調,我們建議有興趣的讀者可以參考延伸閱讀中提到的文獻,去瞭解更多更加詳細的內容。

鑄造零幣

零幣通過鑄幣過程而產生,而且任何人都可以鑄造一個標準面值的零幣。為簡便起見,我們認為零幣只有一種面值,每一個零幣價值一個基礎幣。雖然任何人都可以鑄造一個零幣,但是產生的零幣並不自動具備任何價值——你不可能獲得免費的錢。只有把零幣放到區塊鏈網絡上,並且通過消耗一個基礎幣的方式,它才能具備價值。

為了鑄造一個零幣,你需要使用加密學承諾。回顧一下我們在第1章講過的內容,承諾方案類似於將一個值放入一個信封,並將信封置於所有人的視野中(見圖6.11)。

圖6.11 一個序列號的承諾

註:密碼學承諾好比把一個序列號封裝到一個信封裡。

鑄造零幣的過程分為三步:

1.生成一個序列號S和一個隨機密鑰r。

2.計算一個函數Commit(S,r),這是序列號S的承諾。

3.如圖6.12所示,在區塊鏈上發佈該承諾,這需要消耗一個基礎幣,此幣不可再被花費,進而創建了一個零幣。此時並S和r仍然是保密的。

圖6.12 在區塊鏈網絡上設置一個零幣

註:為了將一個零幣置於區塊鏈中,需要創建一個鑄幣交易,其輸出地址是零幣序列號的一個密碼承諾,而鑄幣交易的輸入則是一個基礎幣,這個基礎幣也會在創建零幣的過程被消耗掉,整個交易過程並不需要公示這個序列號。

為了消耗一個零幣並贖回新的基礎幣,你需要證明你之前已經鑄造了一個零幣,你可以通過公開之前的承諾也就是說公示S和r的值來證明這一點,但是這樣顯然就建立了一個你的舊的基礎幣和新的基礎幣之間的關聯,那麼我們怎樣才能打破這個關聯呢?這個時候就用到零知識驗證了,在任何時間節點,區塊鏈網絡上都有很多的承諾對像——我們將其命名為c1,c2,…,cn。

以下是消耗一個具有序列號S的零幣以贖回一個新基礎幣的步驟:

● 創建一個特殊的「花費」交易,這個交易包含序列號S和一個具備零知識驗證的聲明:「我知道在承諾對像(S,r)中的r在以下的集合裡:{c1,c2,...,cn}」。

● 礦工將會驗證你的零知識驗證,這將給予你打開區塊鏈中一個零幣承諾的能力,而你並不需要真的打開它。

● 礦工也會查詢序列號S,確認這個零幣沒有在之前的花費交易中被使用過(為了防止雙重消費)。

● 你的花費交易的輸出將形成一個新的零幣,你應使用你所擁有的一個地址來作為輸出地址。

圖6.13 花費一個零幣

註:花費交易展示了之前鑄幣交易中所鎖定的序列號S,以及S和之前的鑄幣交易的關聯性的零知識驗證。不像一個鑄幣交易(或者一個普通的比特幣/基礎幣的交易),這個花費交易沒有輸入地址,因此也沒有簽名,只有一個零知識驗證的證明來確立它的有效性。

一旦你花費了一個零幣,其序列號就變得公開了,那麼你就不能再次贖回同一個序列號所對應的零幣,由於每一個零幣都僅有唯一的序列號,正如我們從安全角度所要求的那樣,每一個零幣只能被花費一次。

匿名性。在整個過程中,我們可以發現r一直是保持隱匿狀態,不管是鑄幣交易還是花費交易都沒有展示過r,這意味著沒有人知道哪一個序列號對應哪一個具體的零幣,這就是零幣匿名性背後的核心概念。在區塊鏈上,生成序列號S的鑄幣交易和稍後公示S以贖回一個零幣的花費交易之間,並沒有關聯性。這種聽起來像魔術般的特性是無法使用實體的封裝系統來實現的,但在密碼學中是可以做到的。好比我們在桌上放了一些裝有不同序列號的密封過的信封,你可以證明某一個序列號是這些信封裡面的一個,而不需要展示是哪一個,也不需要打開任何一個信封。

效率。回憶一下我們在花費交易中證明過的一個聲明:

「我知道在承諾對像(S,r)中的r在以下的集合裡:={c1,c2,…,cn}」。

其中,n代表的就是曾經被創建過的零幣的數量。聽起來這種零知識驗證的實施會變得非常沒有效率,因為證明中包含的集合大小會隨著n的增加而線性增大。神奇的是,零幣可以讓這種驗證的複雜度僅僅是n的對數。我們需要注意到這一點,即使需要被驗證的聲明的長度是線性的,聲明本身並不需要被包括在證明裡,而是隱含的。由於礦工們知道區塊鏈上所有零幣的集合,聲明就可以被礦工們自行推斷出來。這樣證明本身就可以非常短。儘管如此,跟比特幣相比較,零幣還是增加了相當大的額外開銷,大概50KB。

建立信任

用於搭建零幣的工具之一(RSA累加器)需要進行一次性信任設置。特別的是,一個被信任方需要選擇兩個大的質數p和q,並且公示N=p×q作為所有人在系統的整個生命週期中使用的參數。我們可以把N看作一個公鑰,只不過它被用於所有的零幣而不是僅僅對應於某一個體。只要這個被信任方,銷毀任何關於p和q的記錄,系統就可以被認為是安全的。需要強調的是,這一做法是基於對兩個大質數的積進行因子分解是不可行的這一假設的普遍認可。但是,如果任何人知道了秘密的因數p和q(也被稱為「陷阱門」),他們就可以在不被監測到的情形下,為自己創建新的零幣。所以,這些秘密的輸入只能被使用一次,在用於產生相對應的公鑰後就被銷毀。

這裡有一個有趣的社會學問題,一個個體怎麼選擇這個N並能夠讓每個人相信,在設置時使用的相對應的質數p和q,已經被安全地銷毀了,這一過程還不是很清楚。如何實現這個目標,會有很多不同的方案,其中就包括「閥值加密」技術,該技術可使用多個代理協同計算出N,而只要其中一個代理將自己的秘密輸入銷毀,這個系統就可以被認為是安全的。

我們還可以使用其他略有不同的加密構造來避免設置這樣一個被信任方。特別是,有實踐表明,隨機生成一個大數就具有很高的安全性,因為這樣一個數字很有可能不能被完全分解。但遺憾的是,這樣做會帶來很大的效率衝擊,因此這種方法並不實用。

零鈔

零鈔是一種不同的匿名性加密數字貨幣,它建立在零幣的概念之上,但將加密技術提高到了更高的層次。零鈔使用的是一種被稱為zk-SNARKS[2]的密碼學技術,這種技術可以使得零知識驗證更加簡潔、更加有效率,要點就在於,系統的整體效率可以達到某一定程度,使得整個網絡可以不需要依賴一種基礎幣而運行,所有的交易都可以以零知識驗證的方式進行。如我們所看到的,零幣也支持那些本不需要無關聯性的普通交易,只不過在其上做了計算量昂貴的混幣交易進行補充。這種混幣交易由固定面值的數字幣組成,交易價值的拆分與合併只能在基礎幣系統裡實現。在零鈔系統中,這種差異就不存在了,交易金額的大小被封裝在一個承諾中,在區塊鏈上不再可見,密碼學證據確保了拆分與合併的正確性,用戶並不能憑空創造出零鈔。

賬本公開記錄的唯一內容就是交易的存在性,以及礦工們用來驗證系統正常運行所需要的關鍵屬性的證明。區塊鏈網絡上既不顯示交易地址,也不顯示交易價值。唯一需要知道交易金額的用戶,是本次交易的發送方和接收方,礦工們是不需要知道的。當然,如果其中存在交易費用,礦工們則需要知道的僅僅是手續費,這點也不會影響匿名保護。

就匿名性和隱私性來說,零鈔這種完全不可追蹤的交易系統自成門派。因為公開賬本並不包含交易金額,零鈔對針對混幣服務的旁路攻擊是免疫的。

建立零鈔系統

按照技術屬性來說,零鈔看起來好得有點不真實。其實它確實也有自己的命門。就像零幣,零鈔也需要一個「公開參數」來設置這個零知識驗證系統。但是不同於只需要一個幾百個字節長度的數字N的零幣,零鈔需要的是一個很大的公開參數集——其大小超過1G字節。要再次強調的是,為了生成這些公開參數,零鈔需要一組隨機並且秘密的輸入。如果任何人知道了這些秘密輸入,就會產生無法監測的雙重消費問題,從而危及整個系統的安全性。

在這裡,我們不會過多地深入探討設置一個zk-SNARK系統所面臨的挑戰,這個問題也是一個比較活躍的研究方向,但是截至2015年,我們並不知道如何在實際操作中以足夠穩妥的方式建立這個系統。迄今為止,zk-SNARK還沒有被實際運用。

綜合比較,融會貫通

現在,讓我們從匿名性以及實際的可操作性兩個方面,來比較以下我們所探討的這些方案,見表6.1。

表6.1 本章所討論的匿名技術的比較

我們是從比特幣,這個已經成功部署了的「默認」系統開始的。但比特幣只是化名系統,我們看到,強大的交易圖譜分析是可能攻擊比特幣的匿名性的一種可行辦法。我們也探討了聚集大量地址簇方式,以及如何關聯真實世界的身份到這些地址簇的方法。

匿名化技術的下一等級,是用人工的方式實現一個單一混幣交易,或者通過人工找交易對手的方式來實現合幣交易,這會使輸入地址和輸出地址之間的關聯變得模糊,但同時也會在交易圖譜中留下了太多的線索。除此之外,混幣服務提供商和參與節點也可能是惡意的,或者因為被黑客攻擊的,或者被脅迫公佈記錄的。即使從匿名性來說離完美還很遙遠,但混幣服務在現實中存在,並且是現今一個可用的選項。

我們討論的第三個等級的匿名性,是混幣服務鏈或者合幣交易。這種匿名性上的改進,來自更少的對於混幣服務提供商或者節點組的依賴。諸如標準化的交易區塊大小和客戶端的自動化等特性,可以最小化信息洩露的可能性,但是還是有一些旁路風險可能會存在。同時,也還是存在一些攻擊者可能控制或者勾結多個混幣服務商與參與節點而帶來的風險。實現帶有混幣服務鏈功能的錢包和服務在技術上是可行的並且應該會被用戶所接受,但是據我們所知,一個安全的混幣鏈解決方案還不存在。

接下來,我們探討了把加密技術直接應用到協議層並提供匿名化的數學保證的零幣。我們認為零幣的旁路攻擊風險還是存在的,但是明顯已經優於其他的混幣解決方案。不過,零幣需要作為相對於比特幣的一種另類幣的方式發行。

最後,我們探討了零鈔。通過效率上的改進,零鈔可以作為一個完全無法追蹤——不僅僅是匿名化——的加密數字貨幣。然而,就像零幣一樣,零鈔和比特幣並不兼容,更糟糕的是,零鈔需要一個非常複雜的建立流程,數字幣領域仍然在研究如何用最好的方式來實現它。

在本章中,我們討論了很多技術。現在讓我們退一步看,比特幣的匿名性(或者匿名潛力)是強大的,當和其他一些技術配合的時候會更加強大,尤其是在匿名通信方面。如我們在第7章中將要討論的,這是一些匿名在線市場所使用的強有力的技術組合方式。

儘管匿名化技術是強大的,但同時也是脆弱的。一個錯誤就可能造成一個我們不希望看到的,但又是不可逆的關聯。匿名化有一些顯而易見的有害應用,但同時也存在很多有益的應用,所以是值得保護的。雖然道德層面上的區分很重要,我們還是無法在技術層面清楚地辨識。匿名技術看起來具有深入的和固有的道德模糊性,作為人類社會的一員,我們必須學會怎麼面對這個現實。

和關於比特幣的道德爭論一樣,比特幣的匿名性也是一個很活躍的技術創新領域。我們仍然不知道比特幣的哪一種匿名系統,如果存在的話,將會脫穎而出成為主流。這也將是每一個人的機會——不管你是一個開發者、一個政策制定者,還是一個普通用戶——每個人都可以參與其中並做出貢獻,希望你在本章中裡所學到的內容,可以為你提供一些正確的背景知識去採取行動。

延伸閱讀

與前面幾章中討論的主題相比,匿名技術在更快地持續發展中,並且是加密數字貨幣研究領域中更活躍的一個課題。想要跟上這個領域中最新的進展,可以閱讀以下列舉的論文,以及引用其他論文。

關於交易圖譜分析的《一簇比特幣》:

Meiklejohn,Sarah,Marjori Pomarole,Grant Jordan,Kirill Levchenko,Damon McCoy,Geoffrey M.Voelker,and Stefan Savage.「A Fistful of Bitcoins:Characterizing Payments among Men with no Names.」In Proceedings of the 2013 conference on Internet measurement,New York:ACM,2013.

關於我們討論的混幣技術和有效混幣原則的來源的研究:

Bonneau,Joseph,Arvind Narayanan, Andrew Miller,Jeremy Clark,Joshua A.Kroll,and Edward W. Felten.「Mixcoin:Anonymity for Bitcoin with Accountable Mixes.」In Financial Cryptography and Data Security. Berlin:Springer,2014.

混幣服務實踐研究,其中很多種並沒有很好的聲譽:

Moser Malte,Rainer Bohme,and Dominic Breuker.「An Inquiry into Money Laundering Tools in the Bitcoin Ecosystem.」 In 2013 eCrime Researchers Summit .Washington,DC:IEEE,2013.

比特幣論壇裡,比特幣核心開發者格雷·麥克斯韋(Greg Maxwell)發佈的有關合幣的內容:

Maxwell, Gregory.「CoinJoin: Bitcoin Privacy for the Real World.」 Bitcoin Forum, 2013.下載地址https://bitcointalk.org/index.php?topic=279249.0.

來自約翰·霍普金斯大學(Johns Hopkins University)的密碼學者開發了零幣,請記住零幣和零鈔是這本書裡我們討論過的最複雜的加密技術:

Miers,Ian,Christina Garman,Matthew Green,and Aviel D.Rubin.「Zerocoin:Anonymous Distributed E-Cash from Bitcoin.」In Proceedings of the 2013 IEEE Symposium on Security and Privacy .Washington,DC:IEEE,2013.

零幣的作者和其他一些開發了SNARK技術的研究者共同開發了零鈔系統:

Ben Sasson,Eli,Alessandro Chiesa,Christina Garman,Matthew Green,Ian Miers,Eran Tromer,and Madars Virza.「Zerocash:Decentralized Anonymous Payments from Bitcoin.」In Proceedings of the 2013 IEEE Symposium on Security and Privacy .Washington,DC:IEEE,2013.

[1] 所謂軟分叉在比特幣中的含義是對協議進行向前兼容的修改。修改後的新版本會造成原有的部分區塊或交易無效,但是按更新後的協議產生的新交易和區塊在舊協議下是有效的。換句話說,新協議是原協議的一個子集。——譯者注

[2] zk-SNARK的全稱是zero knowledge Succinct Non-interactive ARgument of Knowledge,是近年興起的一種密碼學方法。Snark在英文中本就有鬼魅的含義,用到這個技術上倒也有幾分神似。——譯者注

《區塊鏈:技術驅動金融》