鄧智洪 劉金旺
(湖南科技大學(xué) 數(shù)學(xué)與計(jì)算科學(xué)學(xué)院,湖南 湘潭425199)
區(qū)塊鏈最初是為比特幣[1]所設(shè)計(jì)的,是一種分布式數(shù)據(jù)結(jié)構(gòu),用于記錄節(jié)點(diǎn)維護(hù)的交易,無(wú)需中央授權(quán)。在區(qū)塊鏈中,所有節(jié)點(diǎn)在共享狀態(tài)上達(dá)成一致意見(jiàn),這是一個(gè)由非受信任的參與者組成的大型網(wǎng)絡(luò)。區(qū)塊鏈含有不同于普通賬本的獨(dú)特特性,如透明性、可追溯、容錯(cuò)性和去中心化。比特幣是公有鏈網(wǎng)絡(luò),而聯(lián)盟鏈網(wǎng)絡(luò)則包含一組已識(shí)別的節(jié)點(diǎn),因此被許多系統(tǒng)用于在許可的環(huán)境中部署各種分布式應(yīng)用,超級(jí)賬本(Fabric)[1]便是聯(lián)盟鏈技術(shù)中的佼佼者。在傳統(tǒng)的聯(lián)盟鏈業(yè)務(wù)流程中,有一些方法是用來(lái)保護(hù)隱私的,如安全多方計(jì)算[2]和隨機(jī)訪問(wèn)控制。然而,這些被動(dòng)的隱私保護(hù)方法并不能完全解決基于交易信息共享的隱私保護(hù)問(wèn)題。本文將探究超級(jí)賬本的幾種隱私保護(hù)機(jī)制的設(shè)計(jì)細(xì)節(jié)與作用。
Fabric采用執(zhí)行-排序-驗(yàn)證的三階段的架構(gòu)來(lái)完成一筆交易,這種設(shè)計(jì)相比較于其它的聯(lián)盟鏈系統(tǒng)根本的區(qū)別是先執(zhí)行事務(wù),再進(jìn)行排序,大大提升了效率。具體的交易流程可分為七步:
步驟1.用戶(hù)通過(guò)Client/SDK把一筆交易提交給背書(shū)節(jié)點(diǎn)。
步驟2.背書(shū)節(jié)點(diǎn)模擬執(zhí)行這筆交易,生成狀態(tài)數(shù)據(jù)讀寫(xiě)集,并對(duì)其進(jìn)行簽名,因此此過(guò)程并不會(huì)更新peer的賬本信息。
步驟3.背書(shū)節(jié)點(diǎn)將簽名后的讀寫(xiě)集返回給Client/SDK。
步驟4.Client/SDK接受背書(shū)信息后將內(nèi)容返回給Orderer排序節(jié)點(diǎn),Orderer節(jié)點(diǎn)會(huì)對(duì)一段時(shí)間內(nèi)接受到的所有交易信息進(jìn)行一個(gè)全排序,并將其打包成塊,此過(guò)程O(píng)rderer節(jié)點(diǎn)只起到對(duì)交易進(jìn)行排序的作用,并不能查看交易的具體內(nèi)容。
步驟5.Orderer排序節(jié)點(diǎn)通過(guò)Deliver接口將打包成塊的信息發(fā)送給記賬節(jié)點(diǎn)。
步驟6.記賬節(jié)點(diǎn)對(duì)從Orderer節(jié)點(diǎn)接收到的信息進(jìn)行驗(yàn)證,驗(yàn)證的內(nèi)容包括背書(shū)節(jié)點(diǎn)對(duì)每筆交易的簽名是否正確、背書(shū)策略是否正確、讀寫(xiě)集的版本號(hào)是否正確等,若滿(mǎn)足要求則將數(shù)據(jù)寫(xiě)入賬本。
栽培果樹(shù)的總目標(biāo)是要實(shí)現(xiàn)速生、早產(chǎn)、豐產(chǎn)、穩(wěn)產(chǎn)、優(yōu)質(zhì)、壽命長(zhǎng)和效益高。而實(shí)現(xiàn)這些目標(biāo),必須緊緊抓住5個(gè)環(huán)節(jié):①良種是前提,是豐產(chǎn)優(yōu)質(zhì)的內(nèi)因;②立地是基礎(chǔ)條件,劣質(zhì)荒脊地、低洼易澇地勿用;③防治病蟲(chóng)是“治安保衛(wèi)”“質(zhì)量監(jiān)督”,防患于未然;④整形修剪是“樹(shù)冠組織”工作,有利于達(dá)到早產(chǎn)、高產(chǎn)、穩(wěn)產(chǎn)的目的;⑤肥水是“后勤供給”工作,足則豐產(chǎn)穩(wěn)產(chǎn),缺則欠而不穩(wěn)。五環(huán)缺一不可,這就是總則。
步驟7.記賬節(jié)點(diǎn)給Client/SDK發(fā)送一個(gè)event,用于告訴Client/SDK這筆交易已經(jīng)寫(xiě)入賬本。
通道可理解為Fabric網(wǎng)絡(luò)中分享與維護(hù)同一賬本的節(jié)點(diǎn)集合,F(xiàn)abric網(wǎng)絡(luò)中設(shè)置的通道配置有訪問(wèn)策略,該策略控制對(duì)通道資源(鏈碼,事務(wù)和分類(lèi)賬狀態(tài))的訪問(wèn),從而僅在通道中的節(jié)點(diǎn)內(nèi)保留信息的隱私和機(jī)密性。各自通道內(nèi)的組織維護(hù)各自的賬本數(shù)據(jù),不同通道間的組織生成不同的賬本,確保通道內(nèi)成員之間形成一個(gè)專(zhuān)門(mén)的密閉網(wǎng)絡(luò),實(shí)現(xiàn)跨通道的組織間數(shù)據(jù)互不查閱,互不相關(guān)。因此,具有大量交易的雙邊業(yè)務(wù)關(guān)系可以通過(guò)通道滿(mǎn)足其隱私要求。
為實(shí)現(xiàn)同一通道內(nèi)組織間更細(xì)粒度的隱私保護(hù),F(xiàn)abric設(shè)置了私有數(shù)據(jù)機(jī)制,它基于策略創(chuàng)建私有數(shù)據(jù)集合,從而定義同一通道中具有權(quán)限的組織才可以訪問(wèn)私有數(shù)據(jù),而通道內(nèi)的其余組織只知道發(fā)生了這樣一筆交易,并不具備查看和操作私有數(shù)據(jù)的權(quán)限,因此并不知道此交易的具體內(nèi)容。
私有數(shù)據(jù)集合包括兩個(gè)部分。第一,私有數(shù)據(jù)實(shí)體:在具有權(quán)限的節(jié)點(diǎn)之間通過(guò)Gossip協(xié)議傳輸數(shù)據(jù),并且存儲(chǔ)在這些節(jié)點(diǎn)的私有狀態(tài)數(shù)據(jù)庫(kù)中,可通過(guò)鏈碼API進(jìn)行訪問(wèn)。第二,私有數(shù)據(jù)的哈希值:這部分?jǐn)?shù)據(jù)用于背書(shū)和排序時(shí)調(diào)用,最后存儲(chǔ)到通道內(nèi)每一個(gè)peer節(jié)點(diǎn)的賬本數(shù)據(jù)庫(kù)中,哈希值用于驗(yàn)證私有數(shù)據(jù)的正確性和完整性。
比較普通數(shù)據(jù)的傳輸流程,私有數(shù)據(jù)在通道內(nèi)的傳輸流程也可分為七步,流程圖如圖1所示。
圖1 私有數(shù)據(jù)傳輸流程
步驟1.Client/SDK端調(diào)用鏈碼功能(讀或?qū)懰接袛?shù)據(jù))的提案來(lái)發(fā)送一份帶有隱私數(shù)據(jù)的交易給具有該私有數(shù)據(jù)集合操作權(quán)限的背書(shū)節(jié)點(diǎn)。
步驟2.背書(shū)節(jié)點(diǎn)模擬執(zhí)行這邊交易,并將私有數(shù)據(jù)存儲(chǔ)在節(jié)點(diǎn)內(nèi)被稱(chēng)為“transient date store”的臨時(shí)數(shù)據(jù)庫(kù)中。
步驟3.背書(shū)節(jié)點(diǎn)通過(guò)Gossip協(xié)議將交易發(fā)送給其它具有權(quán)限的節(jié)點(diǎn),發(fā)送到滿(mǎn)足要求的節(jié)點(diǎn)后將這些節(jié)點(diǎn)返回的結(jié)果進(jìn)行簽名,最后將所有的背書(shū)響應(yīng)返回給Client/SDK端。背書(shū)響應(yīng)包括已背書(shū)的讀寫(xiě)集,需要強(qiáng)調(diào)的是該讀寫(xiě)集不帶有私有數(shù)據(jù),而是key-value格式的私有數(shù)據(jù)哈希值,因此Client/SDK是不能查看到私有數(shù)據(jù)的。
步驟4.Client/SDK端提交交易(帶有私有數(shù)據(jù)哈希值的提交響應(yīng))給Ordering-Service排序節(jié)點(diǎn),私有數(shù)據(jù)哈希值將同正常交易一樣被排序節(jié)點(diǎn)打包進(jìn)區(qū)塊,最后排序節(jié)點(diǎn)將帶有私有數(shù)據(jù)哈希值的區(qū)塊發(fā)送給所有的記賬節(jié)點(diǎn)。
步驟5.具有操作私有數(shù)據(jù)權(quán)限的記賬節(jié)點(diǎn)會(huì)通過(guò)驗(yàn)證區(qū)塊中私有數(shù)據(jù)哈希值與臨時(shí)存儲(chǔ)數(shù)據(jù)庫(kù)中該私有數(shù)據(jù)計(jì)算后的哈希值是否一致,從而來(lái)確保私有數(shù)據(jù)的正確性和完整性。
步驟6.當(dāng)驗(yàn)證私有數(shù)據(jù)沒(méi)有問(wèn)題后具有權(quán)限的節(jié)點(diǎn)將把私有數(shù)據(jù)從臨時(shí)存儲(chǔ)數(shù)據(jù)庫(kù)中移動(dòng)到私有數(shù)據(jù)庫(kù)和私有讀寫(xiě)副本中,并刪除臨時(shí)存儲(chǔ)數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
步驟7.通知Client/SDK端已完成交易。
當(dāng)擁有私有數(shù)據(jù)的集合內(nèi)的成員需要與其它組織共享私有數(shù)據(jù)時(shí),例如當(dāng)集合內(nèi)的成員有爭(zhēng)議或者他們想將資產(chǎn)轉(zhuǎn)移給第三方時(shí),第三方可以計(jì)算私有數(shù)據(jù)的哈希值,并檢查哈希值是否與賬本上的哈希值一致,從而證明交易的存在。
對(duì)于非常私密的數(shù)據(jù),共享數(shù)據(jù)的組織也可以出于策略原因強(qiáng)烈要求刪除存儲(chǔ)數(shù)據(jù),只保留數(shù)據(jù)的散列值作為事務(wù)不能被篡改的證據(jù)。為了支持后續(xù)事務(wù),一旦將一定數(shù)量的后續(xù)區(qū)塊添加到私有數(shù)據(jù)庫(kù)中,就可以清除以前的私有數(shù)據(jù)。
3.3.1 身份混淆器
身份混淆器是一種基于X.509和加密算法的密碼協(xié)議套件,保留隱私且實(shí)現(xiàn)匿名性,交易時(shí)不用透露交易者的身份,其底層核心便是零知識(shí)證明[2]。身份混淆器(如圖2)涉及到用戶(hù)、發(fā)行者和驗(yàn)證者這三方。發(fā)行者通過(guò)發(fā)布數(shù)字證書(shū)去證明用戶(hù)的屬性是可信的,用戶(hù)隨后生成擁有該證書(shū)的“零知識(shí)證明”,并且選擇性的公開(kāi)自己的部分屬性,驗(yàn)證者則可進(jìn)行有效驗(yàn)證。由于該證明是零知識(shí)的,因此用戶(hù)并不會(huì)向發(fā)布者和驗(yàn)證者以及其他組織透露任何隱藏的信息。
圖2 身份混淆機(jī)制
3.3.2 身份混淆器應(yīng)用于超級(jí)賬本
身份混淆器應(yīng)用于超級(jí)賬本其三方替換為Fabric-CA、Fabric-SMP和Fabric-SDK。Fabric-SDK為用戶(hù)提供相應(yīng)的API,F(xiàn)abric-CA作為身份的發(fā)行者,驗(yàn)證者則需要滿(mǎn)足Fabric中的身份混淆器的MSP身份。步驟如下:
步驟1.設(shè)置:生成由Fabric-CA簽名的秘鑰對(duì),并且公鑰可被區(qū)塊鏈參與方使用。
步驟2.發(fā)行:peer或client端會(huì)生成一個(gè)密鑰,并創(chuàng)建對(duì)注冊(cè)證書(shū)(ECert)的請(qǐng)求。Fabric-CA以身份混淆器憑證的形式頒發(fā)ECert,ECert包含了成員擁有的屬性。ECert與對(duì)應(yīng)的憑證密鑰一起存儲(chǔ)在peer或由client/SDK存儲(chǔ)。
步驟3.簽署交易:當(dāng)peer或client端需要簽署交易時(shí),它會(huì)生成新的不可鏈接的token,該token包括簽署交易內(nèi)容、證明擁有由CA頒發(fā)的有效證書(shū)和公開(kāi)事務(wù)的訪問(wèn)控制策略所需的屬性。
步驟4.驗(yàn)證交易:使用Fabric-CA的公鑰驗(yàn)證token。
Fabric利用基于零知識(shí)證明技術(shù)的身份混淆器為客戶(hù)的交易提供匿名身份驗(yàn)證,從而實(shí)現(xiàn)身份的混淆,確保用戶(hù)信息的保密。
從最開(kāi)始作為數(shù)字加密貨幣比特幣的底層技術(shù),到現(xiàn)在應(yīng)用于金融、溯源、物聯(lián)網(wǎng)、共享經(jīng)濟(jì)等諸多領(lǐng)域的超級(jí)賬本,區(qū)塊鏈的更新迭代的速度是如此之快。本文基于一種著名的區(qū)塊鏈聯(lián)盟鏈技術(shù)超級(jí)賬本,提出其具備的隱私保護(hù)機(jī)制,并探究它們各自的設(shè)計(jì)細(xì)節(jié)與作用。當(dāng)面向更多的應(yīng)用場(chǎng)景時(shí),這些機(jī)制還存在操作復(fù)雜和效率低等問(wèn)題,希望在未來(lái)得到更好的解決。