鄧智洪 劉金旺
(湖南科技大學(xué) 數(shù)學(xué)與計算科學(xué)學(xué)院,湖南 湘潭425199)
區(qū)塊鏈最初是為比特幣[1]所設(shè)計的,是一種分布式數(shù)據(jù)結(jié)構(gòu),用于記錄節(jié)點維護的交易,無需中央授權(quán)。在區(qū)塊鏈中,所有節(jié)點在共享狀態(tài)上達成一致意見,這是一個由非受信任的參與者組成的大型網(wǎng)絡(luò)。區(qū)塊鏈含有不同于普通賬本的獨特特性,如透明性、可追溯、容錯性和去中心化。比特幣是公有鏈網(wǎng)絡(luò),而聯(lián)盟鏈網(wǎng)絡(luò)則包含一組已識別的節(jié)點,因此被許多系統(tǒng)用于在許可的環(huán)境中部署各種分布式應(yīng)用,超級賬本(Fabric)[1]便是聯(lián)盟鏈技術(shù)中的佼佼者。在傳統(tǒng)的聯(lián)盟鏈業(yè)務(wù)流程中,有一些方法是用來保護隱私的,如安全多方計算[2]和隨機訪問控制。然而,這些被動的隱私保護方法并不能完全解決基于交易信息共享的隱私保護問題。本文將探究超級賬本的幾種隱私保護機制的設(shè)計細節(jié)與作用。
Fabric采用執(zhí)行-排序-驗證的三階段的架構(gòu)來完成一筆交易,這種設(shè)計相比較于其它的聯(lián)盟鏈系統(tǒng)根本的區(qū)別是先執(zhí)行事務(wù),再進行排序,大大提升了效率。具體的交易流程可分為七步:
步驟1.用戶通過Client/SDK把一筆交易提交給背書節(jié)點。
步驟2.背書節(jié)點模擬執(zhí)行這筆交易,生成狀態(tài)數(shù)據(jù)讀寫集,并對其進行簽名,因此此過程并不會更新peer的賬本信息。
步驟3.背書節(jié)點將簽名后的讀寫集返回給Client/SDK。
步驟4.Client/SDK接受背書信息后將內(nèi)容返回給Orderer排序節(jié)點,Orderer節(jié)點會對一段時間內(nèi)接受到的所有交易信息進行一個全排序,并將其打包成塊,此過程Orderer節(jié)點只起到對交易進行排序的作用,并不能查看交易的具體內(nèi)容。
步驟5.Orderer排序節(jié)點通過Deliver接口將打包成塊的信息發(fā)送給記賬節(jié)點。
步驟6.記賬節(jié)點對從Orderer節(jié)點接收到的信息進行驗證,驗證的內(nèi)容包括背書節(jié)點對每筆交易的簽名是否正確、背書策略是否正確、讀寫集的版本號是否正確等,若滿足要求則將數(shù)據(jù)寫入賬本。
栽培果樹的總目標是要實現(xiàn)速生、早產(chǎn)、豐產(chǎn)、穩(wěn)產(chǎn)、優(yōu)質(zhì)、壽命長和效益高。而實現(xiàn)這些目標,必須緊緊抓住5個環(huán)節(jié):①良種是前提,是豐產(chǎn)優(yōu)質(zhì)的內(nèi)因;②立地是基礎(chǔ)條件,劣質(zhì)荒脊地、低洼易澇地勿用;③防治病蟲是“治安保衛(wèi)”“質(zhì)量監(jiān)督”,防患于未然;④整形修剪是“樹冠組織”工作,有利于達到早產(chǎn)、高產(chǎn)、穩(wěn)產(chǎn)的目的;⑤肥水是“后勤供給”工作,足則豐產(chǎn)穩(wěn)產(chǎn),缺則欠而不穩(wěn)。五環(huán)缺一不可,這就是總則。
步驟7.記賬節(jié)點給Client/SDK發(fā)送一個event,用于告訴Client/SDK這筆交易已經(jīng)寫入賬本。
通道可理解為Fabric網(wǎng)絡(luò)中分享與維護同一賬本的節(jié)點集合,F(xiàn)abric網(wǎng)絡(luò)中設(shè)置的通道配置有訪問策略,該策略控制對通道資源(鏈碼,事務(wù)和分類賬狀態(tài))的訪問,從而僅在通道中的節(jié)點內(nèi)保留信息的隱私和機密性。各自通道內(nèi)的組織維護各自的賬本數(shù)據(jù),不同通道間的組織生成不同的賬本,確保通道內(nèi)成員之間形成一個專門的密閉網(wǎng)絡(luò),實現(xiàn)跨通道的組織間數(shù)據(jù)互不查閱,互不相關(guān)。因此,具有大量交易的雙邊業(yè)務(wù)關(guān)系可以通過通道滿足其隱私要求。
為實現(xiàn)同一通道內(nèi)組織間更細粒度的隱私保護,F(xiàn)abric設(shè)置了私有數(shù)據(jù)機制,它基于策略創(chuàng)建私有數(shù)據(jù)集合,從而定義同一通道中具有權(quán)限的組織才可以訪問私有數(shù)據(jù),而通道內(nèi)的其余組織只知道發(fā)生了這樣一筆交易,并不具備查看和操作私有數(shù)據(jù)的權(quán)限,因此并不知道此交易的具體內(nèi)容。
私有數(shù)據(jù)集合包括兩個部分。第一,私有數(shù)據(jù)實體:在具有權(quán)限的節(jié)點之間通過Gossip協(xié)議傳輸數(shù)據(jù),并且存儲在這些節(jié)點的私有狀態(tài)數(shù)據(jù)庫中,可通過鏈碼API進行訪問。第二,私有數(shù)據(jù)的哈希值:這部分數(shù)據(jù)用于背書和排序時調(diào)用,最后存儲到通道內(nèi)每一個peer節(jié)點的賬本數(shù)據(jù)庫中,哈希值用于驗證私有數(shù)據(jù)的正確性和完整性。
比較普通數(shù)據(jù)的傳輸流程,私有數(shù)據(jù)在通道內(nèi)的傳輸流程也可分為七步,流程圖如圖1所示。

