李 莉,楊祉坤,張 超,吳 怡,陳云鵬
(東北林業大學 信息與計算機工程學院,黑龍江 哈爾濱 150040)
目前,現有醫藥溯源將所有藥品統一化管理,主要有兩種方式。一種是傳統數據庫的醫藥溯源方式,系統將所有相關醫藥溯源信息存放在中心數據庫中,也就是中心記賬。另外一種是利用區塊鏈技術進行去中心化。單鏈區塊鏈技術解決了中心化記賬方式的信息存儲安全等問題[1],但也不可避免擁有著自身缺陷,主要表現為:單鏈區塊鏈吞吐率低以及可伸縮性不高,不能滿足醫藥溯源的大數據量與大交易量的處理需求[2,3];并且每個節點均需要存儲所有的醫藥數據,存儲開銷較大,對節點設備要求過高;此外,多條鏈之間無法進行信息交互,存在信息孤島的現象。
為解決以上問題,本文在圖型區塊鏈(directed acyclic graph區塊鏈,DAG區塊鏈)基礎上,構建出基于圖型區塊鏈的分級醫藥溯源模型。該模型改進了DAG區塊鏈的數據層和共識層,提升信息驗證效率,增大了吞吐量。并且在原有的圖型區塊鏈結構上加以改進,對區塊鏈進行分區處理:在醫藥溯源信息存儲前通過標志字段進行醫藥分級,實現不同級別醫藥信息存儲在不同的區塊鏈分區中。模型還將全網節點劃分為主網絡和多個子網絡,以減輕節點存儲壓力。
2008年,比特幣創始人中本聰發表了比特幣白皮書,介紹了世界上第一個分布式加密貨幣,開啟了區塊鏈1.0。而以以太坊為代表的區塊鏈2.0在智能合約系統的支撐下,拓寬了區塊鏈的應用場景。智能化物聯網時代的區塊鏈3.0在行業應用方面體現了應用場景的較大差異,該時代下的區塊鏈技術具備企業級屬性,可以在更好地解決信任問題的同時,大幅提升系統的運作能力。
2013年,研究者首次提出將DAG算法[4]引入區塊鏈中作為共識算法,即“GHOST協議”。DAG區塊鏈雖然也是分布式賬本技術,但不同于單鏈區塊鏈。單鏈區塊鏈的主要特征是會產生一條由區塊連接形成的單鏈,而DAG區塊鏈是從交易出發,生成一個有向無環圖。兩者在本質上都繼承了分布式賬本的優點。DAG區塊鏈的最小單元是交易,先前的交易要被驗證,后面的交易才能順利進行,而驗證結果則通過單元的形式記錄下來。這也就使得DAG區塊鏈具有了傳統區塊鏈沒有的并行處理能力。
圖型區塊鏈結構如圖1所示,其中G區塊為創世紀區塊,1~16區塊為普通的存儲醫藥信息區塊,箭頭指向表示每個區塊加入DAG區塊鏈網絡時與前面已經存在區塊的驗證關系,其中15區塊、16區塊是未被后續驗證的區塊。

圖1 圖型區塊結構
關于醫藥溯源系統的研究,禹忠等設計了基于區塊鏈的醫藥防偽溯源系統,此系統在超級賬本(Hyperledger)的Fabric區塊鏈平臺上開發[5],將所有品類藥品統一化管理,但仍然存在著數據量較大時,系統的吞吐率過低和單節點的存儲開銷大的問題。
為提高區塊鏈吞吐量,現有3種解決方式:
(1)提高出塊效率。Micali教授提出了Algogrand算法[6],算法改進了拜占庭共識機制,通過VRF產生委員會,并通過BA*產生一致性輸出。
(2)變相增大區塊大小。通過增大區塊的大小也可以提高區塊鏈的吞吐量,但網絡延遲會隨著區塊的增大而提高,所以不能單純地增大區塊。康奈爾大學博士后Ittay Eyal等提出了bitcoin-ng協議[7]將大區塊拆分成小區塊。此外,針對增大區塊大小的問題,康奈爾大學的 Elaine 教授提出了Thunderella 協議[8]。
(3)分片技術。Elastico[9]、Omniledger[10]等系統引入了分片技術,對系統進行水平擴容,減小單個節點的存儲開銷進一步提高吞吐量。
2.1.1 分級模型整體設計
《中華人民共和國藥品管理法》對藥品按照性質進行分類,如中藥材、中成藥、抗生素、化學原料藥及其試劑、放射性藥品、疫苗、診斷藥品等。本模型按照這種分類方法對醫藥進行分級,并對每一級的醫藥標準名稱通過非對稱加密算法進行處理,生成唯一的標識,該標識在本文中稱為標志字段值。
模型把全網節點劃分為主網絡和多個分區子網絡,主網絡存儲所有區塊信息,各個子網絡存儲不同標志字段值的醫藥溯源信息,也就是每個子網絡存儲一種分級的醫藥信息。并且模型將這些子網絡中的節點IP地址存儲在Tag數據庫中(該數據庫存儲數據為:醫藥屬性標志字段和節點IP地址的對應關系),該數據庫由全網節點共同存儲。
該模型交互終端涉及4個組織:醫藥廠商、經銷商、醫院和消費者。業務邏輯圖如圖2所示。醫藥廠商將醫藥出廠信息(包括藥材原材料的選取、醫藥加工過程、藥品成分、出廠日期等)上傳,模型根據上傳醫藥名稱到Tag數據庫中查詢該醫藥對應的標志字段值和存儲該分級醫藥信息的子分區節點IP地址,將對應標志字段值與醫藥信息一同加密,并選取打包區塊節點,被選節點打包區塊上鏈存儲并等待驗證,驗證后廣播到全網。經銷商與醫院將醫藥發送到其他經銷商、醫院、消費者時,同樣需要進行上述流程將流通信息交給相應的節點打包區塊進行上鏈存儲。消費者可通過指定終端查詢某醫藥溯源信息。

