在不久前的文章《【研究員視角】區塊鏈:從入門到精通》裡,來自微軟亞洲研究院區塊鏈專案的研究員閆鶯和陳洋以9月在上海召開的以太坊第二屆開發者大會作為切入點,與我們分享了目前區塊鏈技術的前沿趨勢與動向,該文章也頗受行業研究者的好評。因此,他們又帶來了他們的第二期分享,這篇文章主要探討的是區塊鏈近期的關注熱點——它作為公開賬本如何保護隱私問題。快來一覽為快吧!
區塊鏈——作為公開賬本,解決了各方如何建立信任的問題,卻也同時帶來了一個新的問題:隱私如何得到保護?當使用者的所有交易資訊都暴露在大眾面前,如果這些交易資訊被惡意挖掘及利用,將給使用者隱私帶來嚴重的威脅。本文將就區塊鏈技術中的隱私問題以及最前沿的解決方案給大家做一個形象的介紹和分析。
區塊鏈的隱私問題
也許大家首先會有一個疑惑:比特幣等區塊鏈技術不是“匿名”的嗎,為什麼會有隱私問題?要回答這個問題,我們首先要區分“化名”和“匿名”這兩個概念。化名很好理解,就是我們在網路中使用的一個與真實身份無關的身份。例如在比特幣系統的交易中,使用者無需使用真名,而是採用公鑰雜湊值作為交易標識。在這個例子中,公鑰雜湊值就可以代表使用者的身份,與真名無關,因此比特幣是具備化名性的。
但匿名跟化名是不同的。在電腦科學中,匿名指的是具備無關聯性(unlinkability)的化名[1]。所謂無關聯性,就是指站在攻擊者的角度,無法將使用者與系統之間的任意兩次互動進行關聯。在比特幣中,由於使用者反覆使用公鑰雜湊值作為交易標識,交易之間顯然能建立關聯。因此比特幣並不具備匿名性。
若單個地址進行交易並不能確保匿名性,那麼多個地址又如何?答案依然是否定的:如圖1所示,使用者X利用多個賬戶在一定時間內向使用者Y進行轉賬,攻擊者可以很大機率猜測這幾個地址屬於同一個使用者,而將這多個地址都歸為一個地址簇。
圖1: 多賬戶與單一賬戶交易會被關聯
除了上述情況,零錢地址也會暴露使用者地址的關聯性。如圖2所示,使用者X向使用者Y轉賬40,總計付款50,因此零錢返回10。攻擊者會很大機率推測賬戶D是零錢地址,從而將賬戶D和E進行關聯。早期的比特幣類庫(Bitcoin-Qt library)就存在過零錢地址總出現在輸出地址第一個而帶來的隱私問題(已在2012年修復)。
圖2:零錢賬戶與其他賬戶會被關聯
在將使用者多個地址歸併為地址簇後,再結合現實中直接發生交易來給地址簇加上標籤,就可以畫出如圖3的標籤簇圖。圖中的連線表示一次交易,圓的面積大小代表交易量。雖然圖中只列出了服務提供商、交易所、礦池的標籤,需要說明的是,也可以利用類似的手段來獲取個人使用者現實生活中的身份資訊。因此再結合服務提供商的地址資訊及公開賬本,個人使用者的所有消費記錄將顯露無遺。這將帶來嚴重的使用者隱私問題。
圖3:透過實際交易及地址簇構建標籤簇[2]
如何在保障隱私(隱藏交易內容)的情況下實現區塊鏈的特性(交易可驗證,歷史可查等)呢?下面我們介紹三種最典型的匿名化方案:達世幣(Dash),門羅幣(Monero),零鈔(Zcash)。
達氏幣(Dash)
達氏幣使用了一種稱之為合幣(CoinJoin)的關鍵技術。簡單地說,所謂合幣技術就是透過一些主節點(master node)來將多個使用者(至少3個)的多筆交易進行混合、形成單一交易的技術。在合幣中,每個使用者都會提供一個輸入輸出地址,然後將其送到主節點進行混合(即任意交換輸入輸出地址)。交易只能以規定面額(0.1, 1, 10, 100)為單位來進行,這樣就增加了攻擊者從數額的角度來猜測交易關聯度的難度。同時,主節點要保證亂序輸出。如圖4所示,不同的顏色代表此金額來自不同使用者,DASH是達氏幣的貨幣標識。透過混合,黃色使用者完成了對綠色使用者進行轉賬10 DASH。而外界很難從混淆後的交易中發現這筆交易。
圖4:合幣技術可以將多個使用者的多筆交易進行混合[3]
合幣中一個關鍵的保護隱私的角色就是主節點,因為主節點依然存在被攻擊者控制的可能性。為了解決這個問題,達氏幣中引入了鏈式混合(chaining)以及盲化(blinding)技術。所謂鏈式混合,就是指使用者的交易會隨機選擇多個主節點,並在這些主節點中依次進行混合,最後輸出;所謂盲化技術,就是指使用者不直接將輸入輸出地址傳送到交易池,而是隨機選擇一個主節點,讓它將輸入輸出傳遞到一個指定的主節點,這樣後一個主節點就很難獲取使用者的真實身份。透過這兩個技術,除非攻擊者控制了很多的主節點,否則幾乎不可能對指定交易進行關聯。
除了防範交易數額以及輸入輸出地址的關聯攻擊,達氏幣還防範了交易時間上的關聯攻擊。每個使用者往往都會具備自己的交易習慣,例如每天的交易時間段以及短時間內進行多筆交易等等。這些時間資訊也會一定程度暴露使用者身份。為了解決這個問題,達氏幣提出了被動(passive)匿名化的方案,保證使用者客戶端以固定的時間間隔發起交易請求,來參與主節點的混合。
自從2014年市場化以來,達氏幣就頗受市場追捧,截至2016年12月2日,其市值已超過6000萬美元,在所有加密貨幣中排名第7;貨幣單價為8.85美元,在所有加密貨幣中排名第4[4]。
門羅幣(Monero)
在達氏幣中,依然存在主節點被控制以及參與混幣有惡意使用者的風險,這在一定程度上會導致使用者隱私的洩露。為了解決這個問題,門羅幣提出了一種不依賴於中心節點的加密混合方案。門羅幣的關鍵技術有兩個,一個叫做隱蔽地址(stealth address),另一個叫做環簽名(ring signature)[5]。
隱蔽地址是為了解決輸入輸出地址關聯性的問題。每當傳送者要給接收者傳送一筆金額的時候,他會首先透過接收者的地址(每次都重新生成),利用橢圓曲線加密算出一個一次性的公鑰。然後傳送者將這個公鑰連同一個附加資訊傳送到區塊鏈上,接收方可以根據自己的私鑰來檢測每個交易塊,從而確定傳送方是否已經傳送了這筆金額。當接收方要使用這筆金額時,可以根據自己的私鑰以及交易資訊計算出來一個簽名私鑰,用這個私鑰對交易進行簽名即可。
隱蔽地址雖然能保證接收者地址每次都變化,從而讓外部攻擊者看不出地址關聯性,但並不能保證傳送者與接收者之間的匿名性。因此門羅幣提出了一個環簽名的方案——事實上,在古代就已經有類似的思想了:如圖5所示,聯名上書的時候,上書人的名字可以寫成一個環形,由於環中各個名字的地位看上去彼此相等,因此外界很難猜測發起人是誰。
圖5:古代聯名上書時利用環狀簽名來保護髮起人資訊[6]
那在門羅幣中環簽名又是如何實現的呢?如圖6所示,每當傳送者要建立一筆交易的時候,他會使用自己的私鑰加上從其他使用者的公鑰中隨機選出的若干公鑰來對交易進行簽名。驗證簽名的時候,也需要使用其他人的公鑰 以及簽名中的引數。同時,傳送者簽名的同時還要提供鑰匙映像(key image)來提供身份的證明。私鑰和鑰匙映像都是一次一密的,來保證不可追蹤性(untracability)。
圖6:環狀簽名可以隱藏交易發起人的資訊
除了交易地址,交易金額也會暴露部分隱私。門羅幣還提供了一種叫做環狀保密交易(RingCT)的技術來同時隱藏交易地址以及交易金額。這項技術正在逐步部署來達到真正的匿名。這項技術採用了多層連線自發匿名組簽名(Multi-layered Linkable Spontaneous Anonymous Group signature)的協議。限於篇幅,感興趣的讀者可以參考原論文[7]。
門羅幣目前的市值超過一億美元,排名第5;單價為8.21美元,排名第6。
零鈔(Zcash)
門羅幣的方案看似已經接近完美,但依然存在一個可能的問題:環簽名中依舊需要與其他使用者的公鑰進行混合,因此可能會遭遇惡意使用者從而暴露隱私。零鈔利用零知識證明避免了這個問題,讓使用者只是透過和加密貨幣本身進行互動來隱藏交易資訊,做到了“所有貨幣生來平等”[8]。
首先給大家簡要介紹一下什麼是零知識證明(zero knowledge proof)。如圖7的左圖所示,北分支和南分支中間有一扇門,老王宣稱自己能開啟這扇門,如何在不給大家看開門細節的情況下讓大家相信這件事呢?假設我們採用互動式的零知識證明,那麼老王可以自己選擇一個分支進入,如圖中藍色點(哪個分支可以不讓驗證者知道)。然後驗證者(圖中紅色點)隨機指定老王從哪個分支出來。如果老王打不開門,那麼老王只有二分之一的機率達到要求。N次重複這個過程,如果老王不能開啟門,那麼老王N次都能從指定分支出來的機率為 (1/2) ^N。因此足夠次數下,如果老王都能完成任務,可以認為老王能開啟門。這樣帶來的一個問題就是互動成本太高。一個改進的方案是圖7的右圖,假設這兒有100條路,如果驗證者隨機指定100條路中的一條,老王能從該分支出現,那麼老王不能開門的機率為1/100。這顯著提高了互動的效率。
圖7:零知識證明的一個簡單例子。左圖代表互動式證明,右圖代表非互動式證明
在零鈔的設計中,就採用了一種叫做zk-SNARK的非互動式的零知識證明。在這裡我們並不深入zk-SNARK的細節,只是大致描述一下零鈔中是如何使用這項技術的。首先我們看一個最簡單的情形,假設零鈔中的幣值都是確定的,例如1BTC。那麼鑄幣過程相當於是使用者向某個託管池(escrow pool)注入1BTC,然後向一個列表中寫入一個承諾(commitment) 。其中承諾必須由一個序列號以及使用者私鑰才能計算得到,並且是單向的。當使用者想要花這個幣的時候,需要做兩件事:(1)給出序列號,以及 (2)利用zk-SNARK證明自己知道生成這個承諾的使用者私鑰。這樣,使用者就可以在完全不暴露身份的情況下,花出這個幣。並且序列號的唯一性可以保證沒有雙花的情況。
以上的簡單情形有三個問題:(1)幣值固定很不方便, (2)傳送方可以透過序列號來判斷接收方正在花錢,(3)接收方必須馬上花掉得到的幣否則可能被髮送方提取。為了解決這三個問題,零鈔中提出了一種澆鑄(pour)的操作來花銷錢幣。簡單地講,澆鑄操作就是透過一系列零知識證明,將一個幣鑄造成多個幣,且輸入輸出的總和相等。每個新幣都有自己的金鑰、數額、序列號等等,從而解決了以上三個問題。與此同時,零鈔還採用了一系列的最佳化措施來提高整個執行系統的效能。
零鈔在現目前所有的密碼學貨幣中是匿名性最好的,因此受到過市場狂熱的追捧,在2016年10月底發行前後,單幣價格估值曾高達幾千個比特幣。現目前幣值穩定後,零鈔的市值大約為800萬美元。單幣價格為62美元,僅次於比特幣。
小結
區塊鏈技術中的隱私問題一直以來都是飽受詬病的,一方面普通使用者在區塊鏈上的交易隱私應該得到保護,另一方面又應該防止惡意使用者將其用作非法交易的平臺。現目前的匿名化技術也還不能完美地保證匿名,比如像零鈔,也必須依賴於初始化時的一些秘密引數(掌握在幾個人手中)。這也會給使用者帶來交易與隱私上的風險。除了交易隱私,諸如以太坊等區塊鏈技術中的智慧合約隱私也是一個很值得關注的問題,目前也已經有一些工作開展起來。希望在不久的將來,區塊鏈能做到在保證隱私的同時,為數字世界提供一個公開可信的技術支撐。
作者:張憲 閆鶯 陳洋
參考文獻
[1] Arvind Narayanan, et al. “Bitcoin and Cryptocurrency Technologies: A Comprehensive Introduction”,2016
[2] Meiklejohn, Sarah, et al. "A fistful of bitcoins: characterizing payments among men with no names." Proceedings of the 2013 conference on Internet measurement conference. ACM, 2013.
[3] https://github.com/dashpay/dash/wiki/
Whitepaper
[4] https://coinmarketcap.com/
[5] https://getmonero.org/home
[6] http://www.nihonkoenmura.jp/theme3/
takarabito07.htm
[7] Noether, Shen. "Ring signature confidential transactions for monero."
[8] https://z.cash/