圖1 私有數(shù)據(jù)傳輸流程
步驟1.Client/SDK端調(diào)用鏈碼功能(讀或?qū)懰接袛?shù)據(jù))的提案來發(fā)送一份帶有隱私數(shù)據(jù)的交易給具有該私有數(shù)據(jù)集合操作權(quán)限的背書節(jié)點。
步驟2.背書節(jié)點模擬執(zhí)行這邊交易,并將私有數(shù)據(jù)存儲在節(jié)點內(nèi)被稱為“transient date store”的臨時數(shù)據(jù)庫中。
步驟3.背書節(jié)點通過Gossip協(xié)議將交易發(fā)送給其它具有權(quán)限的節(jié)點,發(fā)送到滿足要求的節(jié)點后將這些節(jié)點返回的結(jié)果進行簽名,最后將所有的背書響應(yīng)返回給Client/SDK端。背書響應(yīng)包括已背書的讀寫集,需要強調(diào)的是該讀寫集不帶有私有數(shù)據(jù),而是key-value格式的私有數(shù)據(jù)哈希值,因此Client/SDK是不能查看到私有數(shù)據(jù)的。
步驟4.Client/SDK端提交交易(帶有私有數(shù)據(jù)哈希值的提交響應(yīng))給Ordering-Service排序節(jié)點,私有數(shù)據(jù)哈希值將同正常交易一樣被排序節(jié)點打包進區(qū)塊,最后排序節(jié)點將帶有私有數(shù)據(jù)哈希值的區(qū)塊發(fā)送給所有的記賬節(jié)點。
步驟5.具有操作私有數(shù)據(jù)權(quán)限的記賬節(jié)點會通過驗證區(qū)塊中私有數(shù)據(jù)哈希值與臨時存儲數(shù)據(jù)庫中該私有數(shù)據(jù)計算后的哈希值是否一致,從而來確保私有數(shù)據(jù)的正確性和完整性。
步驟6.當驗證私有數(shù)據(jù)沒有問題后具有權(quán)限的節(jié)點將把私有數(shù)據(jù)從臨時存儲數(shù)據(jù)庫中移動到私有數(shù)據(jù)庫和私有讀寫副本中,并刪除臨時存儲數(shù)據(jù)庫中的數(shù)據(jù)。
步驟7.通知Client/SDK端已完成交易。
當擁有私有數(shù)據(jù)的集合內(nèi)的成員需要與其它組織共享私有數(shù)據(jù)時,例如當集合內(nèi)的成員有爭議或者他們想將資產(chǎn)轉(zhuǎn)移給第三方時,第三方可以計算私有數(shù)據(jù)的哈希值,并檢查哈希值是否與賬本上的哈希值一致,從而證明交易的存在。
對于非常私密的數(shù)據(jù),共享數(shù)據(jù)的組織也可以出于策略原因強烈要求刪除存儲數(shù)據(jù),只保留數(shù)據(jù)的散列值作為事務(wù)不能被篡改的證據(jù)。為了支持后續(xù)事務(wù),一旦將一定數(shù)量的后續(xù)區(qū)塊添加到私有數(shù)據(jù)庫中,就可以清除以前的私有數(shù)據(jù)。
3.3.1 身份混淆器
身份混淆器是一種基于X.509和加密算法的密碼協(xié)議套件,保留隱私且實現(xiàn)匿名性,交易時不用透露交易者的身份,其底層核心便是零知識證明[2]。身份混淆器(如圖2)涉及到用戶、發(fā)行者和驗證者這三方。發(fā)行者通過發(fā)布數(shù)字證書去證明用戶的屬性是可信的,用戶隨后生成擁有該證書的“零知識證明”,并且選擇性的公開自己的部分屬性,驗證者則可進行有效驗證。由于該證明是零知識的,因此用戶并不會向發(fā)布者和驗證者以及其他組織透露任何隱藏的信息。