圖2 業務邏輯
2.1.2 DAG區塊鏈分區設計
基于圖型區塊鏈的分區結構如圖3所示。

圖3 分區結構
(1)將醫藥溯源區塊網絡劃分多個分區,方便用于醫藥溯源場景,減少存儲開銷。
本文建立在區塊鏈網絡分區技術的基礎之上,并且將整個DAG區塊鏈劃分出一條主鏈和多個子DAG鏈。醫藥廠商的醫藥生產信息作為主鏈存儲的信息,多個子鏈分別存儲經銷商或醫院等中間商上傳的不同標志字段值的醫藥信息區塊。而整個網絡環境中,主網絡存儲DAG區塊鏈上所有區塊,分區子網絡存儲主鏈信息和該分區標志字段值所對應的DAG子鏈。
(2)實現跨域信息交互,不同分區子網絡節點進行交互。
跨域交互處理流程如圖4所示,具體步驟如下:

圖4 跨域交互
(1)發送跨域交互信息的節點查詢Tag數據庫,判定信息的標志字段值是否在數據庫中。如果存在根據匹配的結果(目標分區子網絡節點的IP地址)選取節點,并將信息發送給該節點,進行步驟(2)。否則拋出異常,終止交互。
(2)被選節點根據請求信息重新構建一個區塊。
(3)分區子網絡所有節點完成信息驗證、信息廣播以及信息存儲。
2.2.1 區塊數據存儲結構
區塊解碼后,其中信息包含如表1所示的字段。

表1 區塊數據結構
在實際操作過程中,節點向網絡發送一條溯源信息,需要提供以下參數:
(1)Autograph:每個節點擁有唯一的獨有的私鑰用于對請求上鏈的信息進行簽名。得到的簽名數據中包含本節點身份標志。
(2)Address:指定醫藥接收方公鑰地址。
醫藥廠商、經銷商、醫院通過RSA算法(公私鑰對生成算法)生成公鑰和私鑰,并根據公鑰取值可以得出公鑰地址。公鑰生成地址算法如圖5所示,具體步驟如下:

