景 旭 邢勝飛
(西北農(nóng)林科技大學(xué)信息工程學(xué)院, 陜西楊凌 712100)
目前,區(qū)塊鏈以其公開透明、去中心化、不可篡改的特性,在銀行、能源、物聯(lián)網(wǎng)、健康、媒體等多個不同領(lǐng)域得到了應(yīng)用[1]。根據(jù)不同的開放程度,區(qū)塊鏈分為公有鏈、私有鏈和聯(lián)盟鏈。公有鏈?zhǔn)且环N完全開放的區(qū)塊鏈,幾乎沒有保護(hù)交易隱私,需要消耗大量的算力維護(hù)分布式賬本[2]。私有鏈?zhǔn)且粋€集中的區(qū)塊鏈,鏈上數(shù)據(jù)的訪問權(quán)限由單個組織控制,主要用于內(nèi)部數(shù)據(jù)管理和特定組織的審計(jì)[3]。聯(lián)盟鏈由多個機(jī)構(gòu)組成的聯(lián)盟構(gòu)成,聯(lián)盟指定的成員進(jìn)行賬本的生成、共識、維護(hù),聯(lián)盟鏈可以完全公開也可以僅有內(nèi)部人員訪問[4]。相比于公有鏈存在資源浪費(fèi)、效率低下以及私有鏈存在中心化程度高的問題,聯(lián)盟鏈具有易擴(kuò)大規(guī)模、成本較低、吞吐量較高的優(yōu)勢[5],尤其是被廣泛應(yīng)用于供應(yīng)鏈溯源領(lǐng)域。國內(nèi)外學(xué)者已經(jīng)從信息存儲與查詢[6]、隱私加密[7]、共識算法[8]、多鏈[9]、身份認(rèn)證[10]、智能合約[11]等技術(shù)應(yīng)用層面探討了聯(lián)盟鏈為供應(yīng)鏈溯源帶來的優(yōu)勢。文獻(xiàn)[12-15]都涉及到將供應(yīng)鏈環(huán)節(jié)數(shù)據(jù)存儲到聯(lián)盟鏈上,保證溯源信息的安全性、完整性,但是沒有深入探討溯源系統(tǒng)用戶管理,增加了監(jiān)管追責(zé)的難度,同時給數(shù)據(jù)的隱私性帶來了巨大的挑戰(zhàn)。訪問控制技術(shù)是保障數(shù)據(jù)安全和隱私最常用的方法之一,能夠很好地處理主體人員、客體數(shù)據(jù)以及業(yè)務(wù)流程之間的關(guān)系,因此研究聯(lián)盟鏈應(yīng)用的訪問控制對于推動聯(lián)盟鏈的推廣和應(yīng)用具有重要意義。
作為訪問控制的重要模型之一,由于能滿足聯(lián)盟鏈環(huán)境中細(xì)粒度訪問控制的需求,基于屬性的訪問控制(Attribute-based access control, ABAC)被廣泛應(yīng)用。ABAC將主體和客體的屬性作為基本的決策要素,靈活利用請求者所具有的屬性集合決定是否賦予其訪問權(quán)限,能夠很好地將策略管理和權(quán)限判定相分離[16]。文獻(xiàn)[17-23]以ABAC為基礎(chǔ),將屬性信息以及訪問控制策略以事務(wù)的方式存儲到聯(lián)盟鏈上;當(dāng)主體發(fā)出訪問請求時,聯(lián)盟鏈記賬節(jié)點(diǎn)執(zhí)行查詢處理,將權(quán)限相關(guān)信息返回到策略決策點(diǎn);策略決策點(diǎn)決定是否允許主體執(zhí)行操作。訪問控制過程順利執(zhí)行的前提是聯(lián)盟鏈環(huán)境真實(shí)可信。聯(lián)盟鏈的準(zhǔn)入機(jī)制表明節(jié)點(diǎn)的加入與退出需要滿足一定的條件并得到許可,但是并不能保證節(jié)點(diǎn)行為的可信性。聯(lián)盟鏈除了要面對由網(wǎng)絡(luò)中斷、機(jī)器宕機(jī)以及分布式拒絕服務(wù)攻擊等因素造成節(jié)點(diǎn)失效的崩潰故障外,還可能存在惡意節(jié)點(diǎn)篡改數(shù)據(jù)、發(fā)送錯誤數(shù)據(jù)以及故意拒絕響應(yīng)請求等拜占庭故障。拜占庭故障的常見原因是敵對影響,例如惡意軟件注入和物理設(shè)備捕獲[24]。發(fā)生拜占庭故障的節(jié)點(diǎn)稱為拜占庭節(jié)點(diǎn)。相比崩潰故障,拜占庭故障更為嚴(yán)重。拜占庭節(jié)點(diǎn)可以將偽造的屬性信息以及訪問控制策略發(fā)送到策略決策點(diǎn),導(dǎo)致策略決策點(diǎn)無法獲取到真實(shí)的數(shù)據(jù)而做出錯誤的決策,影響用戶訪問授權(quán)操作。
實(shí)用拜占庭容錯算法(Practical Byzantine fault tolerance, PBFT)是一種確保分布式系統(tǒng)與拜占庭故障節(jié)點(diǎn)一致性的通用解決方案[25],將傳統(tǒng)拜占庭容錯算法的時間復(fù)雜度從指數(shù)級降低到多項(xiàng)式級[26]。針對拜占庭節(jié)點(diǎn)的惡意行為,當(dāng)系統(tǒng)中拜占庭節(jié)點(diǎn)的數(shù)量不超過節(jié)點(diǎn)總數(shù)1/3的前提條件下,利用PBFT解決此類問題有可行性。
本文以ABAC為基礎(chǔ),面向獼猴桃溯源,提出一種基于PBFT的獼猴桃溯源聯(lián)盟鏈應(yīng)用訪問控制方案。訪問控制策略和屬性信息以交易的方式存儲在聯(lián)盟鏈上,確保權(quán)限的公開透明;用戶發(fā)起訪問請求后,基于PBFT對存儲在鏈上的訪問控制策略以及屬性信息進(jìn)行查詢驗(yàn)證,確保查詢結(jié)果的真實(shí)可信。以期提升獼猴桃溯源聯(lián)盟鏈應(yīng)用的容錯率和可用性,推動聯(lián)盟鏈在農(nóng)產(chǎn)品溯源的廣泛應(yīng)用。
獼猴桃產(chǎn)業(yè)鏈各環(huán)節(jié)參與的企業(yè)主體眾多,一般包括農(nóng)資電商、生產(chǎn)合作社、加工企業(yè)、電商平臺等組織。農(nóng)資電商主要業(yè)務(wù)包括向農(nóng)資生產(chǎn)商采購農(nóng)資、存儲、銷售等。生產(chǎn)合作社主要的業(yè)務(wù)包括向農(nóng)資電商采購農(nóng)資、種植、打藥、施肥、采摘、質(zhì)檢、存儲、銷售等。加工企業(yè)主要業(yè)務(wù)包括向生產(chǎn)合作社采購獼猴桃、加工、存儲、銷售等。電商平臺主要業(yè)務(wù)包括向加工企業(yè)采購獼猴桃成品、存儲以及銷售等。除此之外,監(jiān)管機(jī)構(gòu)監(jiān)察產(chǎn)業(yè)鏈的所有環(huán)節(jié),保證獼猴桃產(chǎn)品的質(zhì)量安全。各個組織相互獨(dú)立、相互合作,構(gòu)成聯(lián)盟鏈中的聯(lián)盟單位。組織間的數(shù)據(jù)共享通過聯(lián)盟鏈實(shí)現(xiàn)。每個組織由多個部門組成,分別承擔(dān)不同的業(yè)務(wù)。各部門分工明確,部門人員各司其職,保證獼猴桃產(chǎn)業(yè)鏈的生產(chǎn)有序。
聯(lián)盟鏈的準(zhǔn)入機(jī)制確保參與的多方實(shí)體存在一定的信任前提和利益約束,任何用戶只有獲取到聯(lián)盟鏈證書頒發(fā)機(jī)構(gòu)(Certificate authority, CA)頒發(fā)的公鑰證書(Public key certificate, PKC)才具有與聯(lián)盟鏈交互的權(quán)限[27]。以Hyperledger Fabric為例,該架構(gòu)為客戶端提供了2種角色,分別是普通用戶和管理員,普通用戶一般發(fā)起與應(yīng)用有關(guān)的業(yè)務(wù)交易,管理員則發(fā)起與系統(tǒng)相關(guān)的配置交易[28]。聯(lián)盟鏈提供的身份認(rèn)證技術(shù)無法完全滿足獼猴桃溯源場景中的復(fù)雜需求。
屬性證書(Attribute certificate, AC)由屬性權(quán)威(Attribute authority, AA)頒發(fā),是一個包含序列號、發(fā)行人、持有人、有效期、屬性信息以及屬性權(quán)威數(shù)字簽名等的證書文件[29]。它主要用于用戶的權(quán)限管理,與PKC相關(guān)聯(lián),但認(rèn)證方式、生存期不同[30],生命周期比較短。因此,本文利用AC輕量、靈活、可驗(yàn)證的特點(diǎn),存儲與權(quán)限相關(guān)的用戶屬性,確保屬性信息的真實(shí)、有效。權(quán)限更新時不會產(chǎn)生大量的證書撤銷列表(Cerificate revocation list, CRL),減輕了證書管理的負(fù)擔(dān)。獼猴桃溯源聯(lián)盟鏈應(yīng)用架構(gòu)如圖1所示。
圖1 獼猴桃溯源聯(lián)盟鏈應(yīng)用架構(gòu)Fig.1 Kiwifruit traceability consortium blockchain application architecture
在圖1中,農(nóng)資電商、生產(chǎn)合作社、加工企業(yè)、電商平臺、監(jiān)管機(jī)構(gòu)等組織作為實(shí)體節(jié)點(diǎn)加入聯(lián)盟鏈網(wǎng)絡(luò)。組織內(nèi)涉及到的用戶如下:
(1)數(shù)據(jù)生產(chǎn)者:管理獼猴桃產(chǎn)業(yè)鏈各個環(huán)節(jié)的鏈上鏈下業(yè)務(wù)數(shù)據(jù),實(shí)現(xiàn)上下游企業(yè)間的數(shù)據(jù)流通。
(2)監(jiān)管人員:監(jiān)督獼猴桃產(chǎn)業(yè)鏈各個生產(chǎn)環(huán)節(jié),對出現(xiàn)質(zhì)量問題的獼猴桃商品溯源與追責(zé)。
(3)管理員:負(fù)責(zé)權(quán)限以及證書管理,根據(jù)實(shí)際需求為數(shù)據(jù)制定相關(guān)訪問控制策略,并發(fā)布到聯(lián)盟鏈上。
(4)消費(fèi)者:獼猴桃產(chǎn)業(yè)鏈的最終服務(wù)對象,可以從聯(lián)盟鏈上查詢獼猴桃商品的部分溯源信息。
獼猴桃溯源聯(lián)盟鏈應(yīng)用中的所有用戶都需要向CA、AA登記注冊PKC以及AC。PKC唯一標(biāo)識用戶在聯(lián)盟鏈網(wǎng)絡(luò)中的身份。AC主要用于權(quán)限管理。用戶訪問系統(tǒng)資源時,需要滿足訪問控制策略。
獼猴桃溯源聯(lián)盟鏈應(yīng)用訪問控制的主要設(shè)計(jì)思想包括:
(1)基于公鑰基礎(chǔ)設(shè)施(Public key infrastructure, PKI)和特權(quán)管理設(shè)施(Privilege management infrastructure, PMI)的證書管理體系。獼猴桃溯源應(yīng)用所使用的聯(lián)盟鏈網(wǎng)絡(luò)以Hyperledger Fabric為底層框架,通過成員服務(wù)提供者(Membership service provider, MSP)管理身份證書,通過PMI中的AC管理權(quán)限。管理流程包括:首先,為農(nóng)資電商、生產(chǎn)合作社、加工企業(yè)、電商平臺、監(jiān)管機(jī)構(gòu)等組織各部署一個peer節(jié)點(diǎn),承擔(dān)本組織記賬節(jié)點(diǎn)角色;其次,為每個組織部署一個CA,負(fù)責(zé)為本組織中的實(shí)體頒發(fā)身份證書;最后,為每個組織部署一個AA,承擔(dān)組織AC頒發(fā)機(jī)構(gòu)以及查詢驗(yàn)證節(jié)點(diǎn)角色。管理員將各組織AA的公鑰存儲到聯(lián)盟鏈上,AA節(jié)點(diǎn)需要從鏈上讀取其它組織AA的公鑰,形成節(jié)點(diǎn)索引表保存在本地。用戶都向本組織AA節(jié)點(diǎn)申請AC,并存儲到聯(lián)盟鏈上,以便于其它組織AA驗(yàn)證。AA節(jié)點(diǎn)向本組織CA申請證書,獲得向記賬節(jié)點(diǎn)查詢數(shù)據(jù)的權(quán)限。用戶發(fā)出訪問請求后,各組織AA在向本組織記賬節(jié)點(diǎn)查詢權(quán)限信息時進(jìn)行可信驗(yàn)證。
(2)基于PBFT的獼猴桃溯源訪問控制方案。組織用戶訪問溯源系統(tǒng)資源時,需要所有AA節(jié)點(diǎn)通過PBFT查詢驗(yàn)證用戶屬性、數(shù)據(jù)屬性、訪問控制策略,確保訪問控制的可信性;將查詢驗(yàn)證結(jié)果作為執(zhí)行用戶請求的判定標(biāo)準(zhǔn);驗(yàn)證結(jié)果中有超過節(jié)點(diǎn)總數(shù)2/3的節(jié)點(diǎn)允許用戶執(zhí)行操作,則命令系統(tǒng)執(zhí)行該請求;否則,系統(tǒng)拒絕執(zhí)行用戶請求。
在基于PBFT的獼猴桃溯源聯(lián)盟鏈應(yīng)用中,基于聯(lián)盟鏈中的PKC作為用戶身份憑證,以ABAC為基礎(chǔ),引入AC管理用戶權(quán)限,基于PBFT提高訪問控制過程的容錯率,實(shí)現(xiàn)獼猴桃溯源的訪問控制方案。實(shí)現(xiàn)該方案的智能合約主要包括身份證書管理合約(Public key certificate management contract, PKCMC)、屬性證書管理合約(Attribute certificate management contract, ACMC)、訪問控制策略管理合約(Access control policy management contract, ACPMC)、數(shù)據(jù)屬性管理合約(Date attribute management contract, DAMC)、訪問控制合約(Access control policy, ACC)等。訪問控制分層模型如圖2所示。
圖2 訪問控制分層模型Fig.2 Access control hierarchical model
在圖2中,模型從上至下分別為應(yīng)用層、服務(wù)層、數(shù)據(jù)層,具體內(nèi)容為:
(1)應(yīng)用層:主要為獼猴桃溯源聯(lián)盟鏈應(yīng)用中的各類用戶提供相應(yīng)功能。
(2)服務(wù)層:是訪問控制模型的核心層,提供聯(lián)盟鏈服務(wù)以及聯(lián)盟鏈可信查詢服務(wù),主要由網(wǎng)絡(luò)服務(wù)、智能合約以及認(rèn)證服務(wù)3部分組成。①網(wǎng)絡(luò)服務(wù):提供了P2P網(wǎng)絡(luò)、共識機(jī)制、創(chuàng)建區(qū)塊等服務(wù)。
通過聯(lián)盟鏈網(wǎng)絡(luò)將用戶AC、數(shù)據(jù)、訪問控制策略等發(fā)送到各節(jié)點(diǎn);數(shù)據(jù)經(jīng)過共識機(jī)制共識驗(yàn)證后,以交易的形式發(fā)布到聯(lián)盟鏈上,保證各節(jié)點(diǎn)間數(shù)據(jù)的一致性。②智能合約:通過部署智能合約來實(shí)現(xiàn)邏輯功能,是實(shí)現(xiàn)溯源系統(tǒng)訪問控制的工具。PKCMC用來頒發(fā)和管理用戶的身份證書。ACMC用來頒發(fā)和管理用戶的屬性證書。ACPMC用來存儲和管理訪問控制策略。DAMC用來存儲和管理數(shù)據(jù)的屬性。ACC用來響應(yīng)用戶對數(shù)據(jù)的訪問請求。③認(rèn)證服務(wù):提供確保訪問控制真實(shí)可信的手段。主要包括CA、AA的部署,以及組織AA基于PBFT查詢驗(yàn)證屬性信息、訪問控制策略。
(3)數(shù)據(jù)層:主要提供數(shù)據(jù)存儲服務(wù)。為降低聯(lián)盟鏈的存儲壓力,所有業(yè)務(wù)數(shù)據(jù)存儲在鏈下的數(shù)據(jù)服務(wù)器,鏈上只存儲業(yè)務(wù)數(shù)據(jù)的唯一標(biāo)識以及散列值。訪問控制策略、用戶屬性、AA公鑰等非業(yè)務(wù)數(shù)據(jù)的數(shù)據(jù)量較少,而且數(shù)據(jù)狀態(tài)較穩(wěn)定,所以將原始數(shù)據(jù)直接存儲在聯(lián)盟鏈上。
在獼猴桃溯源聯(lián)盟鏈應(yīng)用訪問控制分層模型中,主要包括證書申請以及訪問控制2個過程。
2.3.1證書申請
獼猴桃產(chǎn)業(yè)鏈各組織用戶都需要申請身份證書作為聯(lián)盟鏈溯源系統(tǒng)的準(zhǔn)入憑證,申請屬性證書存儲個人的權(quán)限信息。證書申請過程如圖3所示。
圖3 證書申請過程Fig.3 Certificate application process
在圖3中,用戶登錄系統(tǒng)后,首先,將身份信息作為PKCMC的參數(shù)向Fabric-CA申請身份證書;其次,將身份證書的唯一標(biāo)識以及其他屬性信息作為ACMC的參數(shù)向AA申請AC;最后,將AC以二進(jìn)制的方式發(fā)布在聯(lián)盟鏈上。組織內(nèi)的管理員根據(jù)實(shí)際需求為數(shù)據(jù)制定相應(yīng)的訪問控制策略,并發(fā)布到聯(lián)盟鏈。
2.3.2訪問控制
用戶訪問系統(tǒng)的任何資源都需要滿足相應(yīng)的訪問控制策略。訪問控制過程如圖4所示。
圖4 訪問控制過程Fig.4 Access control process
在圖4中,AA1、AA2、AA3、AA4、AA5分別表示獼猴桃溯源聯(lián)盟鏈中農(nóng)資電商、生產(chǎn)合作社、加工企業(yè)、電商平臺以及監(jiān)管機(jī)構(gòu)等組織的查詢驗(yàn)證節(jié)點(diǎn)。當(dāng)前視圖的主節(jié)點(diǎn)為AA1,從節(jié)點(diǎn)為AA2、AA3、AA4、AA5。假設(shè)AA5是拜占庭節(jié)點(diǎn),可以在看似正常情況下發(fā)生任意行為,本文用虛線箭頭表示AA5篡改真實(shí)數(shù)據(jù)并向其他節(jié)點(diǎn)發(fā)送錯誤請求消息,即f=1,f表示聯(lián)盟鏈網(wǎng)絡(luò)中拜占庭節(jié)點(diǎn)的數(shù)量。依據(jù)PBFT的共識過程,主要包括request(請求)、pre-prepare(預(yù)準(zhǔn)備)、prepare(準(zhǔn)備)、commit(確認(rèn))和reply(響應(yīng))等5個階段。主要步驟如下:
(1)request:用戶通過與客戶端交互,向AA1節(jié)點(diǎn)發(fā)送請求消息〈REQUEST,t,d,h,c〉,其中,t為時間戳,d為用戶發(fā)送的請求內(nèi)容,h為d的消息摘要,c為用戶的身份信息。
(2)pre-prepare:AA1節(jié)點(diǎn)接收到請求消息后,調(diào)用ACC為d分配一個編號n,開始判決用戶的訪問請求。首先,根據(jù)d中的用戶證書唯一標(biāo)識調(diào)用ACMC查詢存儲在本組織記賬節(jié)點(diǎn)中的用戶AC,根據(jù)d中的數(shù)據(jù)屬性調(diào)用DAMC訪問存儲在數(shù)據(jù)服務(wù)器中的數(shù)據(jù)。其次,根據(jù)c獲取AC對應(yīng)AA的公鑰以驗(yàn)證AC。然后,根據(jù)用戶屬性、數(shù)據(jù)屬性以及d調(diào)用ACPMC查詢存儲在本組織記賬節(jié)點(diǎn)的訪問控制策略,將訪問控制策略、用戶屬性以及數(shù)據(jù)屬性發(fā)送給ACC決策,生成訪問控制結(jié)果。最后,向其它組織AA節(jié)點(diǎn)發(fā)送預(yù)準(zhǔn)備消息〈PRE-PREPARE,v,n,d,h,c,u,o,p,r,i〉,其中,v為當(dāng)前視圖編號,u為用戶屬性,o為數(shù)據(jù)屬性,p為訪問控制策略,r為訪問控制結(jié)果,i為當(dāng)前節(jié)點(diǎn)的編號。
(3)prepare:AA2、AA3、AA4、AA5收到AA1發(fā)送的預(yù)準(zhǔn)備消息后,首先,對d重新生成摘要并與h比對,確保消息的完整性。其次,判決用戶的訪問請求,與AA1的判決過程相同。然后,向其它組織AA節(jié)點(diǎn)發(fā)送準(zhǔn)備消息〈PREPARE,v,n,i,h,u,o,p,r〉。最后,收到來自非AA1的準(zhǔn)備消息后,與AA1的預(yù)準(zhǔn)備消息進(jìn)行對比驗(yàn)證,驗(yàn)證的內(nèi)容有v、n、u、o、p、r、h。當(dāng)有2f+1個來自不同AA節(jié)點(diǎn)的準(zhǔn)備消息與預(yù)準(zhǔn)備消息一致時,進(jìn)入確認(rèn)階段。
(4)commit:組織AA向其它節(jié)點(diǎn)發(fā)送確認(rèn)消息〈COMMIT,v,n,i,S(u,o,p,r)〉,其中,S(u,o,p,r)為本節(jié)點(diǎn)對用戶屬性、數(shù)據(jù)屬性、訪問控制策略以及訪問控制結(jié)果的簽名。收到其它AA節(jié)點(diǎn)的確認(rèn)消息后,通過i查找本地索引表中對應(yīng)節(jié)點(diǎn)的公鑰,驗(yàn)證確認(rèn)消息的簽名和v、n、u、o、p、r。當(dāng)有2f+1個確認(rèn)消息通過驗(yàn)證后,進(jìn)入響應(yīng)階段;否則,可信查詢失敗。
(5)reply:組織AA節(jié)點(diǎn)向客戶端發(fā)送響應(yīng)消息〈REPLY,v,t,c,i,q,u,o〉,其中,q為用戶訪問請求的驗(yàn)證結(jié)果。如果客戶端接收到至少f+1個相同的響應(yīng)消息時,則根據(jù)q決定是否為用戶授權(quán);否則,可信查詢失敗。
訪問控制管理函數(shù)通過將數(shù)學(xué)符號以及實(shí)體符號相結(jié)合來形式化地描述訪問控制流程,能夠準(zhǔn)確地管理訪問控制過程[31],為訪問控制智能合約的設(shè)計(jì)提供了基礎(chǔ)。管理員通過管理函數(shù)對數(shù)據(jù)進(jìn)行有效管理,只有對各類數(shù)據(jù)做到高效和嚴(yán)格的管理,才能發(fā)揮最大的控制效能[32]。在獼猴桃溯源聯(lián)盟鏈應(yīng)用訪問控制方案中,管理函數(shù)主要包括身份證書申請、屬性證書申請、訪問控制策略存儲到聯(lián)盟鏈、訪問授權(quán)等。管理函數(shù)由實(shí)體、屬性以及實(shí)體間關(guān)系組成。
實(shí)體是聯(lián)盟鏈溯源應(yīng)用中實(shí)際參與訪問控制的集合,含義如表1所示。
表1 實(shí)體描述Tab.1 Entity description
屬性指實(shí)體與訪問控制相關(guān)的某些特征的集合。用戶、數(shù)據(jù)、訪問控制策略以及證書都有固有屬性。實(shí)體的屬性表示方法為:實(shí)體.attr,記為(屬性名,運(yùn)算符,屬性值),如s.attr=(ino=20152586)表示用戶的唯一標(biāo)識為20152586。
實(shí)體間的關(guān)系是通過關(guān)系符號將各個實(shí)體集合連接起來,從而實(shí)現(xiàn)對實(shí)體屬性的操作。各實(shí)體之間的關(guān)系如下:
(1)(S,MKC):表示一對一的用戶與身份證書關(guān)系。如(s,pkc)∈(S,MKC)表示用戶擁有組織CA頒發(fā)的身份證書。
(2)(S,MAC):表示一對一的用戶與屬性證書的關(guān)系。如(s,ac)∈(S,MAC)表示用戶擁有組織AA頒發(fā)的AC。
(3)(s.attr,d.attr):表示用戶屬性與數(shù)據(jù)屬性之間的關(guān)聯(lián)關(guān)系。
關(guān)系符號還包括∧、∪、?等?!挠糜谶B接屬性需同時滿足的多個條件表達(dá)式?!扔糜趯蝹€實(shí)體合并到相應(yīng)的實(shí)體集。?用于取實(shí)體集中任何一個實(shí)體的屬性。主要的管理函數(shù)定義如下:
(1)EnrollPKC(s,pkc):為用戶頒發(fā)身份證書,ino唯一標(biāo)識用戶。
條件:s∈S;
s.attr=(ino≠?∧ino≠?si.ino);
操作:MKC=MKC∪pkc, (s,pkc)∈(S,MKC).
(2)EnrollAC(s,ac):為用戶頒發(fā)屬性證書,age、dep、role表示用戶的年齡、部門以及角色等。
條件: (s,pkc)∈(S,MKC);
s.attr=(age,dep,role≠?);
s.attr=(ino≠?∧ino≠?si.ino);
操作:MAC=MAC∪ac, (s,ac)∈(S,MAC).
(3)UploadPolicy(p,P):將訪問控制策略存儲在聯(lián)盟鏈上,on唯一標(biāo)識訪問控制策略,con表示具體的訪問控制策略。
條件:p.attr(con≠?);
p.attr=(no≠?∧no≠?pi.no);
操作:P=P∪p.
(4)ManageDate(r,s):用戶發(fā)出請求r操作數(shù)據(jù)服務(wù)器中的數(shù)據(jù)。verify(ac,pk)表示使用AA的公鑰pk驗(yàn)證用戶ac。query(Arr,p)表示根據(jù)用戶以及數(shù)據(jù)屬性集Arr查詢訪問控制策略。如果滿足訪問控制策略,則訪問數(shù)據(jù)Operation(D)。
條件: (s,pkc)∈(S,MKC);
(s,ac)∈(S,MAC);
操作:s.attr=(ino≠?)=>ac;
s.attr=(age,dep,role≠?) (if verify(ac,pk));
d.attr=(attr1,attr2,…,attrn≠?);
Arr=(s.attr,d.attr);
Operation(D)(if query(Arr,p)).
獼猴桃溯源聯(lián)盟鏈訪問控制方案中主要涉及PKCMC、ACMC、ACPMC、DAMC、ACC等5個智能合約。
(1)PKCMC負(fù)責(zé)對用戶身份證書的頒發(fā)和管理,只有組織管理員有權(quán)執(zhí)行。使用Hyperledger Fabric中CA頒發(fā)的證書作為聯(lián)盟鏈網(wǎng)絡(luò)的準(zhǔn)入憑證。PKCMC主要定義的方法包括PublishPKC()、RevokePKC()、ReenrollPKC(),分別為用戶提供了頒發(fā)、撤銷、重新頒發(fā)身份證書的功能。以PublishPKC()為例,具體算法為:
PublishPKC(pkc.ino,pkc.pw, ca.name)
輸入: (pkc.ino, pkc.pw, ca.name)
輸出: ("Input Error/Register False/Enroll Success/Enroll Fail")
if (pkc.ino != null && pkc.pw != null && ca.name != null)
then flag = Register(pkc.ino, pkc.pw, ca.name)∥如果參數(shù)合法,開始身份證書登記
else return "Input Error"∥返回輸入?yún)?shù)不合法的結(jié)果
end if
if (flag) then flag1 = Enroll(pkc.ino, pkc.pw)∥如果身份證書登記成功,開始身份證書注冊
else return "Register False"∥返回身份證書登記失敗的結(jié)果
end if
if flag1 then reture "Enroll Success"∥如果身份證書注冊成功,返回注冊成功的結(jié)果
else return "Enroll Fail"∥返回身份證書注冊失敗的結(jié)果
end if
算法中,PublishPKC()由證書登記Register()和證書注冊Enroll()兩部分組成。pkc.ino、pkc.pw以及ca.name分別表示申請證書所使用的用戶標(biāo)識、口令、CA名稱。Input Error、Register False、Enroll Success、Enroll Fail是申請身份證書的4種不同結(jié)果,分別表示輸入不合法、登記失敗、注冊成功、注冊失敗。
(2)ACMC負(fù)責(zé)對用戶的AC頒發(fā)和管理,只有組織管理員有權(quán)執(zhí)行。ACMC主要定義的方法包括PublishAC()、RevokeAC()、ReenrollAC()、QueryAC()、ReadAC()、ValidateAC(),分別為用戶提供了頒發(fā)、撤銷、重新頒發(fā)、查詢、讀取以及驗(yàn)證AC的功能。以PublishAC()為例,具體算法為
PublishAC(pkc.sk, pkc.pk, pkc.ino, s.a, aa.name)
輸入: (pkc.sk, pkc.pk, pkc.ino, s.a, aa.name)
輸出: ("MesInput Error/PkcInput Error/Validate Error/Issue Success/Issue Fail")
if (pkc.ino != null && s.a != null && aa.name != null)
then reture R∥如果參數(shù)合法,返回一個隨機(jī)數(shù)
else return "MesInput Error"∥返回屬性信息輸入不合法的結(jié)果
end if
if (pkc.sk != null && pkc.pk != null)∥判斷用戶是否擁有身份證書
then Signature = Sign(R, pkc.sk)∥用戶用私鑰對隨機(jī)數(shù)簽名
else return"PkcInput Error"∥返回公私鑰輸入不合法的結(jié)果
end if
flag = Validate(Signature, pkc.pk)∥屬性權(quán)威驗(yàn)證用戶的簽名
if (flag) then flag1 = Issue(pkc.ino, s.a, aa.name)∥如果驗(yàn)證通過,頒發(fā)屬性證書
else return"Validate Error"∥返回簽名驗(yàn)證失敗的結(jié)果
end if
if flag1 then UploadChain(pkc.ino, AC)∥將屬性證書寫入聯(lián)盟鏈
then reture "Issue Success"∥返回屬性證書簽發(fā)成功的結(jié)果
else return "Issue Fail"∥返回屬性證書簽發(fā)失敗的結(jié)果
end if
算法中,PublishAC()包含用戶身份認(rèn)證和AC頒發(fā)兩個過程。s.a、pkc.sk、pkc.pk分別表示用戶的屬性信息、私鑰、公鑰。R表示AA返回的隨機(jī)數(shù)。aa.name表示AA的名稱。Signature表示用戶對R形成的簽名信息。用戶向AA提交個人屬性信息以及對應(yīng)PKC的標(biāo)識,請求頒發(fā)AC。AA返回一個隨機(jī)數(shù),用戶用私鑰對該隨機(jī)數(shù)簽名,形成簽名信息。AA根據(jù)用戶的公鑰驗(yàn)證簽名,若為真,則通過用戶身份認(rèn)證,AA簽發(fā)AC,并把AC寫入聯(lián)盟鏈。MesInput Error、PkcInput Error、Validate Error、Issue Success、Issue Fail是申請AC的5種不同結(jié)果,分別表示屬性信息輸入不合法、公私鑰輸入不合法、簽名驗(yàn)證失敗、簽發(fā)成功、簽發(fā)失敗。
(3)ACPMC負(fù)責(zé)存儲和管理訪問控制策略,只有組織管理員有權(quán)執(zhí)行。訪問控制策略存儲在聯(lián)盟上,確保權(quán)限的公開透明。ACPMC主要定義的方法包括UploadACP()、DownloadACP(),分別為管理員提供了向聯(lián)盟鏈發(fā)布以及讀取訪問控制策略的功能。以UploadACP()為例,具體算法為
UploadACP(acp)
輸入: (acp)
輸出: ("Input Error/Upload False/Upload Success")
if (acp != null) then acphash = Hash(acp)∥如果參數(shù)合法,將訪問控制策略生成散列值
else return "Input Error"∥返回參數(shù)輸入不合法的結(jié)果
end if
txID = PutState(acphash, acp)∥將訪問控制策略以及散列值存儲到聯(lián)盟鏈
if (txID != null) then return "Upload Success"∥如果交易ID不為空,返回寫入賬本成功的結(jié)果
else return "Upload False"∥返回寫入賬本失敗的結(jié)果
end if
算法中,UploadACP()主要由HyperLedger Fabric SDK提供的PutState()方法實(shí)現(xiàn)。acp表示訪問控制策略,acphash是訪問控制策略的唯一標(biāo)識,經(jīng)過散列函數(shù)生成。Input Error、Upload False、Upload Success是存儲訪問控制策略的3種不同結(jié)果,分別表示輸入不合法、寫入賬本失敗、寫入賬本成功。
(4)DAMC用來存儲和管理業(yè)務(wù)數(shù)據(jù),只有非組織管理員有權(quán)執(zhí)行。業(yè)務(wù)數(shù)據(jù)存儲在鏈下的云服務(wù)器中,聯(lián)盟鏈存儲對應(yīng)的散列值。DAMC主要定義的方法包括UploadDate()、DownloadDate()、AddDate()、UpdateDate()、QueryDate(),分別實(shí)現(xiàn)了業(yè)務(wù)數(shù)據(jù)的鏈上發(fā)布、鏈上查詢、鏈下添加、鏈下更新、鏈下查詢等功能。以DownloadDate()為例,具體算法為
DownloadDate(Dateno)
輸入: (Dateno)
輸出:("Input Error/Download False/Download Success")
if (Dateno != null) then ChainHash = GetState(Dateno) ∥如果參數(shù)合法,從鏈上獲取數(shù)據(jù)散列值
else return "Input Error"∥返回參數(shù)輸入不合法的結(jié)果
end if
Date = QueryDate(Dateno) ∥查詢鏈下數(shù)據(jù)服務(wù)器中的原始數(shù)據(jù)
DateHash = Hash(Date)∥對鏈下原始數(shù)據(jù)生成散列值
if (ChainHash == DateHash) then return "Download Success"
∥如果鏈上散列值與鏈下散列值一致,返回查詢成功的結(jié)果
else return "Download False"∥返回查詢失敗的結(jié)果
end if
算法中,DownloadDate()主要由HyperLedger Fabric SDK提供的GetState()方法實(shí)現(xiàn)。Dateno表示數(shù)據(jù)唯一標(biāo)識,ChainHash是存儲在聯(lián)盟鏈上的數(shù)據(jù)散列值,Date是存儲在云服務(wù)器中的數(shù)據(jù)屬性,DateHash是Date的鏈下散列值。DateHash與ChainHash的對比驗(yàn)證,保證鏈上鏈下數(shù)據(jù)的一致性。Input Error、Download False、Download Success是查詢鏈上業(yè)務(wù)數(shù)據(jù)的3種不同結(jié)果,分別表示輸入不合法、查詢失敗、查詢成功。
(5)ACC用來響應(yīng)用戶對數(shù)據(jù)的訪問請求,組織的任何用戶都有權(quán)執(zhí)行。ACC定義的方法主要是AccessControl(),具體算法為
Grantaccess(Sno, Dateno, AAno)
輸入: ( Sno, Dateno, AAno)
輸出: ("MesInput Error/ResInput Error/ValidateAC Fail/Grant Success/Grant Fail")
if (Sno != null && Dateno != null && AAno != null)
then AC = ACMC.QueryAC(Sno)∥如果參數(shù)合法,從鏈上查詢屬性證書
Date = DAMC.QueryDate(Dateno)∥查詢鏈下數(shù)據(jù)服務(wù)器中的原始數(shù)據(jù)
else return "MesInput Error"∥返回參數(shù)輸入不合法的結(jié)果
end if
if (Date!= null && AC != null)
then AAPK = QueryAAPK(AAno)∥查詢屬性權(quán)威的公鑰
flag =ACMC.ValidateAC(AC, AAPK)∥驗(yàn)證用戶屬性證書
else return "ResInput Error"∥返回屬性證書或者原始數(shù)據(jù)查詢失敗的結(jié)果
end if
if (flag)then SubAttr = ACMC.ReadAC(AC)∥如果屬性證書驗(yàn)證通過,則讀取用戶屬性
else return "ValidateAC Fail"∥返回屬性證書驗(yàn)證失敗的結(jié)果
end if
Result = ACPMC.DownloadACP(SubAttr, ObjAttr)∥查詢鏈上的訪問控制策略
If (Result) then reture "Grant Success"∥如果查詢到相應(yīng)的訪問控制策略,則允許用戶訪問
else return "Grant Fail"∥返回拒絕訪問的結(jié)果
end if
算法中,AccessControl()主要由ACMC.QueryAC()、DAMC.QueryDate、QueryAAPK()、ACMC.ValidateAC()、ACMC.ReadAC()、ACPMC.DownloadACP()等方法組成。ACMC.QueryAC()是智能合約ACMC提供的AC查詢方法,可以查詢用戶存儲在聯(lián)盟鏈上的AC。DAMC.QueryDate是智能合約DAMC提供的原始數(shù)據(jù)查詢方法,可以獲取到存儲在鏈下數(shù)據(jù)服務(wù)器中的原始數(shù)據(jù)。QueryAAPK()提供了在本地索引表中查詢AA公鑰的功能。ACMC.ValidateAC()智能合約ACMC提供的AC驗(yàn)證方法,利用AA公鑰驗(yàn)證AC的合法性以及有效性。ACMC.ReadAC()是智能合約ACMC提供的AC讀取方法,用戶AC驗(yàn)證通過后,解析讀取AC中的屬性信息。ACPMC.DownloadACP()是智能合約ACPMC提供的訪問控制策略查詢方法,可以決策用戶是否有相應(yīng)的權(quán)限。Sno表示主體唯一標(biāo)識,Dateno表示數(shù)據(jù)唯一標(biāo)識,AAno表示AA節(jié)點(diǎn)編號,AAPK表示AA公鑰,SubAttr表示用戶屬性,Date表示數(shù)據(jù)屬性,Result表示訪問控制策略查詢結(jié)果。MesInput Error、ResInput Error、ValidateAC Fail、Grant Success、Grant Fail是判決訪問請求的5種不同結(jié)果,分別表示請求內(nèi)容不合法、AC或者數(shù)據(jù)屬性查詢失敗、AC驗(yàn)證失敗、允許訪問、拒絕訪問。
本文選用農(nóng)資電商、生產(chǎn)合作社、加工企業(yè)、電商平臺等4個組織負(fù)責(zé)獼猴桃溯源“產(chǎn)購儲加銷”全產(chǎn)業(yè)鏈各個環(huán)節(jié)。為使得全鏈條溯源更為全面,將消費(fèi)者權(quán)益組織加入聯(lián)盟鏈網(wǎng)絡(luò),在保護(hù)消費(fèi)者權(quán)益的同時,為消費(fèi)者從組織記賬節(jié)點(diǎn)查詢獼猴桃產(chǎn)品溯源信息提供了便利。以包含5個組織的獼猴桃溯源全產(chǎn)業(yè)鏈為例,評測基于PBFT的獼猴桃溯源聯(lián)盟鏈應(yīng)用訪問控制方案的功能與性能。
(1)聯(lián)盟鏈網(wǎng)絡(luò):選用Hyperledger Fabric 1.4.0搭建聯(lián)盟鏈。Org1.peer0、Org2.peer0、Org3.peer0、Org4.peer0、Org5.peer0等peer節(jié)點(diǎn)充當(dāng)組織記賬節(jié)點(diǎn),獨(dú)立部署1個order節(jié)點(diǎn)和5個CA證書。狀態(tài)數(shù)據(jù)庫采用levelDB。區(qū)塊的最大交易數(shù)為10筆,最大打包時間間隔為2s,最大字節(jié)數(shù)為10MB。
(2)拜占庭共識算法:采用corgi-kx的PBFT算法(https:∥github.com/corgi-kx/blockchain_ consensus_algorithm, 2019-12-1),AA1、AA2、AA3、AA4、AA5充當(dāng)查詢驗(yàn)證節(jié)點(diǎn)。
(3)屬性證書:遵循X.509 v3標(biāo)準(zhǔn),簽名算法選用RSA。
(4)性能測試工具:Hyperledger Caliper。它是一個通用的區(qū)塊鏈性能測試框架,允許用戶使用自定義的用例測試不同的區(qū)塊鏈解決方案,得到一組性能測試結(jié)果。
(5)系統(tǒng)環(huán)境:ubuntu虛擬機(jī)18.04,8 GB內(nèi)存,50 GB存儲磁盤,處理器內(nèi)核總數(shù)為2,帶寬為1 000 Mb/s。
(1)訪問控制策略的數(shù)據(jù)結(jié)構(gòu)
訪問控制策略P={U_age, U_dep, U_role,D_dep, D_tem, D_attr1, D_attr2,…,D_attrn,Operation},其中,U_age、U_dep、U_role分別表示管理員的年齡、所屬部門以及角色;D_dep、D_tem分別表示業(yè)務(wù)數(shù)據(jù)的來源以及類別;D_attr1,…,D_attrn表示業(yè)務(wù)數(shù)據(jù)的屬性;Operation表示訪問能力。
假設(shè)生產(chǎn)合作社某一條訪問控制策略p1={大于25歲,種植部門,業(yè)務(wù)管理員,幼苗培育部門,溫室數(shù)據(jù),日期,查詢},表示年紀(jì)25歲以上的種植部門業(yè)務(wù)管理員有權(quán)查詢某一個時間段的幼苗培育部門中的溫室數(shù)據(jù)。
(2)訪問控制可信決策過程
以生產(chǎn)合作社種植部門的業(yè)務(wù)管理員查詢某一個時間段幼苗培育部門的溫室數(shù)據(jù)為例。溫室數(shù)據(jù)由物聯(lián)網(wǎng)設(shè)備直接寫入鏈下的數(shù)據(jù)庫中,由幼苗培育部門的業(yè)務(wù)管理員存儲到聯(lián)盟鏈。本次查詢是從鏈下的數(shù)據(jù)庫中獲取溫室數(shù)據(jù)并進(jìn)行防偽驗(yàn)證。業(yè)務(wù)管理員唯一標(biāo)識為20152586,用戶屬性集為{大于25歲,種植部門,業(yè)務(wù)管理員},訪問控制策略p1,用戶發(fā)起訪問請求的頁面如圖5所示。
圖5 用戶發(fā)起訪問請求界面Fig.5 User initiated an access request
在圖5中,業(yè)務(wù)管理員選擇數(shù)據(jù)的來源、類別以及時間范圍,即數(shù)據(jù)屬性集為{幼苗培育部門,溫室數(shù)據(jù),2022-03-13 19:10_2022-03-14 21:10},訪問能力為查詢操作。業(yè)務(wù)管理員發(fā)出查詢請求后,系統(tǒng)判決其是否具有相應(yīng)權(quán)限,訪問控制過程的可信決策如圖6所示。
圖6 訪問控制過程的可信決策Fig.6 Trusted decisions for access control processes
從圖6可以看出,當(dāng)種植部門的業(yè)務(wù)管理員發(fā)出訪問控制請求后,聯(lián)盟鏈各組織的的AA節(jié)點(diǎn)基于PBFT對訪問授權(quán)過程可信驗(yàn)證,客戶端依據(jù)可信驗(yàn)證結(jié)果決定業(yè)務(wù)管理員的權(quán)限。訪問控制請求內(nèi)容由管理員唯一標(biāo)識、數(shù)據(jù)類型、數(shù)據(jù)來源、日期、查詢操作構(gòu)成。主節(jié)點(diǎn)AA1收到客戶端發(fā)來的請求消息后,執(zhí)行過程如圖6a所示。從節(jié)點(diǎn)AA2、AA3、AA4、AA5收到AA1發(fā)來的預(yù)準(zhǔn)備消息后,執(zhí)行過程如圖6b~6e所示。各節(jié)點(diǎn)通過訪問請求內(nèi)容獲取到的用戶屬性集為{32歲,種植部門,業(yè)務(wù)管理員},數(shù)據(jù)屬性集為{幼苗培育部門,溫室數(shù)據(jù),2022-03-13 19:10_2022-03-14 21:10},訪問控制策略為{大于25歲,種植部門,業(yè)務(wù)管理員,幼苗培育部門,溫室數(shù)據(jù),日期,查詢}。
基于PBFT,各節(jié)點(diǎn)對用戶屬性、數(shù)據(jù)屬性以及訪問控制策略可信驗(yàn)證的具體工作流程如圖7所示。
圖7 節(jié)點(diǎn)工作流程Fig.7 Node workflow
在圖7中,首先,主從節(jié)點(diǎn)先后查詢驗(yàn)證AC、讀取用戶屬性、讀取數(shù)據(jù)屬性以及決策訪問控制請求,并分別廣播預(yù)準(zhǔn)備消息和準(zhǔn)備消息到其他節(jié)點(diǎn);其次,所有節(jié)點(diǎn)對比驗(yàn)證準(zhǔn)備消息與預(yù)準(zhǔn)備消息,驗(yàn)證通過后,使用私鑰對權(quán)限相關(guān)信息簽名,廣播確認(rèn)消息到其他節(jié)點(diǎn);最后,各節(jié)點(diǎn)驗(yàn)證確認(rèn)消息,根據(jù)確認(rèn)結(jié)果,向客戶端發(fā)送回復(fù)消息。
根據(jù)訪問控制過程的可信決策結(jié)果可知,業(yè)務(wù)管理員擁有相應(yīng)的操作權(quán)限,系統(tǒng)響應(yīng)請求頁面如圖8所示。
圖8 系統(tǒng)響應(yīng)請求頁面Fig.8 System responded to request page
在圖8中,頁面顯示的溫室數(shù)據(jù)是從鏈下數(shù)據(jù)庫中獲取到的原始數(shù)據(jù),種植部門的業(yè)務(wù)管理員需要執(zhí)行防偽驗(yàn)證操作從聯(lián)盟鏈上查詢原始數(shù)據(jù)的散列值,與數(shù)據(jù)庫中現(xiàn)有數(shù)據(jù)實(shí)時生成的散列值進(jìn)行對比驗(yàn)證,確保原始數(shù)據(jù)的一致性。
以工作ID為82的溫室數(shù)據(jù)為例,防偽驗(yàn)證的結(jié)果如圖9所示。
圖9 防偽驗(yàn)證Fig.9 Anti-counterfeiting verification
從圖9可以看出,鏈上數(shù)據(jù)包含一個鍵值對(Key,Value),其中,Key為溫室數(shù)據(jù)的記錄時間,唯一標(biāo)識該數(shù)據(jù),Value為數(shù)據(jù)的散列值。只有存儲到聯(lián)盟鏈上的數(shù)據(jù)才可以進(jìn)行防偽驗(yàn)證,確保鏈下數(shù)據(jù)的完整性。由驗(yàn)證結(jié)果可知,鏈上數(shù)據(jù)的散列值與鏈下數(shù)據(jù)實(shí)時形成的散列值完全一致,說明該數(shù)據(jù)自上鏈以后未被篡改,查詢結(jié)果真實(shí)可信。
(3)鏈碼的核心操作
由訪問控制可信決策過程可看出,主節(jié)點(diǎn)AA1以及從節(jié)點(diǎn)AA2、AA3、AA4分別在預(yù)準(zhǔn)備階段和準(zhǔn)備階段到各自組織的記賬節(jié)點(diǎn)上查詢管理員屬性證書、鏈上的數(shù)據(jù)散列值以及訪問控制策略。通過Hyperledger Fabric的命令行模式直接調(diào)用ACMC.QueryAC()、DAMC.DownloadDate()以及ACPMC.DownloadACP()函數(shù)查詢管理員屬性證書、鏈上的數(shù)據(jù)散列值以及訪問控制策略,查詢結(jié)果與通過HyperLedger Fabric SDK調(diào)用鏈碼查詢出的結(jié)果保持一致,執(zhí)行過程如圖10所示。
圖10 鏈碼的核心操作Fig.10 Core operation of chaincode
由圖10可以看出,聯(lián)盟鏈賬本上存儲管理員屬性證書的Key為20152586,Value為以字節(jié)形式表示的證書內(nèi)容;賬本上存儲訪問控制策略p1的Key為05c9f82c6f69c39f10db7449859b5c33cf636c5 4075 3e4f423c296a4c32b8e0a,Value為{大于25歲,種植部門,業(yè)務(wù)管理員,幼苗培育部門,溫室數(shù)據(jù),日期,查詢};賬本上存儲溫室數(shù)據(jù)的Key為2022-03-13 19:42:41,Value為76e9da3cc23dca65a7c1c6 e65847a525da7fb3db7424a5dd76b77ec5863c88a6。
4.3.1測試方案
通過模型共識過程可以看出,數(shù)據(jù)處理請求發(fā)出到響應(yīng)的時間主要由區(qū)塊鏈查詢時間決定,因此,主要測試不同交易總量、交易發(fā)送率條件下的訪問控制策略鏈上查詢效率。用交易吞吐量以及平均時延作為主要性能評估指標(biāo)。通過設(shè)置相應(yīng)的基準(zhǔn)測試用例以及相關(guān)的配置文件來模擬測試不同條件下的網(wǎng)絡(luò)性能。測試方案如下:
(1)基本參數(shù)為訪問控制策略p1。
(2)交易總量分別為1 000、2 000、3 000條,對應(yīng)測試方案1、方案2和方案3。
(3)交易發(fā)送率分別為100、200、…、1 400、1 500 TPS,TPS表示每秒向系統(tǒng)提交的并發(fā)交易量。
(4)每輪重復(fù)10次,取均值作為交易吞吐量和平均時延的最終結(jié)果。
4.3.2測試與分析
(1)交易吞吐量是指區(qū)塊鏈網(wǎng)絡(luò)每秒成功處理的交易數(shù),當(dāng)一筆交易讀寫到區(qū)塊鏈上,該交易處理成功。訪問控制策略查詢的交易吞吐量測試結(jié)果如圖11所示。
圖11 訪問控制策略查詢的交易吞吐量Fig.11 Transaction throughput for access control policy queries
由圖11可以看出,3種方案在交易發(fā)送率達(dá)到300 TPS前,交易吞吐量線性上升;在交易發(fā)送率達(dá)到300 TPS后,交易吞吐量總體趨于穩(wěn)定。這是由于隨著交易發(fā)送率越來越大,消息隊(duì)列堵塞,磁盤讀寫速度變慢造成的。當(dāng)交易發(fā)送率為800、1 000、1 100 TPS時,3種方案的交易吞吐量達(dá)到最高值。當(dāng)交易發(fā)送率相同時,向聯(lián)盟鏈提交交易總量越高,交易吞吐量越高。
(2)平均時延是指一筆交易從發(fā)起交易請求到收到交易處理結(jié)果所經(jīng)歷的時間間隔。訪問控制策略查詢的平均時延測試結(jié)果如圖12所示。
圖12 訪問控制策略查詢的平均時延 Fig.12 Average latency for access control policy queries
由圖12可看出,3種方案在交易發(fā)送率400 TPS前平均時延波動較大;在交易發(fā)送率400 TPS后平均時延基本穩(wěn)定。這是由于隨著交易發(fā)送率增加,消息隊(duì)列堵塞,導(dǎo)致磁盤讀寫速度變慢造成的。在相同交易發(fā)送率條件下,向聯(lián)盟鏈提交交易總量越高,平均時延越高。
(1)針對基于屬性的聯(lián)盟鏈應(yīng)用訪問控制模型可能存在拜占庭節(jié)點(diǎn)而導(dǎo)致屬性信息、訪問控制策略不可信的問題,以獼猴桃溯源為應(yīng)用場景,利用屬性證書真實(shí)、有效、可驗(yàn)證以及PBFT具備拜占庭容錯能力的特點(diǎn),提出了基于PBFT的獼猴桃溯源聯(lián)盟鏈應(yīng)用訪問控制方案。所有用戶申請AC,存儲與權(quán)限相關(guān)的屬性。管理員將訪問控制策略存儲在聯(lián)盟鏈上。用戶發(fā)出訪問請求后,組織AA調(diào)用智能合約查詢鏈上的AC、訪問控制策略以及數(shù)據(jù)服務(wù)器中的數(shù)據(jù)屬性,并基于PBFT查詢驗(yàn)證用戶屬性、數(shù)據(jù)屬性、訪問控制策略的可信性,以決定是否為用戶授權(quán)。
(2)基于Hyperledger Fabric獼猴桃溯源應(yīng)用的測試結(jié)果可以看出,通過訪問控制可信決策、核心鏈碼測試表明方案合理、可行;通過不同交易總量、交易發(fā)送率條件下的訪問控制策略鏈上查詢性能測試表明交易吞吐量和平均時延均能達(dá)到穩(wěn)定狀態(tài),交易吞吐量在交易發(fā)送率為300 TPS后趨于穩(wěn)定,平均時延在交易發(fā)送率為400 TPS后趨于穩(wěn)定,基本滿足聯(lián)盟鏈系統(tǒng)的應(yīng)用需求。該方案具有良好的可用性和性能,保證了訪問控制過程的可信性以及一致性,提高了獼猴桃溯源應(yīng)用的安全性、容錯性。