圖2 身份混淆機制
3.3.2 身份混淆器應(yīng)用于超級賬本
身份混淆器應(yīng)用于超級賬本其三方替換為Fabric-CA、Fabric-SMP和Fabric-SDK。Fabric-SDK為用戶提供相應(yīng)的API,F(xiàn)abric-CA作為身份的發(fā)行者,驗證者則需要滿足Fabric中的身份混淆器的MSP身份。步驟如下:
步驟1.設(shè)置:生成由Fabric-CA簽名的秘鑰對,并且公鑰可被區(qū)塊鏈參與方使用。
步驟2.發(fā)行:peer或client端會生成一個密鑰,并創(chuàng)建對注冊證書(ECert)的請求。Fabric-CA以身份混淆器憑證的形式頒發(fā)ECert,ECert包含了成員擁有的屬性。ECert與對應(yīng)的憑證密鑰一起存儲在peer或由client/SDK存儲。
步驟3.簽署交易:當peer或client端需要簽署交易時,它會生成新的不可鏈接的token,該token包括簽署交易內(nèi)容、證明擁有由CA頒發(fā)的有效證書和公開事務(wù)的訪問控制策略所需的屬性。
步驟4.驗證交易:使用Fabric-CA的公鑰驗證token。
Fabric利用基于零知識證明技術(shù)的身份混淆器為客戶的交易提供匿名身份驗證,從而實現(xiàn)身份的混淆,確保用戶信息的保密。
從最開始作為數(shù)字加密貨幣比特幣的底層技術(shù),到現(xiàn)在應(yīng)用于金融、溯源、物聯(lián)網(wǎng)、共享經(jīng)濟等諸多領(lǐng)域的超級賬本,區(qū)塊鏈的更新迭代的速度是如此之快。本文基于一種著名的區(qū)塊鏈聯(lián)盟鏈技術(shù)超級賬本,提出其具備的隱私保護機制,并探究它們各自的設(shè)計細節(jié)與作用。當面向更多的應(yīng)用場景時,這些機制還存在操作復(fù)雜和效率低等問題,希望在未來得到更好的解決。