圖5 公鑰地址生成
1)將公鑰依次進行SHA256、RIPEMD160運算得出公鑰地址哈希值(Public Key Hash)。
2)將得到的哈希值直接在前端拼接版本號屬性,生成21字節數據。
3)將本21字節數據(稱之為A)復制生成21字節數據B。
4)數據B進行兩次連續的SHA256。
5)取(4)得到的結果前4個字節數據與數據A進行拼接,得到25字節數據。
6)將(5)得到的數據進行BASE58編碼操作得出最終的公鑰地址(Address)。
(3)Count:指定醫藥流通的數量。
(4)Tag:標志字段。
(5)Message:醫藥溯源信息。其中包括醫藥敏感數據和非敏感數據。敏感數據是醫藥的生產過程中的核心資料,不可直接記錄到區塊鏈上,必須對其做一定處理,模型利用非對稱加密算法對其進行加密。對于非敏感數據,即醫藥的基本信息和流通信息,無需加密,直接存儲。
(6)MessageHash:溯源信息數據哈希值。運算公式如下(其中‖表示拼接)
HashData1=Hash(SentiveData)HashData2=Hash(InsentiveData)HashData=HashData1‖HashData2MessageHash=Hash(HashData)
(1)
在節點打包區塊時還需添加以下關鍵數據:
父節點哈希值:當節點預將所生成區塊加入DAG區塊鏈網絡中時,需選取兩個網絡中區塊進行驗證。驗證成功后將兩區塊的信息分別進行SHA256算法運算,得到的兩組256 bit數據作為本區塊的父節點哈希值。
隨機數與目標哈希:為了避免無代價攻擊,區塊在加入區塊鏈網絡前,要進行一次自我pow工作量證明運算。生成區塊之前,需設置本區塊的目標哈希值,即設置本次pow工作難度。目標哈希值越小,工作運算難度越大。區塊不斷設置隨機數的取值,直到
Hash(區塊數據+隨機數)≤目標哈希值
(2)
此時的隨機數為最終取值。
2.2.2 標志字段分區處理
選取字段Autograph和Tag作為分區標志。標志字段的分區處理流程如圖6所示。

