李 莉,楊祉坤,張 超,吳 怡,陳云鵬
(東北林業(yè)大學(xué) 信息與計(jì)算機(jī)工程學(xué)院,黑龍江 哈爾濱 150040)
目前,現(xiàn)有醫(yī)藥溯源將所有藥品統(tǒng)一化管理,主要有兩種方式。一種是傳統(tǒng)數(shù)據(jù)庫(kù)的醫(yī)藥溯源方式,系統(tǒng)將所有相關(guān)醫(yī)藥溯源信息存放在中心數(shù)據(jù)庫(kù)中,也就是中心記賬。另外一種是利用區(qū)塊鏈技術(shù)進(jìn)行去中心化。單鏈區(qū)塊鏈技術(shù)解決了中心化記賬方式的信息存儲(chǔ)安全等問(wèn)題[1],但也不可避免擁有著自身缺陷,主要表現(xiàn)為:?jiǎn)捂渽^(qū)塊鏈吞吐率低以及可伸縮性不高,不能滿足醫(yī)藥溯源的大數(shù)據(jù)量與大交易量的處理需求[2,3];并且每個(gè)節(jié)點(diǎn)均需要存儲(chǔ)所有的醫(yī)藥數(shù)據(jù),存儲(chǔ)開(kāi)銷較大,對(duì)節(jié)點(diǎn)設(shè)備要求過(guò)高;此外,多條鏈之間無(wú)法進(jìn)行信息交互,存在信息孤島的現(xiàn)象。
為解決以上問(wèn)題,本文在圖型區(qū)塊鏈(directed acyclic graph區(qū)塊鏈,DAG區(qū)塊鏈)基礎(chǔ)上,構(gòu)建出基于圖型區(qū)塊鏈的分級(jí)醫(yī)藥溯源模型。該模型改進(jìn)了DAG區(qū)塊鏈的數(shù)據(jù)層和共識(shí)層,提升信息驗(yàn)證效率,增大了吞吐量。并且在原有的圖型區(qū)塊鏈結(jié)構(gòu)上加以改進(jìn),對(duì)區(qū)塊鏈進(jìn)行分區(qū)處理:在醫(yī)藥溯源信息存儲(chǔ)前通過(guò)標(biāo)志字段進(jìn)行醫(yī)藥分級(jí),實(shí)現(xiàn)不同級(jí)別醫(yī)藥信息存儲(chǔ)在不同的區(qū)塊鏈分區(qū)中。模型還將全網(wǎng)節(jié)點(diǎn)劃分為主網(wǎng)絡(luò)和多個(gè)子網(wǎng)絡(luò),以減輕節(jié)點(diǎn)存儲(chǔ)壓力。
2008年,比特幣創(chuàng)始人中本聰發(fā)表了比特幣白皮書(shū),介紹了世界上第一個(gè)分布式加密貨幣,開(kāi)啟了區(qū)塊鏈1.0。而以以太坊為代表的區(qū)塊鏈2.0在智能合約系統(tǒng)的支撐下,拓寬了區(qū)塊鏈的應(yīng)用場(chǎng)景。智能化物聯(lián)網(wǎng)時(shí)代的區(qū)塊鏈3.0在行業(yè)應(yīng)用方面體現(xiàn)了應(yīng)用場(chǎng)景的較大差異,該時(shí)代下的區(qū)塊鏈技術(shù)具備企業(yè)級(jí)屬性,可以在更好地解決信任問(wèn)題的同時(shí),大幅提升系統(tǒng)的運(yùn)作能力。
2013年,研究者首次提出將DAG算法[4]引入?yún)^(qū)塊鏈中作為共識(shí)算法,即“GHOST協(xié)議”。DAG區(qū)塊鏈雖然也是分布式賬本技術(shù),但不同于單鏈區(qū)塊鏈。單鏈區(qū)塊鏈的主要特征是會(huì)產(chǎn)生一條由區(qū)塊連接形成的單鏈,而DAG區(qū)塊鏈?zhǔn)菑慕灰壮霭l(fā),生成一個(gè)有向無(wú)環(huán)圖。兩者在本質(zhì)上都繼承了分布式賬本的優(yōu)點(diǎn)。DAG區(qū)塊鏈的最小單元是交易,先前的交易要被驗(yàn)證,后面的交易才能順利進(jìn)行,而驗(yàn)證結(jié)果則通過(guò)單元的形式記錄下來(lái)。這也就使得DAG區(qū)塊鏈具有了傳統(tǒng)區(qū)塊鏈沒(méi)有的并行處理能力。
圖型區(qū)塊鏈結(jié)構(gòu)如圖1所示,其中G區(qū)塊為創(chuàng)世紀(jì)區(qū)塊,1~16區(qū)塊為普通的存儲(chǔ)醫(yī)藥信息區(qū)塊,箭頭指向表示每個(gè)區(qū)塊加入DAG區(qū)塊鏈網(wǎng)絡(luò)時(shí)與前面已經(jīng)存在區(qū)塊的驗(yàn)證關(guān)系,其中15區(qū)塊、16區(qū)塊是未被后續(xù)驗(yàn)證的區(qū)塊。
圖1 圖型區(qū)塊結(jié)構(gòu)
關(guān)于醫(yī)藥溯源系統(tǒng)的研究,禹忠等設(shè)計(jì)了基于區(qū)塊鏈的醫(yī)藥防偽溯源系統(tǒng),此系統(tǒng)在超級(jí)賬本(Hyperledger)的Fabric區(qū)塊鏈平臺(tái)上開(kāi)發(fā)[5],將所有品類藥品統(tǒng)一化管理,但仍然存在著數(shù)據(jù)量較大時(shí),系統(tǒng)的吞吐率過(guò)低和單節(jié)點(diǎn)的存儲(chǔ)開(kāi)銷大的問(wèn)題。
為提高區(qū)塊鏈吞吐量,現(xiàn)有3種解決方式:
(1)提高出塊效率。Micali教授提出了Algogrand算法[6],算法改進(jìn)了拜占庭共識(shí)機(jī)制,通過(guò)VRF產(chǎn)生委員會(huì),并通過(guò)BA*產(chǎn)生一致性輸出。
(2)變相增大區(qū)塊大小。通過(guò)增大區(qū)塊的大小也可以提高區(qū)塊鏈的吞吐量,但網(wǎng)絡(luò)延遲會(huì)隨著區(qū)塊的增大而提高,所以不能單純地增大區(qū)塊??的螤柎髮W(xué)博士后Ittay Eyal等提出了bitcoin-ng協(xié)議[7]將大區(qū)塊拆分成小區(qū)塊。此外,針對(duì)增大區(qū)塊大小的問(wèn)題,康奈爾大學(xué)的 Elaine 教授提出了Thunderella 協(xié)議[8]。
(3)分片技術(shù)。Elastico[9]、Omniledger[10]等系統(tǒng)引入了分片技術(shù),對(duì)系統(tǒng)進(jìn)行水平擴(kuò)容,減小單個(gè)節(jié)點(diǎn)的存儲(chǔ)開(kāi)銷進(jìn)一步提高吞吐量。
2.1.1 分級(jí)模型整體設(shè)計(jì)
《中華人民共和國(guó)藥品管理法》對(duì)藥品按照性質(zhì)進(jìn)行分類,如中藥材、中成藥、抗生素、化學(xué)原料藥及其試劑、放射性藥品、疫苗、診斷藥品等。本模型按照這種分類方法對(duì)醫(yī)藥進(jìn)行分級(jí),并對(duì)每一級(jí)的醫(yī)藥標(biāo)準(zhǔn)名稱通過(guò)非對(duì)稱加密算法進(jìn)行處理,生成唯一的標(biāo)識(shí),該標(biāo)識(shí)在本文中稱為標(biāo)志字段值。
模型把全網(wǎng)節(jié)點(diǎn)劃分為主網(wǎng)絡(luò)和多個(gè)分區(qū)子網(wǎng)絡(luò),主網(wǎng)絡(luò)存儲(chǔ)所有區(qū)塊信息,各個(gè)子網(wǎng)絡(luò)存儲(chǔ)不同標(biāo)志字段值的醫(yī)藥溯源信息,也就是每個(gè)子網(wǎng)絡(luò)存儲(chǔ)一種分級(jí)的醫(yī)藥信息。并且模型將這些子網(wǎng)絡(luò)中的節(jié)點(diǎn)IP地址存儲(chǔ)在Tag數(shù)據(jù)庫(kù)中(該數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)為:醫(yī)藥屬性標(biāo)志字段和節(jié)點(diǎn)IP地址的對(duì)應(yīng)關(guān)系),該數(shù)據(jù)庫(kù)由全網(wǎng)節(jié)點(diǎn)共同存儲(chǔ)。
該模型交互終端涉及4個(gè)組織:醫(yī)藥廠商、經(jīng)銷商、醫(yī)院和消費(fèi)者。業(yè)務(wù)邏輯圖如圖2所示。醫(yī)藥廠商將醫(yī)藥出廠信息(包括藥材原材料的選取、醫(yī)藥加工過(guò)程、藥品成分、出廠日期等)上傳,模型根據(jù)上傳醫(yī)藥名稱到Tag數(shù)據(jù)庫(kù)中查詢?cè)撫t(yī)藥對(duì)應(yīng)的標(biāo)志字段值和存儲(chǔ)該分級(jí)醫(yī)藥信息的子分區(qū)節(jié)點(diǎn)IP地址,將對(duì)應(yīng)標(biāo)志字段值與醫(yī)藥信息一同加密,并選取打包區(qū)塊節(jié)點(diǎn),被選節(jié)點(diǎn)打包區(qū)塊上鏈存儲(chǔ)并等待驗(yàn)證,驗(yàn)證后廣播到全網(wǎng)。經(jīng)銷商與醫(yī)院將醫(yī)藥發(fā)送到其他經(jīng)銷商、醫(yī)院、消費(fèi)者時(shí),同樣需要進(jìn)行上述流程將流通信息交給相應(yīng)的節(jié)點(diǎn)打包區(qū)塊進(jìn)行上鏈存儲(chǔ)。消費(fèi)者可通過(guò)指定終端查詢某醫(yī)藥溯源信息。
圖2 業(yè)務(wù)邏輯
2.1.2 DAG區(qū)塊鏈分區(qū)設(shè)計(jì)
基于圖型區(qū)塊鏈的分區(qū)結(jié)構(gòu)如圖3所示。
圖3 分區(qū)結(jié)構(gòu)
(1)將醫(yī)藥溯源區(qū)塊網(wǎng)絡(luò)劃分多個(gè)分區(qū),方便用于醫(yī)藥溯源場(chǎng)景,減少存儲(chǔ)開(kāi)銷。
本文建立在區(qū)塊鏈網(wǎng)絡(luò)分區(qū)技術(shù)的基礎(chǔ)之上,并且將整個(gè)DAG區(qū)塊鏈劃分出一條主鏈和多個(gè)子DAG鏈。醫(yī)藥廠商的醫(yī)藥生產(chǎn)信息作為主鏈存儲(chǔ)的信息,多個(gè)子鏈分別存儲(chǔ)經(jīng)銷商或醫(yī)院等中間商上傳的不同標(biāo)志字段值的醫(yī)藥信息區(qū)塊。而整個(gè)網(wǎng)絡(luò)環(huán)境中,主網(wǎng)絡(luò)存儲(chǔ)DAG區(qū)塊鏈上所有區(qū)塊,分區(qū)子網(wǎng)絡(luò)存儲(chǔ)主鏈信息和該分區(qū)標(biāo)志字段值所對(duì)應(yīng)的DAG子鏈。
(2)實(shí)現(xiàn)跨域信息交互,不同分區(qū)子網(wǎng)絡(luò)節(jié)點(diǎn)進(jìn)行交互。
跨域交互處理流程如圖4所示,具體步驟如下:
圖4 跨域交互
(1)發(fā)送跨域交互信息的節(jié)點(diǎn)查詢Tag數(shù)據(jù)庫(kù),判定信息的標(biāo)志字段值是否在數(shù)據(jù)庫(kù)中。如果存在根據(jù)匹配的結(jié)果(目標(biāo)分區(qū)子網(wǎng)絡(luò)節(jié)點(diǎn)的IP地址)選取節(jié)點(diǎn),并將信息發(fā)送給該節(jié)點(diǎn),進(jìn)行步驟(2)。否則拋出異常,終止交互。
(2)被選節(jié)點(diǎn)根據(jù)請(qǐng)求信息重新構(gòu)建一個(gè)區(qū)塊。
(3)分區(qū)子網(wǎng)絡(luò)所有節(jié)點(diǎn)完成信息驗(yàn)證、信息廣播以及信息存儲(chǔ)。
2.2.1 區(qū)塊數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
區(qū)塊解碼后,其中信息包含如表1所示的字段。
表1 區(qū)塊數(shù)據(jù)結(jié)構(gòu)
在實(shí)際操作過(guò)程中,節(jié)點(diǎn)向網(wǎng)絡(luò)發(fā)送一條溯源信息,需要提供以下參數(shù):
(1)Autograph:每個(gè)節(jié)點(diǎn)擁有唯一的獨(dú)有的私鑰用于對(duì)請(qǐng)求上鏈的信息進(jìn)行簽名。得到的簽名數(shù)據(jù)中包含本節(jié)點(diǎn)身份標(biāo)志。
(2)Address:指定醫(yī)藥接收方公鑰地址。
醫(yī)藥廠商、經(jīng)銷商、醫(yī)院通過(guò)RSA算法(公私鑰對(duì)生成算法)生成公鑰和私鑰,并根據(jù)公鑰取值可以得出公鑰地址。公鑰生成地址算法如圖5所示,具體步驟如下:
圖5 公鑰地址生成
1)將公鑰依次進(jìn)行SHA256、RIPEMD160運(yùn)算得出公鑰地址哈希值(Public Key Hash)。
2)將得到的哈希值直接在前端拼接版本號(hào)屬性,生成21字節(jié)數(shù)據(jù)。
3)將本21字節(jié)數(shù)據(jù)(稱之為A)復(fù)制生成21字節(jié)數(shù)據(jù)B。
4)數(shù)據(jù)B進(jìn)行兩次連續(xù)的SHA256。
5)取(4)得到的結(jié)果前4個(gè)字節(jié)數(shù)據(jù)與數(shù)據(jù)A進(jìn)行拼接,得到25字節(jié)數(shù)據(jù)。
6)將(5)得到的數(shù)據(jù)進(jìn)行BASE58編碼操作得出最終的公鑰地址(Address)。
(3)Count:指定醫(yī)藥流通的數(shù)量。
(4)Tag:標(biāo)志字段。
(5)Message:醫(yī)藥溯源信息。其中包括醫(yī)藥敏感數(shù)據(jù)和非敏感數(shù)據(jù)。敏感數(shù)據(jù)是醫(yī)藥的生產(chǎn)過(guò)程中的核心資料,不可直接記錄到區(qū)塊鏈上,必須對(duì)其做一定處理,模型利用非對(duì)稱加密算法對(duì)其進(jìn)行加密。對(duì)于非敏感數(shù)據(jù),即醫(yī)藥的基本信息和流通信息,無(wú)需加密,直接存儲(chǔ)。
(6)MessageHash:溯源信息數(shù)據(jù)哈希值。運(yùn)算公式如下(其中‖表示拼接)
HashData1=Hash(SentiveData)HashData2=Hash(InsentiveData)HashData=HashData1‖HashData2MessageHash=Hash(HashData)
(1)
在節(jié)點(diǎn)打包區(qū)塊時(shí)還需添加以下關(guān)鍵數(shù)據(jù):
父節(jié)點(diǎn)哈希值:當(dāng)節(jié)點(diǎn)預(yù)將所生成區(qū)塊加入DAG區(qū)塊鏈網(wǎng)絡(luò)中時(shí),需選取兩個(gè)網(wǎng)絡(luò)中區(qū)塊進(jìn)行驗(yàn)證。驗(yàn)證成功后將兩區(qū)塊的信息分別進(jìn)行SHA256算法運(yùn)算,得到的兩組256 bit數(shù)據(jù)作為本區(qū)塊的父節(jié)點(diǎn)哈希值。
隨機(jī)數(shù)與目標(biāo)哈希:為了避免無(wú)代價(jià)攻擊,區(qū)塊在加入?yún)^(qū)塊鏈網(wǎng)絡(luò)前,要進(jìn)行一次自我pow工作量證明運(yùn)算。生成區(qū)塊之前,需設(shè)置本區(qū)塊的目標(biāo)哈希值,即設(shè)置本次pow工作難度。目標(biāo)哈希值越小,工作運(yùn)算難度越大。區(qū)塊不斷設(shè)置隨機(jī)數(shù)的取值,直到
Hash(區(qū)塊數(shù)據(jù)+隨機(jī)數(shù))≤目標(biāo)哈希值
(2)
此時(shí)的隨機(jī)數(shù)為最終取值。
2.2.2 標(biāo)志字段分區(qū)處理
選取字段Autograph和Tag作為分區(qū)標(biāo)志。標(biāo)志字段的分區(qū)處理流程如圖6所示。
圖6 標(biāo)志字段處理
字段Autograph與Tag的處理規(guī)則是:
(1)加入對(duì)字段Autograph的檢查,通過(guò)Autograph值判斷該條數(shù)據(jù)是否為醫(yī)藥廠商上傳。若是,則至(2);否則至(3)。
(2)廣播主網(wǎng)和分區(qū)子網(wǎng)節(jié)點(diǎn)更新網(wǎng)絡(luò),并且等待全網(wǎng)驗(yàn)證,驗(yàn)證后存儲(chǔ),處理結(jié)束。
(3)判斷Tag字段是否是本節(jié)點(diǎn)應(yīng)存儲(chǔ)的Tag值醫(yī)藥信息。若是,則域內(nèi)認(rèn)證并廣播等待驗(yàn)證、存儲(chǔ),處理結(jié)束;否則至(4)。
(4)進(jìn)行跨域交互,查詢Tag數(shù)據(jù)庫(kù)。若數(shù)據(jù)庫(kù)中不存在該Tag值,拋出異常,處理結(jié)束;否則至(5)。
(5)根據(jù)Tag數(shù)據(jù)庫(kù)中該Tag值對(duì)應(yīng)的IP地址,選取處理節(jié)點(diǎn),被選節(jié)點(diǎn)進(jìn)行打包區(qū)塊、廣播區(qū)塊、等待驗(yàn)證、存儲(chǔ)。
流程偽代碼如下:
算法1:標(biāo)志字段處理
輸入: Autograph,Address,Count
Tag,Message,MessageHash
輸出: isSendSuccess
//打包區(qū)塊成功標(biāo)志, sendData()的返回值
//sendData()表示打包、 上傳區(qū)塊
Begin
api;
If (Autograph == Manufacturer) do
information=transfer(Autograph,Address,
Count,Tag,Message,MessageHash);
Return sendData(information);
//判斷是否為主鏈信息。 若是, 則打包區(qū)塊。
Else if(Tag==nowTag)
information=transfer(Autograph,Address,
Count,Tag,Message,MessageHash);
sendData(information);
//判斷信息標(biāo)志字段值是否符合為本節(jié)點(diǎn)存儲(chǔ)條件。 若符合, 則該節(jié)點(diǎn)打包區(qū)塊。
Else if((ip=mysql(tagip)!=null)
newapi;
information=transfer(Autograph,Address,
Count,Tag,Message,MessageHash);
sendData(infomation);
Else
Throw anexception
//判斷標(biāo)志字段是否在Tag數(shù)據(jù)庫(kù)中。 若在, 則選擇節(jié)點(diǎn)打包區(qū)塊; 否則拋出異常。
End;
用戶通過(guò)客戶端發(fā)送溯源信息上鏈請(qǐng)求,直到信息確認(rèn),需要經(jīng)過(guò)圖7中所示流程。其中,從發(fā)送上鏈請(qǐng)求至創(chuàng)建區(qū)塊由一個(gè)或兩個(gè)節(jié)點(diǎn)完成,信息的存儲(chǔ)、傳播、確認(rèn)由本子網(wǎng)全部節(jié)點(diǎn)共同完成。
圖7 共識(shí)過(guò)程
發(fā)送上鏈請(qǐng)求的客戶端(本節(jié)稱為節(jié)點(diǎn)A)根據(jù)數(shù)據(jù)中標(biāo)志字段確定存儲(chǔ)網(wǎng)絡(luò)位置。若存儲(chǔ)位置為節(jié)點(diǎn)A所在子網(wǎng)絡(luò),后續(xù)操作由節(jié)點(diǎn)A完成;否則交給存儲(chǔ)位置所在網(wǎng)絡(luò)的另一個(gè)客戶端(本節(jié)稱為節(jié)點(diǎn)B)進(jìn)行處理。
節(jié)點(diǎn)A或節(jié)點(diǎn)B創(chuàng)建數(shù)據(jù)的基本信息后,通過(guò)MCMC算法選擇本分區(qū)子鏈或主鏈的其它區(qū)塊進(jìn)行驗(yàn)證,驗(yàn)證結(jié)束后對(duì)該區(qū)塊使用SHA256算法不斷嘗試不同的隨機(jī)數(shù)值,直到哈希值小于目標(biāo)哈希,最終創(chuàng)建好區(qū)塊,即區(qū)塊上鏈前節(jié)點(diǎn)進(jìn)行自我pow運(yùn)算。此過(guò)程與IOTA系統(tǒng)[11]相似。
模型規(guī)定一個(gè)區(qū)塊要加入?yún)^(qū)塊鏈網(wǎng)絡(luò),必須要驗(yàn)證已存在的兩個(gè)區(qū)塊,即需要證明這兩個(gè)區(qū)塊中的數(shù)據(jù)與已被確認(rèn)的區(qū)塊沒(méi)有沖突。本模型使用MCMC的tips選擇算法進(jìn)行兩個(gè)區(qū)塊的選擇。MCMC的tips選擇算法是馬爾科夫鏈與門特卡洛算法的結(jié)合。MCMC的tips選擇算法的步驟如下:
(1)選擇全部累積權(quán)重在[W,2W]之間的區(qū)塊。W是個(gè)足夠大的數(shù)。其中累計(jì)權(quán)重是指區(qū)塊自身工作量證明難度值與所有證明該區(qū)塊的區(qū)塊工作量證明難度值的和。
(2)將N個(gè)粒子放到(1)中選中的區(qū)塊上。
(3)粒子分別隨機(jī)行走。行走指向區(qū)塊網(wǎng)絡(luò)中的tips。若當(dāng)y區(qū)塊證明了x區(qū)塊,說(shuō)明x能夠轉(zhuǎn)移到y(tǒng)。
(4)若y證明了x,Hx、Hy分別為區(qū)塊x、y的累積權(quán)重,則粒子從x轉(zhuǎn)移到y(tǒng)概率正比于exp(-α(Hx-Hy)), 計(jì)算公式為
(3)
其中,α為可調(diào)節(jié)參數(shù)且為正數(shù)。
刪除很快到達(dá)tips的粒子,因?yàn)檫@些tips是懶惰的。找到最先到達(dá)tips的兩個(gè)粒子。若兩個(gè)tips沒(méi)有沖突,則輸出這兩個(gè)tips;否則,另選兩個(gè)沒(méi)有沖突的tips。
偽代碼如下:
算法2:MCMC的tips選擇
輸入:block1,block2…blockn
輸出:tips1,tips2
Begin
Particle[]particles;
//粒子在累計(jì)權(quán)重為[W,2W]的區(qū)塊上分布
For(i=0;i If(blocki.weight>=W&&blocki.weight<=2W) particles.insert(blocki); Foreach(particles) //粒子根據(jù)轉(zhuǎn)移概率隨機(jī)行走 particles.randomWalk(Pxy); If(firstParticle==tips&&secondParticle==tips) //判斷最先到達(dá)的兩個(gè)tips是否包含信息沖突 If(!conflict(firstParticle,secondParticle)) break; ReturnfirstParticle,secondParticle; End; 模型用“確認(rèn)置信度”來(lái)表示醫(yī)藥溯源信息區(qū)塊被其它區(qū)塊的接受程度。驗(yàn)證該區(qū)塊的區(qū)塊數(shù)與運(yùn)行選擇算法(MCMC)次數(shù)的比值為確認(rèn)置信度,只有當(dāng)確認(rèn)置信度達(dá)到97%時(shí),認(rèn)為該區(qū)塊是被完全確認(rèn)的。 在模型運(yùn)行期間可能存在大權(quán)重攻擊,攻擊者可憑借超強(qiáng)的計(jì)算能力對(duì)模型進(jìn)行攻擊。攻擊者發(fā)布許多小型交易驗(yàn)證沖突交易,并且可能會(huì)操控大量“女巫”節(jié)點(diǎn),不去驗(yàn)證末端交易,進(jìn)而產(chǎn)生新的區(qū)塊網(wǎng)絡(luò)。針對(duì)該攻擊本節(jié)進(jìn)行以下分析: W(n)為發(fā)布一個(gè)自身權(quán)重為3n的區(qū)塊所需的工作量證明時(shí)間,并且是以μ3-n為參數(shù)的指數(shù)分布隨機(jī)變量,其中μ是有關(guān)攻擊者攻擊能力參數(shù)。假設(shè)時(shí)間過(guò)去t0個(gè)時(shí)間單元,區(qū)塊累計(jì)權(quán)重為w0以上,視為該區(qū)塊被完全確認(rèn)。經(jīng)計(jì)算在t時(shí)刻區(qū)塊累計(jì)權(quán)重H(t)公式如下 (4) 其中,h為節(jié)點(diǎn)打包上傳區(qū)塊的平均時(shí)間,W為勃朗函數(shù)。可得知累計(jì)權(quán)重的增長(zhǎng)速度呈線性,速度為λw。λ為交易流入的速度,w表示一般交易的均值權(quán)重。那么在接受交易時(shí)合法分支的典型累計(jì)權(quán)重是 wl=λwt0 (5) 若攻擊者發(fā)布的大權(quán)重沖突交易想超過(guò)合法分支的權(quán)重,應(yīng)在t0內(nèi)產(chǎn)生權(quán)重為3n0≥w1的沖突交易,其中 (6) 并且該事件發(fā)生的概率為 (7) 攻擊者還可以尋找一個(gè)權(quán)重為3n(n>n0) 的沖突交易,合法分支的累計(jì)權(quán)重不超過(guò)3n,計(jì)算概率 (8) 下面分析自身權(quán)重不超過(guò)1時(shí)攻擊的成功概率。假設(shè)G1,G2,G3…是以μ為參數(shù)的獨(dú)立同分布指數(shù)分布隨機(jī)變量,分別表示發(fā)布一個(gè)權(quán)重為1的交易工作量證明時(shí)間,期望值為μ-1,記為 Vk=μGk,k≥1 (9) V1,V2,V3…是以1為參數(shù)的獨(dú)立同分布指數(shù)分布隨機(jī)變量。攻擊者成功的條件是w0無(wú)意義交易所花費(fèi)時(shí)間總和小于t0,其成功概率為 (10) 其中 φ(α)=-lnα+α-1 (11) 可得知,在調(diào)整階段累計(jì)權(quán)重的增長(zhǎng)小于λw, 所以通常情況下有 (12) 無(wú)論如何成功的概率不超過(guò) (13) 進(jìn)而驗(yàn)證本文模型具有很強(qiáng)的安全性,大權(quán)重攻擊、女巫攻擊可能會(huì)對(duì)本模型產(chǎn)生威脅,但都可以通過(guò)模型自身機(jī)制來(lái)實(shí)現(xiàn)預(yù)防。 搭建好網(wǎng)絡(luò)以后,首先向網(wǎng)絡(luò)發(fā)送任意條數(shù)目溯源信息,啟動(dòng)4個(gè)分區(qū)網(wǎng)絡(luò)節(jié)點(diǎn)并完成連接,即完成子網(wǎng)絡(luò)存儲(chǔ)初始化。分別針對(duì)表2中兩種情況進(jìn)行實(shí)驗(yàn),兩種情況各發(fā)出1500條信息(包括應(yīng)存儲(chǔ)在主鏈的醫(yī)藥出廠信息500條、應(yīng)存儲(chǔ)在4個(gè)不同子鏈的4種不同性質(zhì)藥品的溯源信息各250條)。對(duì)上鏈請(qǐng)求的發(fā)出者分情況測(cè)試,情況1的發(fā)出者為4種藥品性質(zhì)對(duì)應(yīng)的子網(wǎng)絡(luò)中的節(jié)點(diǎn);情況2的發(fā)出者均不是對(duì)應(yīng)的子網(wǎng)絡(luò)中的節(jié)點(diǎn)。 表2 實(shí)驗(yàn)條件 實(shí)驗(yàn)以情況1、情況2的順序進(jìn)行測(cè)試,并且記錄各個(gè)子網(wǎng)絡(luò)中某節(jié)點(diǎn)的數(shù)據(jù)庫(kù)大小。 對(duì)子網(wǎng)絡(luò)節(jié)點(diǎn)的數(shù)據(jù)庫(kù)分析得出,各個(gè)子網(wǎng)絡(luò)成功接收符合該子網(wǎng)絡(luò)對(duì)應(yīng)標(biāo)志字段的250條數(shù)據(jù)以及500條主鏈信息。并且子網(wǎng)絡(luò)有效隔絕了其它子網(wǎng)絡(luò)中不符合本子網(wǎng)絡(luò)數(shù)據(jù)規(guī)則的數(shù)據(jù)。圖8為各個(gè)子網(wǎng)節(jié)點(diǎn)、主網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)據(jù)庫(kù)接收數(shù)據(jù)前后的大小變化。主網(wǎng)絡(luò)節(jié)點(diǎn)存儲(chǔ)區(qū)塊網(wǎng)絡(luò)所有數(shù)據(jù),所以其節(jié)點(diǎn)的存儲(chǔ)開(kāi)銷較大,相比之下子網(wǎng)絡(luò)中節(jié)點(diǎn)的存儲(chǔ)壓力大大減少。 圖8 節(jié)點(diǎn)數(shù)據(jù)庫(kù)大小對(duì)比 傳統(tǒng)區(qū)塊鏈溯源系統(tǒng)沒(méi)有進(jìn)行分區(qū)存儲(chǔ),其所有節(jié)點(diǎn)要存儲(chǔ)區(qū)塊網(wǎng)絡(luò)的全部數(shù)據(jù)(相當(dāng)于本實(shí)驗(yàn)中的主網(wǎng)絡(luò)節(jié)點(diǎn))。本模型劃分了若干分區(qū)子網(wǎng),每個(gè)分區(qū)子網(wǎng)的節(jié)點(diǎn)只需存儲(chǔ)部分區(qū)塊網(wǎng)絡(luò)數(shù)據(jù),減少了存儲(chǔ)開(kāi)銷。 測(cè)試環(huán)境與3.2節(jié)中相同,子網(wǎng)絡(luò)1存儲(chǔ)中成藥類藥品信息,子網(wǎng)絡(luò)2存儲(chǔ)抗生素類藥品信息,子網(wǎng)絡(luò)3存儲(chǔ)中藥材信息,子網(wǎng)4存儲(chǔ)疫苗信息。 子網(wǎng)絡(luò)1中的節(jié)點(diǎn)A,預(yù)將抗生素類(設(shè)其標(biāo)志字段為Tag 2)藥品信息存儲(chǔ)到區(qū)塊網(wǎng)絡(luò)中。節(jié)點(diǎn)查詢Tag數(shù)據(jù)庫(kù),找到子網(wǎng)絡(luò)2所有節(jié)點(diǎn)IP地址,并構(gòu)建一個(gè)跨域區(qū)塊。實(shí)驗(yàn)結(jié)果表明,子網(wǎng)絡(luò)2中節(jié)點(diǎn)B成功接收到了節(jié)點(diǎn)A發(fā)送的信息,跨域交互成功執(zhí)行。隨著跨域數(shù)據(jù)量的增加,模型執(zhí)行時(shí)間的變化如圖9所示。從圖9可以看出,隨著數(shù)據(jù)量的增加,跨域交互的效率逐漸降低,與子網(wǎng)內(nèi)部處理的情況相比,數(shù)據(jù)庫(kù)的查詢和區(qū)塊信息的傳遞造成了額外的時(shí)間開(kāi)銷。 圖9 時(shí)間開(kāi)銷對(duì)比 此外,本實(shí)驗(yàn)與傳統(tǒng)區(qū)塊鏈溯源模型也進(jìn)行了隨數(shù)據(jù)量增加,時(shí)間開(kāi)銷的對(duì)比。實(shí)驗(yàn)結(jié)果表明(如圖9所示),在區(qū)塊網(wǎng)絡(luò)數(shù)據(jù)量較小時(shí),傳統(tǒng)單鏈區(qū)塊鏈模型消耗時(shí)間較少,但隨著數(shù)據(jù)量的增大,本文模型并未因跨域操作失去高處理效率的優(yōu)勢(shì)。 模型在4 核 1.5 Ghz CPU、16 GB內(nèi)存的主機(jī)上進(jìn)行測(cè)試。網(wǎng)絡(luò)帶寬40 M/S,操作系統(tǒng)為Ubuntu 14.04.1,評(píng)測(cè)指標(biāo)包括吞吐率和確認(rèn)延遲。在硬件情況完全相同的情況下,模擬用戶行為使區(qū)塊鏈網(wǎng)絡(luò)不斷接收事務(wù)請(qǐng)求。完成上鏈?zhǔn)聞?wù)請(qǐng)求數(shù)以及確認(rèn)延遲時(shí)間見(jiàn)表3。隨著上鏈請(qǐng)求次數(shù)的增加,確認(rèn)延遲時(shí)間也有所增長(zhǎng),但請(qǐng)求的平均響應(yīng)時(shí)間符合用戶需求,具有較好的網(wǎng)絡(luò)響應(yīng)效果,可以使用戶獲得良好的體驗(yàn)。 表3 請(qǐng)求數(shù)與響應(yīng)時(shí)間 將本文模型與現(xiàn)有研究中其它針對(duì)提高吞吐量模型進(jìn)行吞吐量以及性能比對(duì),其中Algorand、bitcoin-ng、OmniLedger分別通過(guò)變相增大區(qū)塊大小、把參與者分片以及將區(qū)塊分為主區(qū)塊和微區(qū)塊兩種角色來(lái)提升模型吞吐量。 在藥品信息溯源的應(yīng)用背景下,實(shí)驗(yàn)結(jié)果見(jiàn)表4。處于相同環(huán)境下,本模型吞吐量基本穩(wěn)定在6400 TPS以上,相較比特幣系統(tǒng)提升了910倍,相較其它模型的380 TPS、6000 TPS、5600 TPS的吞吐率也有較大提升。其它3種提升吞吐率的算法存在數(shù)據(jù)安全性高,易造成網(wǎng)絡(luò)擁堵的缺陷。本文模型保證了效率,但是在鏈上區(qū)塊較少時(shí),驗(yàn)證速度相對(duì)較慢。 表4 算法對(duì)比 由于模型將DAG區(qū)塊網(wǎng)絡(luò)劃分為多個(gè)分區(qū),各個(gè)分區(qū)只存儲(chǔ)相應(yīng)標(biāo)志字段醫(yī)藥溯源信息,查詢時(shí)只需搜索對(duì)應(yīng)分區(qū),目標(biāo)區(qū)塊范圍大大縮小。所以在保證溯源信息查詢正確的前提下,驗(yàn)證效率也有所提高。 現(xiàn)有溯源系統(tǒng)查詢命令發(fā)出后的平均響應(yīng)時(shí)間為20 ms至25 ms。現(xiàn)與3.4節(jié)測(cè)試環(huán)境相同的情況下,進(jìn)行查詢的正確性與速度測(cè)試。實(shí)驗(yàn)結(jié)果如圖10所示,圖中橫軸坐標(biāo)代表當(dāng)前查詢?yōu)榈趲状握?qǐng)求,縱軸為當(dāng)前查詢響應(yīng)時(shí)間,單位為ms。實(shí)驗(yàn)結(jié)果表明,本模型查詢正確率為100%,每次查詢的請(qǐng)求響應(yīng)時(shí)間圍繞16 ms上下波動(dòng)。 圖10 查詢請(qǐng)求響應(yīng)時(shí)間 本方案基于對(duì)區(qū)塊鏈溯源系統(tǒng)安全性、吞吐量以及節(jié)點(diǎn)存儲(chǔ)開(kāi)銷的考慮,提出了多域下的DAG區(qū)塊鏈模型。模型平衡了確認(rèn)延遲和存儲(chǔ)開(kāi)銷等制約因素,設(shè)計(jì)了標(biāo)志字段的處理規(guī)則,實(shí)現(xiàn)了將DAG區(qū)塊網(wǎng)絡(luò)分區(qū),并且將全網(wǎng)節(jié)點(diǎn)劃分為主網(wǎng)絡(luò)和子網(wǎng)絡(luò)。實(shí)驗(yàn)結(jié)果表明,模型在具有良好的抗大權(quán)重攻擊、女巫攻擊的安全性基礎(chǔ)上,有效減少節(jié)點(diǎn)存儲(chǔ)開(kāi)銷,保證了模型高吞吐的性能。3 實(shí)驗(yàn)與實(shí)驗(yàn)分析
3.1 安全性分析
3.2 分區(qū)子網(wǎng)節(jié)點(diǎn)存儲(chǔ)開(kāi)銷測(cè)試
3.3 跨域測(cè)試
3.4 吞吐量測(cè)試
3.5 溯源信息驗(yàn)證效率測(cè)試
4 結(jié)束語(yǔ)
計(jì)算機(jī)工程與設(shè)計(jì)2022年12期