圖6 標志字段處理
字段Autograph與Tag的處理規則是:
(1)加入對字段Autograph的檢查,通過Autograph值判斷該條數據是否為醫藥廠商上傳。若是,則至(2);否則至(3)。
(2)廣播主網和分區子網節點更新網絡,并且等待全網驗證,驗證后存儲,處理結束。
(3)判斷Tag字段是否是本節點應存儲的Tag值醫藥信息。若是,則域內認證并廣播等待驗證、存儲,處理結束;否則至(4)。
(4)進行跨域交互,查詢Tag數據庫。若數據庫中不存在該Tag值,拋出異常,處理結束;否則至(5)。
(5)根據Tag數據庫中該Tag值對應的IP地址,選取處理節點,被選節點進行打包區塊、廣播區塊、等待驗證、存儲。
流程偽代碼如下:
算法1:標志字段處理
輸入: Autograph,Address,Count
Tag,Message,MessageHash
輸出: isSendSuccess
//打包區塊成功標志, sendData()的返回值
//sendData()表示打包、 上傳區塊
Begin
api;
If (Autograph == Manufacturer) do
information=transfer(Autograph,Address,
Count,Tag,Message,MessageHash);
Return sendData(information);
//判斷是否為主鏈信息。 若是, 則打包區塊。
Else if(Tag==nowTag)
information=transfer(Autograph,Address,
Count,Tag,Message,MessageHash);
sendData(information);
//判斷信息標志字段值是否符合為本節點存儲條件。 若符合, 則該節點打包區塊。
Else if((ip=mysql(tagip)!=null)
newapi;
information=transfer(Autograph,Address,
Count,Tag,Message,MessageHash);
sendData(infomation);
Else
Throw anexception
//判斷標志字段是否在Tag數據庫中。 若在, 則選擇節點打包區塊; 否則拋出異常。
End;
用戶通過客戶端發送溯源信息上鏈請求,直到信息確認,需要經過圖7中所示流程。其中,從發送上鏈請求至創建區塊由一個或兩個節點完成,信息的存儲、傳播、確認由本子網全部節點共同完成。

圖7 共識過程
發送上鏈請求的客戶端(本節稱為節點A)根據數據中標志字段確定存儲網絡位置。若存儲位置為節點A所在子網絡,后續操作由節點A完成;否則交給存儲位置所在網絡的另一個客戶端(本節稱為節點B)進行處理。
節點A或節點B創建數據的基本信息后,通過MCMC算法選擇本分區子鏈或主鏈的其它區塊進行驗證,驗證結束后對該區塊使用SHA256算法不斷嘗試不同的隨機數值,直到哈希值小于目標哈希,最終創建好區塊,即區塊上鏈前節點進行自我pow運算。此過程與IOTA系統[11]相似。
模型規定一個區塊要加入區塊鏈網絡,必須要驗證已存在的兩個區塊,即需要證明這兩個區塊中的數據與已被確認的區塊沒有沖突。本模型使用MCMC的tips選擇算法進行兩個區塊的選擇。MCMC的tips選擇算法是馬爾科夫鏈與門特卡洛算法的結合。MCMC的tips選擇算法的步驟如下:
(1)選擇全部累積權重在[W,2W]之間的區塊。W是個足夠大的數。其中累計權重是指區塊自身工作量證明難度值與所有證明該區塊的區塊工作量證明難度值的和。
(2)將N個粒子放到(1)中選中的區塊上。
(3)粒子分別隨機行走。行走指向區塊網絡中的tips。若當y區塊證明了x區塊,說明x能夠轉移到y。
(4)若y證明了x,Hx、Hy分別為區塊x、y的累積權重,則粒子從x轉移到y概率正比于exp(-α(Hx-Hy)), 計算公式為
(3)
其中,α為可調節參數且為正數。
刪除很快到達tips的粒子,因為這些tips是懶惰的。找到最先到達tips的兩個粒子。若兩個tips沒有沖突,則輸出這兩個tips;否則,另選兩個沒有沖突的tips。
偽代碼如下:
算法2:MCMC的tips選擇
輸入:block1,block2…blockn
輸出:tips1,tips2
Begin
Particle[]particles;
//粒子在累計權重為[W,2W]的區塊上分布
For(i=0;i If(blocki.weight>=W&&blocki.weight<=2W) particles.insert(blocki); Foreach(particles) //粒子根據轉移概率隨機行走 particles.randomWalk(Pxy); If(firstParticle==tips&&secondParticle==tips) //判斷最先到達的兩個tips是否包含信息沖突 If(!conflict(firstParticle,secondParticle)) break; ReturnfirstParticle,secondParticle; End; 模型用“確認置信度”來表示醫藥溯源信息區塊被其它區塊的接受程度。驗證該區塊的區塊數與運行選擇算法(MCMC)次數的比值為確認置信度,只有當確認置信度達到97%時,認為該區塊是被完全確認的。 在模型運行期間可能存在大權重攻擊,攻擊者可憑借超強的計算能力對模型進行攻擊。攻擊者發布許多小型交易驗證沖突交易,并且可能會操控大量“女巫”節點,不去驗證末端交易,進而產生新的區塊網絡。針對該攻擊本節進行以下分析: W(n)為發布一個自身權重為3n的區塊所需的工作量證明時間,并且是以μ3-n為參數的指數分布隨機變量,其中μ是有關攻擊者攻擊能力參數。假設時間過去t0個時間單元,區塊累計權重為w0以上,視為該區塊被完全確認。經計算在t時刻區塊累計權重H(t)公式如下 (4) 其中,h為節點打包上傳區塊的平均時間,W為勃朗函數。可得知累計權重的增長速度呈線性,速度為λw。λ為交易流入的速度,w表示一般交易的均值權重。那么在接受交易時合法分支的典型累計權重是 wl=λwt0 (5) 若攻擊者發布的大權重沖突交易想超過合法分支的權重,應在t0內產生權重為3n0≥w1的沖突交易,其中 (6) 并且該事件發生的概率為 (7) 攻擊者還可以尋找一個權重為3n(n>n0) 的沖突交易,合法分支的累計權重不超過3n,計算概率 (8) 下面分析自身權重不超過1時攻擊的成功概率。假設G1,G2,G3…是以μ為參數的獨立同分布指數分布隨機變量,分別表示發布一個權重為1的交易工作量證明時間,期望值為μ-1,記為 Vk=μGk,k≥1 (9) V1,V2,V3…是以1為參數的獨立同分布指數分布隨機變量。攻擊者成功的條件是w0無意義交易所花費時間總和小于t0,其成功概率為 (10) 其中 φ(α)=-lnα+α-1 (11) 可得知,在調整階段累計權重的增長小于λw, 所以通常情況下有 (12) 無論如何成功的概率不超過 (13) 進而驗證本文模型具有很強的安全性,大權重攻擊、女巫攻擊可能會對本模型產生威脅,但都可以通過模型自身機制來實現預防。 搭建好網絡以后,首先向網絡發送任意條數目溯源信息,啟動4個分區網絡節點并完成連接,即完成子網絡存儲初始化。分別針對表2中兩種情況進行實驗,兩種情況各發出1500條信息(包括應存儲在主鏈的醫藥出廠信息500條、應存儲在4個不同子鏈的4種不同性質藥品的溯源信息各250條)。對上鏈請求的發出者分情況測試,情況1的發出者為4種藥品性質對應的子網絡中的節點;情況2的發出者均不是對應的子網絡中的節點。 表2 實驗條件 實驗以情況1、情況2的順序進行測試,并且記錄各個子網絡中某節點的數據庫大小。 對子網絡節點的數據庫分析得出,各個子網絡成功接收符合該子網絡對應標志字段的250條數據以及500條主鏈信息。并且子網絡有效隔絕了其它子網絡中不符合本子網絡數據規則的數據。圖8為各個子網節點、主網絡節點數據庫接收數據前后的大小變化。主網絡節點存儲區塊網絡所有數據,所以其節點的存儲開銷較大,相比之下子網絡中節點的存儲壓力大大減少。 圖8 節點數據庫大小對比 傳統區塊鏈溯源系統沒有進行分區存儲,其所有節點要存儲區塊網絡的全部數據(相當于本實驗中的主網絡節點)。本模型劃分了若干分區子網,每個分區子網的節點只需存儲部分區塊網絡數據,減少了存儲開銷。 測試環境與3.2節中相同,子網絡1存儲中成藥類藥品信息,子網絡2存儲抗生素類藥品信息,子網絡3存儲中藥材信息,子網4存儲疫苗信息。 子網絡1中的節點A,預將抗生素類(設其標志字段為Tag 2)藥品信息存儲到區塊網絡中。節點查詢Tag數據庫,找到子網絡2所有節點IP地址,并構建一個跨域區塊。實驗結果表明,子網絡2中節點B成功接收到了節點A發送的信息,跨域交互成功執行。隨著跨域數據量的增加,模型執行時間的變化如圖9所示。從圖9可以看出,隨著數據量的增加,跨域交互的效率逐漸降低,與子網內部處理的情況相比,數據庫的查詢和區塊信息的傳遞造成了額外的時間開銷。 圖9 時間開銷對比 此外,本實驗與傳統區塊鏈溯源模型也進行了隨數據量增加,時間開銷的對比。實驗結果表明(如圖9所示),在區塊網絡數據量較小時,傳統單鏈區塊鏈模型消耗時間較少,但隨著數據量的增大,本文模型并未因跨域操作失去高處理效率的優勢。 模型在4 核 1.5 Ghz CPU、16 GB內存的主機上進行測試。網絡帶寬40 M/S,操作系統為Ubuntu 14.04.1,評測指標包括吞吐率和確認延遲。在硬件情況完全相同的情況下,模擬用戶行為使區塊鏈網絡不斷接收事務請求。完成上鏈事務請求數以及確認延遲時間見表3。隨著上鏈請求次數的增加,確認延遲時間也有所增長,但請求的平均響應時間符合用戶需求,具有較好的網絡響應效果,可以使用戶獲得良好的體驗。 表3 請求數與響應時間 將本文模型與現有研究中其它針對提高吞吐量模型進行吞吐量以及性能比對,其中Algorand、bitcoin-ng、OmniLedger分別通過變相增大區塊大小、把參與者分片以及將區塊分為主區塊和微區塊兩種角色來提升模型吞吐量。 在藥品信息溯源的應用背景下,實驗結果見表4。處于相同環境下,本模型吞吐量基本穩定在6400 TPS以上,相較比特幣系統提升了910倍,相較其它模型的380 TPS、6000 TPS、5600 TPS的吞吐率也有較大提升。其它3種提升吞吐率的算法存在數據安全性高,易造成網絡擁堵的缺陷。本文模型保證了效率,但是在鏈上區塊較少時,驗證速度相對較慢。 表4 算法對比 由于模型將DAG區塊網絡劃分為多個分區,各個分區只存儲相應標志字段醫藥溯源信息,查詢時只需搜索對應分區,目標區塊范圍大大縮小。所以在保證溯源信息查詢正確的前提下,驗證效率也有所提高。 現有溯源系統查詢命令發出后的平均響應時間為20 ms至25 ms。現與3.4節測試環境相同的情況下,進行查詢的正確性與速度測試。實驗結果如圖10所示,圖中橫軸坐標代表當前查詢為第幾次請求,縱軸為當前查詢響應時間,單位為ms。實驗結果表明,本模型查詢正確率為100%,每次查詢的請求響應時間圍繞16 ms上下波動。 圖10 查詢請求響應時間 本方案基于對區塊鏈溯源系統安全性、吞吐量以及節點存儲開銷的考慮,提出了多域下的DAG區塊鏈模型。模型平衡了確認延遲和存儲開銷等制約因素,設計了標志字段的處理規則,實現了將DAG區塊網絡分區,并且將全網節點劃分為主網絡和子網絡。實驗結果表明,模型在具有良好的抗大權重攻擊、女巫攻擊的安全性基礎上,有效減少節點存儲開銷,保證了模型高吞吐的性能。3 實驗與實驗分析
3.1 安全性分析


3.2 分區子網節點存儲開銷測試



3.3 跨域測試

3.4 吞吐量測試


3.5 溯源信息驗證效率測試

4 結束語