張超 李強 陳子豪 黎祖睿 張震
醫療信息是患者的寶貴資料,然而在目前國內各醫院的醫療系統中,這些信息大多不能相互通用,導致患者每到一個醫院需要重新辦理一張醫療卡,記錄患者的醫療信息.而患者以往的醫療信息很多時候只能夠通過模糊的記憶來獲取.雖然大部分醫院都會采用紙質病歷,但紙質病歷十分容易損壞或者遺失,是一種十分不可靠的醫療信息記錄方式.另一方面,使用傳統數據庫來實現醫療信息共享往往會因一些沒有職業道德的工作人員倒賣泄露,對患者造成進一步的損失.因此,醫療人員與患者迫切需要一種能夠在各醫院之間實現醫療信息共享,并能夠保證患者信息不會泄露的系統,而區塊鏈是目前實現這一系統的絕佳方式.
區塊鏈(Blockchain)是由多個獨立節點參與的分布式數據庫系統[1],能安全地存儲比特幣[2]交易或其他數據,并保證這些數據或信息的安全,防止被篡改和偽造.區塊鏈一般部署在P2P 網絡中,區別于常見的關系型數據庫和非關系型數據庫,區塊鏈使用數字簽名、哈希算法等加密算法及分布式共識算法,所存儲的數據極難被篡改、銷毀或被抹除數據庫操作日志.區塊鏈技術具有去中心化、時序數據、集體維護、可編程和安全可信等特點[3].
按照參與者的不同來劃分,區塊鏈可以分為公有鏈、聯盟鏈和私有鏈.公有鏈的參與者可以是任何人,所有想參與到公有鏈維護的人都可以加入,服務于比特幣的區塊鏈即是一種公有鏈.私有鏈指的是一個實體內部使用,信息不公開的區塊鏈.這里的實體可以是公司、銀行、醫院等,目前國內各銀行所研究的區塊鏈多為私有鏈.聯盟鏈指的是一種由多個實體構成,并且帶有準入限制的區塊鏈.聯盟鏈相對于公有鏈,并不是想加入就可以加入,而是需要得到一定許可,才可以準入,并且其所存儲的信息訪問權限受到這些實體的約束,僅在一定條件下才可以向外界公開.聯盟鏈相對于私有鏈,其區別在于參與的實體是多家不同的公司或集團,這些實體共同維護區塊鏈,并共享區塊鏈中的信息.
醫療區塊鏈中的實體是一家家醫院和醫療機構,這些實體之間行政、財務等完全獨立,是一個個不同的實體.同時這些實體接受政府監督與管理,且有嚴格的準入和分級制度,有一定準入限制.醫療數據既是一位患者的個人隱私,又涉及到國家機密,因此其訪問是有嚴格權限限制的.根據以上特點可以看出,醫療區塊鏈實際上是一種聯盟鏈.
目前的醫療區塊鏈系統大多采用POX 系列共識算法來達成分布式共識.區塊鏈共識算法指的是區塊鏈系統中達成分布式一致的算法,也就是區塊鏈系統檢測數據的合法性,并將區塊加入到區塊鏈系統里的確認機制.POX 系列算法目前主要有工作量證明(Proof of work,POW)、權益證明(Proof of stack,POS)和股份授權證明(Delegate proof of stack,DPOS).區塊鏈共識算法所要解決的問題是拜占庭將軍問題[4].該問題難解的原因在于,任何時候系統中都可能存在多個提案(因為提案成本很低),且要完成最終的一致性確認,該過程十分困難.POX 系列算法即通過增加提案成本,放寬最終一致性確認的需求來達成共識.POW 算法一般應用于公有鏈,需要較多節點和較大的算力來維護[5],POS算法生成區塊的過程取決于節點所持有的數字貨幣[5],DPOS 算法需要數字貨幣持有者選出一定數量(一般為101 個)的區塊生成者,且每隔一段時間會重新選舉區塊生成者[6].它們并不適應醫療區塊鏈的需求,即不需要大的算力維護,也不需要電子貨幣的產生,且節點數量較少、靈活可變.本文首次使用實用拜占庭容錯算法(Practical Byzantine fault tolerance,PBFT)[7],構建了一種既能以較少節點來啟動運行,又不需要大量算力來維護的聯盟式醫療區塊鏈(Medical chain).
實用拜占庭容錯算法(PBFT)[7]由Castro 和Liskov 于1999 年提出,用于解決原始拜占庭容錯算法效率不高的問題.該算法相較于原始拜占庭容錯算法,復雜度由指數級降低到多項式級[7],使得拜占庭容錯算法能用于實際應用中.
PBFT 算法是一種狀態機副本復制算法,每個狀態機的副本都保存了服務的狀態,同時也實現了客戶端所有合法請求的操作,能夠保證在滿足分布式系統活性和安全性的前提下,允許(n ?1)/3 個節點出錯(數據丟失、不工作等),其中n為分布式系統中所有參與共識過程的節點數量.即該算法能夠保證系統在(n ?1)/3 個節點出現故障或惡意操作的情況下,依然能正確達成分布式共識.
PBFT 算法中存儲副本的節點都在一個視圖(View)的輪換過程之中.在編號為v的視圖中,一個副本節點是主節點,其他副本節點是備份節點.主節點主要用來接收客戶端發送的請求消息,由公式p=vmod|R|計算選出,|R|表示存儲副本節點的個數.若主節點失效,則啟動視圖更換,更改當前的視圖編號v,再根據上面的公式選出主節點.PBFT算法的過程如下:
1)客戶端向主節點發送請求操作消息,主節點接收到請求操作消息并校驗正確后,保存該消息,并依據該請求操作消息生成預準備消息,廣播給各備份節點.
2)各備份節點接收到預準備消息并校驗正確后,保存該消息,并以該預準備消息為依據,生成準備消息廣播給主節點和其他備份節點.
3)各存儲副本的節點接收到準備消息并校驗正確后,保存該消息,并以該準備消息為依據,生成提交消息給客戶端、主節點和其他備份節點.
4)各存儲副本的節點接收到(2n+1)/3 個提交消息并校驗正確后,則執行來自客戶端的請求操作消息里的操作.
5)客戶端接收到(n+2)/3 個提交消息,驗證正確并接受后,便認為該消息已被副本節點集群所承認與執行.這里的客戶端接受(n+2)/3 個提交消息而不是(2n+1)/3 個的原因在于失效的節點數量不超過(n ?1)/3,因此(n ?1)/3+1 個一致響應必定能夠保證結果是正確的.PBFT 算法的三階段過程如圖1 所示.
目前區塊鏈的應用主要在金融方面,在醫療方面的應用相對較少,原因在于區塊鏈的關注點局限在比特幣等數字貨幣區塊鏈系統上.國內,薛騰飛等[8]利用改進的DPOS 共識機制提出了一種醫療機構聯盟服務器群(Medical institution federate servers,MIFS)和審計聯盟服務器群(Auditing federate servers,AFS)相結合的醫療區塊鏈系統MDSM.國外,Azaria 等[9]利用以太坊區塊鏈,實現了一個醫療區塊鏈與大數據相結合的醫療信息共享平臺MedRec[10].Ivan[11]分析了將區塊鏈作為保護醫療健康數據存儲的新穎方法、實施障礙以及從當前技術向區塊鏈解決方案逐步過渡的計劃.Shrier 等[12]采用美國麻省理工學院的OPAL/Enigma 加密平臺與區塊鏈技術相結合的方式,為醫療保健信息的存儲和分析創造了一個安全環境.Kuo 等[13]采用了隱私保護在線機器學習與私有區塊鏈技術相結合的模式.Witchey[14]介紹了醫療交易單(Transaction)驗證系統和方法.可以看出國內關于區塊鏈在醫療方面的應用與研究相對來說較少,且大多在應用層面上.

圖1 PBFT 算法三階段過程Fig.1 PBFT algorithm three phases process
在已有的醫療區塊鏈系統中,薛騰飛等以改進的DPOS 算法作為共識算法的區塊鏈系統,以及Azaria 等利用以太坊,即POW 算法作為共識算法的區塊鏈系統,所采用的共識算法都屬于POX 系列算法.其中,薛騰飛等的醫療區塊鏈啟動時需要擁有101 個節點的醫療機構聯盟服務器群(Medical institution federate servers,MIFS)以及擁有20 個節點的審計聯盟服務器群(Auditing federate servers,AFS),也就是說該醫療區塊鏈的啟動需要121 所醫院或醫療機構同時參與到區塊鏈維護中,因此啟動代價較大,不適合從早期探索到后期大規模成熟應用的漸進研究過程.Azaria 等使用的以太坊區塊鏈所采用的共識機制為POW 算法,其維護過程類似于比特幣,即互聯網中所有人都可以隨時參與或退出維護過程,算力浪費較大,且每次操作都需要支付一定的代幣作為報酬,并不適合醫療區塊鏈的使用.ModelChain[13]并不是一個專為醫療所設計的區塊鏈,其共識算法—信息證明(Proof of information,POI)將機器學習與工作量證明算法相結合,所需算力會更加龐大,因此也不適合醫療區塊鏈.
PBFT 算法僅需要4 臺以上的節點即可啟動,相對于基于POX 算法的區塊鏈系統,基于PBFT算法的區塊鏈系統的啟動代價小,適合早期探索與后期擴展,且不需要大量算力來維護.因此,本文將采用PBFT 共識算法來實現一種適合醫療系統的區塊鏈.
密碼學是一個區塊鏈系統最重要的組成部分,是實現區塊鏈功能的基礎.區塊鏈中涉及到的密碼學基礎主要包括加解密算法、哈希算法與數字摘要、Merkle 樹、數字簽名、數字證書和PKI 體系等.
加解密算法是密碼學中的核心技術之一,主要可以分為對稱加密和非對稱加密兩種.在對稱加密中,加密與解密的密鑰相同,其計算的效率較高,但密鑰在傳輸過程中容易泄露.在非對稱加密中,加密密鑰與解密密鑰不同.上面兩種密鑰一般公開一把,保密一把.被公開的密鑰稱為公開密鑰,簡稱公鑰,因此非對稱加密又稱為公開密鑰加密.被保密的密鑰稱為私有密鑰,簡稱私鑰.在本系統中主要采用非對稱加密技術對一些數據進行加密.其加密過程通過加密密鑰與加密算法,對這些數據進行加密,獲得密文.在解密時,通過解密密鑰與解密算法,重新獲得這些數據.常見的非對稱加密算法有RSA 和ECC 等.
哈希算法是把可變長度輸入串轉換成固定長度輸出串的一種算法,具有單向性、抗第二原像攻擊、抗強碰撞攻擊等性質.常見的哈希算法有MD5[15]、SHA1[16]、SHA2[16]等.而數字摘要即為明文經哈希算法計算后得到的固定長度輸出串,同樣的明文經同樣的哈希算法計算后,得到的摘要都是相同的,否則,其摘要必定不一致.在區塊鏈系統中,通過哈希算法,將區塊或交易單相關內容作為輸入,計算出摘要,來生成區塊或交易單的ID.
Merkle 樹[17]是一種存儲哈希值的樹,其葉子節點存儲的是每條數據的哈希值,非葉子節點存儲的是其所有孩子節點的哈希值.其優勢在于可以快速定位某條數據是否被篡改過.在本區塊鏈系統中,將各交易單ID 作為葉子節點構建Merkle 樹,用來快速定位被篡改過的交易單.
數字簽名是附加于被簽名數據的一個大整數,用以確定被簽名數據的完整性與簽署者的身份.在生成時,使用簽名算法、簽名者的私鑰,對被簽名數據進行計算,得到的結果即為數字簽名.在驗證時,利用簽名者的公鑰和數字簽名,來驗證被簽名數據的完整性.常見的數字簽名方案有RSA[18]簽名方案,數字簽名算法(Digital signature algorithm,DSA)[19]以及橢圓曲線簽名方案[20].在區塊鏈系統中,使用數字簽名技術對區塊、交易單相關信息進行簽名,來保證區塊、交易單的完整性與不可抵賴性,進而保護整條區塊鏈的安全.
數字證書由可信的證書頒發機構(Certificate authority,CA)生成,CA 的主要作用是使用自己的私鑰,對已經驗證身份的證書申請者的個人資料和公鑰進行簽名,生成證書.發送者A在發送原始數據、數字簽名時,也發送自己的數字證書,這樣接收者B在接收數據后,就可以根據數字證書驗明發送者A的數據.
證書頒發機構CA 屬于PKI 體系的一部分,它的功能是綁定證書持有者與密鑰,實現身份認證,為用戶提供證書申請、獲取、查詢、撤銷等功能,具有完整性、不可抵賴性和保密性[21]的特點.除CA 以外,PKI 體系還主要包括密鑰管理機構(Key management center,KMC)和管理證書撤銷列表(Certificate revocation list,CRL)等.KMC 主要用于對密鑰的生命周期進行管理,CRL 主要用于管理失效的證書清單.在Medical chain 中引入PKI體系,用以證明各區塊鏈參與者的身份信息,保證數據的完整性與不可抵賴性.PKI 體系相關機構可以部署在衛生管理部門,這雖然引入了一定的中心化,但可以通過將證書申請過程中的各種文件、圖片、視頻等信息存入區塊鏈,來防止這些中心化的操作可能會出現的惡意行為.
Medical chain 中的區塊鏈系統主要包括存儲管理、節點管理和用戶管理三個部分.存儲管理指的是邏輯上如何將醫療數據存儲到區塊鏈上,以及區塊鏈如何實際地存儲在各種存儲設備上.節點管理是對運行區塊鏈系統的各個節點的管理.用戶管理指的是對Medical chain 中的參與者的認證與權限管理.
區塊鏈存儲管理主要包括區塊、交易單和醫療數據存儲方面管理,是醫療區塊鏈最基本的構成部分.
2.1.1 醫療區塊鏈與醫療區塊
醫療區塊鏈主要由兩部分構成:區塊(Block)和交易單(Transaction).一條區塊鏈由一個個記錄著前一個區塊ID 的區塊組成,而每個區塊又包含了若干交易單.這些交易單是實際存儲區塊鏈(Blockchain)數據的載體.舉例來講,一條區塊鏈可以看作是一個數據庫,構成區塊鏈的每一個區塊可以看作是數據庫中的一張表,交易單可以看作是每張表上的一條記錄(Record).一條區塊鏈的構成如圖2 所示.

圖2 一條區塊鏈的構成Fig.2 Composition of a blockchain
每個區塊的具體構成如圖3 所示,一個區塊主要由區塊頭和區塊頭以外的內容構成.區塊頭表示的是需要進行數字簽名的部分.區塊頭中包含上一個區塊的ID,區塊生成者的公鑰,由交易單ID 生成的Merkle 樹根哈希值和生成區塊的時間戳.區塊頭以外的內容包括區塊生成者對于區塊頭的數字簽名,交易單ID 的個數,和保存在此區塊中所有的交易單ID.數字簽名是為了保證區塊內容不被篡改,并且確保區塊生成者在生成惡意區塊后無法抵賴.另外,區塊中僅保存交易單的ID,即僅保存指向某個交易單的索引,而不保存交易單本身,這樣便可使每個區塊容量降低,便于同步與備份.區塊、交易單物理上都是保存在數據庫里的,在邏輯上以區塊鏈的形式來存儲.在交易單設計存儲上,實際上只是在正常存儲于數據庫的數據上添加交易單ID,交易單類型、時間戳、公鑰、數字簽名等交易單字段信息,將所要存儲的信息作為交易單內容,形成邏輯上的交易單,其物理存儲上與一般數據存儲并無太大區別.
每個交易單中的內容如圖3 所示.交易單類型表示這個交易的類型,如增加、刪除、查詢和修改,以指示驗證器集群進行相應的操作,關于驗證器集群的介紹參見第2.2.3 節.之所以在增刪查改的操作時使用交易單而不是直接訪問某一擁有區塊鏈的節點,有兩個原因.首先某一節點可能進行惡意操作,違規暴露患者的信息,或是篡改患者的信息等.另一方面是為了將操作者的操作記錄在區塊鏈中,操作者在進行操作時需要使用自己的私鑰對交易單進行數字簽名,使得操作者對于自己進行過的操作無法抵賴.交易單內容是該交易單中所存儲的內容,如患者的醫療信息等.時間戳表示該交易單生成的時間,公鑰為交易單生成者的公鑰,交易單ID 為對交易單類型,交易單內容,時間戳和公鑰進行哈希運算后生成的哈希值.哈希算法和編碼算法可以選擇SHA-256[16]哈希算法或BASE64[22]編碼算法,其可靠性在各種區塊鏈系統中得到了檢驗.數字簽名是交易單生成者對交易單ID 的簽名,防止交易單被篡改.

圖3 區塊與交易單構成Fig.3 Composition of block and transaction
2.1.2 醫療信息交易單
交易單中存儲的內容,包括患者信息、醫生信息、醫療記錄信息、各節點的信息等.即交易單實際上是傳統數據庫每張表里每條數據記錄的載體,而交易單內容相當于每條記錄.交易單內容主要有如下幾類:
1)實體信息類.主要用于記錄患者、醫療人員等實體的詳細信息,如患者的身份證號、姓名、性別、年齡、婚姻狀況,聯系方式等個人信息,以及患者所擁有的密鑰中的公鑰信息.對于醫護人員,與患者較為相似,另外還要記錄其所在的醫院、科室、級別等.對于實體中的隱私信息,如姓名、聯系方式等,在存儲到區塊鏈之前,會采用非對稱加密技術,使用實體公鑰對這些信息進行加密,但不加密其公鑰信息,方便實體檢索自己的信息.在需要查看這些信息時,經實體授權,使用實體自己的私鑰進行解密,獲取這部分信息.
2)醫療信息類.主要用于記錄患者的相關醫療信息,如某患者P在某一時間到醫院H接受醫生D的門診時,則生成一條門診記錄,主要包括:就診時間,就診地點,就診的具體情況等.若患者進行了類似于B 超之類存在圖片或視頻的檢查,則對產生的圖片或視頻進行哈希運算獲得哈希值,存入到交易單里.這樣,當圖片或視頻被篡改時,其哈希值就會發生變化,與存儲在區塊鏈中的哈希值不符,從而保證多媒體資料的防篡改.該條醫療信息所在交易單ID 即為該條醫療信息的ID.圖片或視頻等較大的數據存儲在生成節點,并備份到醫療管理部門.醫療信息類交易單中的公鑰為產生該醫療信息交易單的醫療人員的公鑰與其所在醫療機構的公鑰,數字簽名為醫療人員的數字簽名和醫療機構的數字簽名.這樣在出現醫療糾紛等情況時,可以根據醫療信息交易單中的公鑰和數字簽名,來保證醫療人員和醫療機構的診斷或檢驗信息的不可抵賴性.對于不屬于醫療機構的有資質的醫療人員,則僅需醫療人員的公鑰和數字簽名即可.在醫療信息提交與修改方面,若醫療人員屬于某醫療機構,則當進行提交或修改操作時,需要通過其所屬的醫療機構.若有資質的醫療人員不屬于醫療機構,則可以直接進行.醫療人員與醫療機構的從屬關系也保存在區塊鏈當中.同時患者、法院、公安部門等可以通過向醫療管理部門申請提交或修改醫療信息,用來更正有問題的醫療信息.
3)實體–信息關聯信息類.該類信息主要用于關聯實體與醫療信息或其他敏感信息,因為該類信息需要進行加密操作,防止實體的隱私泄露.例如,當患者P就診后產生一條醫療信息R的時候,同時會產生患者P與醫療信息所在的交易單ID 的關聯信息,該交易單ID 由患者的公鑰進行加密.這樣患者P即可通過自己公鑰,找到該關聯信息,用自己的私鑰進行解密后,即可查詢到自己的相關醫療信息.這樣做的原因是:
a)包括患者的信息、就診產生的醫療信息都是存儲在醫療機構或者相關機構的數據庫中,這樣就不可避免存在數據庫管理員倒賣患者相關數據的情況.
b)通過加密患者的隱私數據和患者與自己就診記錄的關聯數據,即使信息被泄露,患者的隱私也不會被暴露.
4)增加、刪除、更新、查詢類.
a)進行增加操作時,所生成的交易單中的交易類型為“增加”,交易單內容為要增加的數據,如病歷信息等.
b)當進行刪除操作時,所生成交易單中的交易單類型為“刪除”,交易單內容為被“刪除”的交易單的ID.這里所說的“刪除”并不是將該交易單從區塊鏈中直接刪除,而是在進行查詢操作時,同時檢索刪除類型的交易單,排除該刪除交易單中所存儲交易單ID 所對應的交易單,從而實現區塊鏈的“刪除”操作.
c)當進行更新操作時,所生成交易單中的交易單類型為“更新”,交易單內容存儲更新前的交易單的ID、更新后的交易單ID、更新的時間和更新原因等內容.這里的“更新”并不是用新的交易單去覆蓋舊的交易單,而是更新的時候產生兩個交易單,一個是擁有修改過內容的交易單,另一個是記錄該交易單ID 和被更新的交易單的ID.在查詢時,排除被更新的交易單,從而實現區塊鏈的“更新”操作.
d)進行查詢操作時,所生成交易單中的交易類型為“查詢”,交易單內容為查詢條件.驗證器在接收到查詢交易單時,同時會檢索權限交易單,判斷查詢發起者是否擁有相應的查詢權限,以此防止患者信息被泄露.醫療區塊鏈中的數據主要有區塊鏈相關數據和醫療相關數據,區塊鏈相關數據在邏輯上構成一條鏈表,即通過一個區塊記錄上一個區塊的ID來構成一條無法篡改的鏈,最后一個區塊的安全由參與到區塊鏈維護的節點通過共識機制來保證.這里的無法篡改指的是,若某一區塊被區塊鏈系統接受后,則更改該區塊之前任意區塊中的內容,都會被檢測出來.而區塊鏈相關數據和醫療相關數據在物理存儲上是存儲在數據庫等相關存儲設備上的,例如在檢索醫療信息時,以醫療信息交易單的ID 為主鍵,查詢存儲在數據庫中該醫療信息所在的交易單,而不是通過遍歷區塊鏈.得到醫療信息后,客戶端通過交易單ID、交易單中的公鑰和數字簽名判斷該條醫療數據是否被篡改過.
在檢索信息時,并不需要去完整驗證區塊鏈,而是通過共識機制來保證區塊鏈、交易單和醫療信息的安全.需要校驗的情況主要包括:i)系統每隔一段時間校驗一遍各區塊鏈節點上的區塊鏈,檢測節點是否存在惡意行為或同步出錯等問題.新節點加入后,獲取到區塊鏈后,也需要對區塊鏈進行校驗.ii)區塊鏈中的區塊直接保存的是交易單的ID,因此可以將區塊鏈基本信息、區塊基本信息和區塊中保存的交易單ID 公開,外界拿到后,可以去校驗整條區塊鏈,起到外部監督作用.法院、公安部門需要強有力的證據時,需要通過衛生管理部門進行完整驗證.一般情況下,僅需通過共識過程去驗證即可.其他的一些需要完整驗證區塊鏈的情況可以根據需要,通過衛生管理部門來驗證.
5)權限類.其交易單中的交易類型為“權限”,交易單內容為具體的權限信息,例如患者可以授權醫生在某段時間內查看自己的之前的就診信息,過了該段時間后,醫生便不能再查看該患者的之前的就診信息了.
通過以上五大類型的交易單內容,可以保證患者的隱私不受到侵犯,患者就診中產生的各種醫療數據被篡改后可以被及時發現.同時,還可以實現將以前的醫療數據加入到區塊鏈中.例如,某醫院的數據庫中已保存了若干年的醫療數據,這些數據只要添加交易類型為“添加”,數據本身作為交易單內容,數據的時間戳作為交易單的時間戳,并加入醫院的公鑰,哈希運算后得到交易單ID,再用醫院的私鑰進行數字簽名,就可以產生一條完整的交易單.這些交易單再發送給驗證節點集群,經過驗證后就可以打包進區塊,并加入到區塊鏈當中.
2.1.3 醫療數據存儲
醫療區塊鏈的存儲需要結合醫療信息系統,即數字化醫院來統籌安排存儲措施.數字化醫院是指利用計算機、網絡、數據庫等信息技術,有機結合醫院業務信息和管理信息,實現文字、圖像、語音、數據、圖表等信息數字化采集、存儲、閱讀、檢索的醫院信息體系.其主要組成部分包括、醫院信息系統(Hospital information system,HIS),臨床管理信息系統(Clinic information system,CIS),醫學影像歸檔和通信系統(Picture archiving and communication systems,PACS),實驗室檢驗信息系統(Laboratory information system,LIS)和電子病歷(Electronic medical record,EMR)等.
HIS 是利用計算機及其網絡通信設備和技術,對醫院內外的相關信息進行自動收集、處理、存儲、傳輸和利用,為臨床、教學、科研和管理服務的應用信息系統[23].CIS 是應用于臨床治療過程中的信息系統,主要包括醫生工作站系統、護士工作站系統、輸血管理系統、手術麻醉管系統和臨床決策支持系統.PACS 是用來管理醫療圖像(如心電圖、腦電圖、超聲圖像)的系統.LIS 是指利用計算機技術、網絡技術、實現臨床實驗室的信息采集、存儲、處理、傳輸、查詢,并提供分析診斷支持的軟件系統.EMR電子病歷是由醫療機構以電子化方式創建、保存和使用的,重點針對門診、住院患者(或保健對象)臨床診療和指導干預信息的數據集成系統,是居民個人在醫療機構就診過程中產生和被記錄的完整、詳細的臨床信息資源[24].它們之間的關系如圖4 所示.

圖4 Medical chain 數據存儲架構Fig.4 Medical chain data storage architecture
根據衛生部《電子病歷基本架構與數據標準(試行)》[24],電子病歷的基本內容由:病歷概要、門(急)診診療記錄、住院診療記錄、健康體檢記錄、轉診(院)記錄、法定醫學證明及報告、醫療機構信息等七個業務域的臨床信息記錄構成.這些記錄可以分為兩類,即結構化數據和非結構化數據.結構化數據即一般的數值或文字性數據,這些數據通過添加交易單信息,作為交易單的內容,形成交易單存儲在一般數據庫中,如Oracle Database、DB2、MySQL等.通過收集交易ID 生成的區塊也存儲在這些數據庫中.通過數據庫分片將海量的結構化數據分布式存儲在節點的各個數據庫服務器上,通過數據庫備份技術備份這些數據.非結構化數據指的是醫療過程中產生的圖片與音頻數據,如CT、B 超、心音等.這些數據本身數據量較大,不適合在共識過程中進行傳輸,因此僅將這些數據的哈希值上鏈,同時根據醫院所處地區與級別,在市、省一級的衛生管理部門進行備份,防止這些數據的丟失.節點在存儲這些數據時,首先取其哈希值,作為結構化數據存儲起來.其次是對原始數據的存儲,主要分為三級:在線存儲,近線存儲和離線存儲.在線存儲和近線存儲采用存儲區域網絡(Storage area network,SAN)文件系統,SAN 文件系統是指通過SAN 存儲區域網絡將文件數據直接傳輸到存儲設備,或從存儲設備傳輸到SAN 文件系統[25].SAN 網絡使用高速光纖作為傳輸媒介,利用光纖通道(Fiber channel,FC)和小型計算機系統接口(Small computer system interface,SCSI)協議來實現高速共享存儲.在存儲介質上,在線存儲采用磁盤存儲時間較近(如半年)的數據,近線儲存采用磁帶庫(半年至兩年)存儲時間較遠的數據.離線存儲使用磁帶,實現以較低的費用長期保存時間久遠(大于兩年)的數據.與磁盤相比,磁帶存儲能夠以更低的成本實現存儲數據的耐久性與安全性.因為醫院節點存儲能力有限,各節點每隔一段時間就將這段時間內校驗過的來自其他節點的數據刪除.
一個區塊鏈系統最主要的節點是用來驗證交易單(Transaction)和區塊(Block)正確性的驗證器(Validator)、用來生成交易單的交易單生成器和用來生成區塊的區塊生成器(Blocker),它們在共識算法的規范下共同協作運行.以比特幣為例,其挖礦客戶端會接收互聯網上的所有交易單,進行校驗后,計算隨機數,生成區塊并廣播至全網.與比特幣區塊鏈組件類似,本區塊鏈系統中的節點也主要有客戶端、驗證器(Validator)和打包器(Blocker)三個組件,如圖5 所示.
2.2.1 共識算法
采用PBFT 算法作為醫療區塊鏈中的共識算法,是因為PBFT 算法是一種適用于聯盟鏈的共識算法,其優勢與優點在于:
1)PBFT 算法不需要像POW 算法那樣靠大量算力來避免“51% 攻擊”的發生,也不用像POS算法或DPOS 算法那樣需要靠代幣作為衡量投票權的標準,就可以允許系統中少于(n ?1)/3 個節點出錯(數據丟失、不工作等)的情況.
2)PBFT 算法作為一種拜占庭容錯算法(Byzantine fault tolerance,BFT)在系統中存在小于或等于(n ?1)/3 個故障或惡意節點的情況下,才能保證一次分布式共識過程正常執行[26],這就要求采用PBFT 算法的系統中的節點,在每次共識過程中至少有(2n+1)/3 個正常節點,因此這些節點所運行的環境必須是相對安全、穩定的.
3)醫療區塊鏈是一種聯盟鏈,參與到醫療區塊鏈中的實體有政府背書,具有一定公信力,并由衛生管理部門嚴格監管,出現惡意行為的情況遠遠少于比特幣等區塊鏈系統.同時經過多年的信息化發展,各醫院具有較為完備的網絡、服務器和數據庫系統.因此,現有醫療系統可以提供一個相對安全、穩定的運行環境供PBFT 算法正常運行.同時,因為運行PBFT 算法的集群中各個節點地位平等,不存在投票權高低的情況,避免醫療區塊鏈系統驗證交易單或區塊鏈時的中心化.因此PBFT 算法十分適合醫療區塊鏈.

圖5 Medical chain 節點管理Fig.5 Medical chain node management
目前還沒有采用PBFT 算法的醫療區塊鏈系統,本文創新性地使用了該算法,提出了一個十分適合醫療領域的聯盟式醫療區塊鏈系統.
2.2.2 客戶端
客戶端是用來生成交易單的組件,其主要的功能是增刪改查.區別與常見數據庫,如MySQL,這里的刪除和修改操作并不是直接從區塊鏈里刪除相應的交易單,而是重新生成一個新的交易單,覆蓋掉原來的.這是因為區塊鏈通過數字簽名與一個區塊記錄上一個區塊的ID,來保證區塊鏈中已有的內容不會被修改與刪除,并且覆蓋過的內容可以被追溯.客戶端主要分為三類:
1)患者客戶端:患者客戶端主要擁有的功能是增刪改查.在增加方面,患者可以增加授權信息,授權醫生或他人增刪改查自己的醫療信息.在刪除方面,患者可以刪除相關的授權信息.在修改方面,患者可以修改授權信息,修改自己的相關信息、如家庭住址等.在查看方面,患者可以查詢自己以往的醫療記錄,包括被修改或刪除前記錄.
2)醫生客戶端:醫生客戶端主要擁有的功能是增刪改查.在增加方面,醫生可以為患者增加醫療記錄,如門診記錄等.在刪除和修改方面,醫生可以在患者授權期限內,刪除有錯誤的醫療記錄,或者修改患者醫療記錄中存在問題的地方.同時,醫生也可以修改自己的一些信息,如自己的所就職的醫院、科室、專長等信息.在查詢方面,為保護患者的隱私、醫生可以在患者授權的前提下,查看相關患者的醫療信息,為患者做出更合適的診斷與治療.這些對患者的增加、修改、刪除和查看等操作需要在患者的授權情況下,且一定期限內進行.未經授權或授權過期情況下,系統將拒絕執行這些操作,并根據醫生的公鑰與數字簽名,將其加入到黑名單中.若在授權期間,醫生出現惡意行為,這些惡意行為是極難在區塊鏈中抹除的,此時患者可以將系統中所存儲的就診信息作為證據,通過醫學專家評審,追究醫生的相關責任.
3)查詢客戶端:查詢客戶端僅具有查詢的功能.一些機構可能需要查看一下患者的相關信息.如當醫院與患者出現糾紛時,公安機關或法院可能需要查看該患者的醫療記錄,以此為依據做出合理的判斷,這時候就需要授與公安機關或法院查看權限.
2.2.3 驗證器(Validator)
驗證器即為PBFT 算法中的副本節點.驗證器主要負責接收客戶端發來的交易單消息和打包器發來的區塊消息并進行驗證,兩種消息結構如圖6 所示.驗證器接收到客戶端發來的交易單消息或區塊消息后,首先校驗交易單消息和交易單本身的數字簽名是否正確,然后校驗交易單是否符合規定,例如一個患者在沒有獲得另外一個患者的授權情況下是無法獲得另外一個患者的醫療記錄的.校驗結束后,主節點驗證器則生成預準備消息,將該交易單消息加入到預準備消息中,廣播給各備份節點,經過PBFT 三階段過程后,各節點接受該交易單,并將該交易單存入到自己的數據庫中.驗證節器集群執行PBFT 三階段過程如下:

圖6 Medical chain 消息結構Fig.6 Medical chain message structure
1)主節點根據校驗過的客戶端消息,分配視圖編號v,序號n給該客戶端消息,生成預準備消息,生成后廣播給各備份節點,預準備消息的格式如圖6所示.
2)各備份節點接收到預準備消息后,校驗預準備消息的數字簽名,視圖編號v和預準備消息序號n,無誤后保存,并根據預準備消息生成準備消息,準備消息的格式如圖6 所示.各備份節點生成準備消息后,廣播準備消息至除自己外的所有節點(即主節點與備份節點).
3)各節點接收到準備消息后,校驗準備消息的數字簽名,視圖編號v和預準備消息序號n,無誤后保存.當某一副本節點接受了(2n+1)/3 個視圖編號v,預準備序號n相同,但是IP 與端口不同的準備消息后,根據準備消息生成提交消息,并廣播提交消息至除自己外的所有副本節點.提交消息的內容如圖6 所示.
4)各節點接收到提交消息后,校驗提交消息的數字簽名,視圖編號v和預準備消息序號n,無誤后保存.當某一節點接受了(2n+1)/3 個視圖編號v,預準備序號n相同,但是IP 與端口不同的提交消息后,則接收視圖編號為v,序號為n的預準備消息中所攜帶的交易單消息或區塊消息.接受后的操作是,保存交易單或區塊,或執行交易當中所攜帶的操作.
在一般區塊鏈中,“挖礦”節點(即Medical chain 中的驗證器節點)分為全節點和輕量級節點.全節點保有一份完整的、最新的區塊鏈及存儲在上面的所有數據,輕量級節點只保留了其中的一部分.在Medical chain 中,驗證器節點均為輕量級節點,每個驗證器節點保存所有產生自本醫療機構的數據,按照第2.1.3 節中的三級存儲方式進行存儲.對于來自其他醫療機構的數據,每個驗證器僅保存半年左右,并采用在線存儲的方式.同時每個節點完整地保存區塊鏈的信息,因每個區塊僅保存交易單的ID,所以整條區塊鏈并不會占用太大的空間.在這個基礎上,所有的醫療數據均同步至各級醫療管理部門,以備各節點校驗區塊鏈時使用.采用這種方式在一定程度上依賴于中心化的醫療管理部門,但大大減少了每個節點的存儲壓力.
2.2.4 打包器(Blocker)
打包器主要用來收集交易單的ID,生成Merkle樹[17],打包成區塊,并發送給驗證器(Validator)集群,經過PBFT 算法三階段過程后,加入到區塊鏈里.打包器生成區塊時需要獲得當前區塊鏈最后一個區塊的ID,因此一段時間內僅有一個區塊生成.比特幣區塊鏈中每10 分鐘生成一個區塊,區塊由“礦工”生成,礦工所做的工作便是挖礦.所謂的挖礦就是挖礦軟件不斷生成一個隨機數,與區塊頭相關內容一起做SHA-256 哈希運算后得到一個哈希值.若該哈希值小于一個給定的闕值,則礦工挖礦成功,生成一個區塊廣播至全網,并得到一筆報酬,即比特幣.在本區塊鏈系統中,每生成一個區塊都要經過驗證器集群校驗,若出現惡意區塊,則驗證器集群校驗時就會被發現,并不予接受.另外,本區塊鏈部署在各醫院,其服務器和網絡環境相對穩定,不會像比特幣那樣每時每刻都有主機加入與退出,并且服務器有專門的管理員管理,惡意操作的情況相對較少.考慮到上面兩個情況,本區塊鏈系統通過以下的方式來生成一個區塊:
1)首先將驗證器和打包器部署在一個醫院節點上,一個醫院節點包含若干臺服務器與數據庫,之所以部署在一起是因為每個醫院節點的數據庫中保存著驗證過的交易單信息,減少不必要的網絡傳輸.醫院節點如圖5 所示.
2)每個醫院節點在一段時間內校驗并接受若干交易單后,根據B=L%(N ?1)判斷當前區塊是否由自己來生成.其中B為當前需要生成新區塊的節點,L為當前區塊鏈的長度,% 為取余運算.考慮到主節點需要接收來自客戶端的消息,因此主節點不參與打包的過程,以實現各節點任務的負載均衡.
3)若醫院節點根據2)中公式檢測到當前需要自己生成區塊,則收集一定量的校驗過的交易單ID,生成Merkle 樹,打包成區塊,發送給主節點.經過PBFT 算法三階段過程后,將該區塊加入到個節點的區塊鏈鏈尾.之所以將交易單ID 加入到區塊中而不是交易單本身,是因為交易單ID 是對交易單本身進行哈希運算得來,是唯一的.若交易單內容被篡改,則對交易單中用來生成交易單ID 的內容進行哈希運算后到的值會與交易單ID 不同,因此區塊中僅存儲交易單ID 即可.
通過上面三種組件,可以保證在某一共識過程中出現惡意或故障的節點小于等于(n ?1)/3 時,共識過程依然可以正常完成.該正確性的驗證過程可參見文獻[26].
用戶管理主要用來管理參與到Medical chain中用戶的賬號、密鑰和權限,是實現身份認證與訪問控制的模塊.
2.3.1 賬戶管理
賬戶管理主要用來管理用戶登入、登出、密碼找回、公鑰綁定等功能.公鑰綁定將用戶的登錄賬戶與在密鑰與認證架構中用戶申請的公鑰綁定,通過實名認證與個人綁定,用來給用戶管理自己的信息.
2.3.2 密鑰與認證架構
在Medical chain 中為了保證區塊鏈系統的機密性、完整性與有效性,采用了非對稱加密、數字簽名、公鑰基礎設施(Public key infrastructure,PKI)認證體系等密碼學技術.機密性是指數據傳輸過程中,不能被非授權者看到.完整性是指數據在傳輸過程中,不會被篡改.有效性是指區塊鏈系統的參與者產生的數據不能被否認.密鑰與認證架構提供前面各節所用到的公鑰的生成、備份、認證等功能,其架構如圖7 所示.

圖7 Medical chain 密鑰與認證架構Fig.7 Medical chain key and authentication architecture
1)所有參與到Medical chain 系統中的個人、機構與設備均需向證書頒發機構(Certificate authority,CA)中心申請屬于自己的密鑰與證書.在申請時,根據申請者的類別,需要提交相關的資質信息,如患者的個人身份證件、醫療從業與醫院雇傭證明等.
2)CA 中心驗證密鑰證書申請者的身份資質,通過后向密鑰管理中心(Key management center,KMC)提交創建申請者密鑰的請求.KMC 接收請求后,生成密鑰對,添加標志字段等信息之后,保存在安全的數據庫中.這里的標志字段是指能夠標志一個申請者的字段.如患者可以通過添加證件號來標志,醫療機構可以通過醫療機構編號來標志.
3)KMC 發送密鑰對給申請者,申請者接收到密鑰后,存儲在服務器、個人電腦、手機或其他加密設備上,并對私鑰采用基于口令加密(Password based encryption,PBE)方法進行加密,在使用時再進行解密.PBE 是一種根據口令生成密鑰并使用該密鑰進行加密和解密的方法[27],讓申請者可以通過口令來安全保存密鑰.同時KMC 將公鑰返回給CA,用于生成數字證書.
4)CA 根據申請者的相關信息與KMC 返回的公鑰生成數字證書,證書可以采用X.509 標準,它由ITU-T 提出,其詳細信息見文獻[28].數字證書生成后,返回給申請者,申請者通過比對KMC 返回的密鑰與CA 返回的數字證書判斷是否有誤,若出現問題,則需重新申請.
5)Medical chain 中的參與者在發送消息時均需對消息進行數字簽名,發送給其他參與者的消息包含三部分:數字證書、數字簽名、消息本身.也可以僅發送公鑰而不發送數字證書,接收者通過公鑰和數字簽名,向CA 中心確認發送者的身份.
6)當某個參與者接收到其他參與者的消息后,需要通過CA、CRL 來驗證消息發送者的身份有效性,證書驗證成功后,接著驗證數字簽名的有效性.上述兩項驗證均成功后,則該消息便為一條有效的消息.
由于CA、KMC、CRL 包含了大量安全信息,因此需要部署在安全可靠的環境下.Medical chain是一種聯盟式的區塊鏈,帶有一定的中心化,因此密鑰與認證體系可以部署在國家衛生和計劃生育委員會與各省級衛生和計劃生育委員會,這樣既可以保證信息的安全性,又可以實現負載均衡,分擔各地區的服務器訪問壓力.
患者的信息是通過患者自己的私鑰解密的,信息加密過程為:首先患者使用公鑰加密除公鑰以外的個人敏感信息(如身份證號、姓名、聯系方式、住址),接著對公鑰、非敏感信息和加密后的敏感信息進行數字簽名.當患者的私鑰不慎丟失時,可通過自己的身份證件重新從KMC 處換取自己的密鑰.當患者的私鑰出現安全性問題時,及時通過個人證件與吊銷密鑰申請,重新申請新的密鑰,用舊私鑰解密自己的信息后,再用新申請的公鑰加密,以此來保證安全問題.另外在一些特殊情況下,如患者失去自我意識、醫療糾紛的情況時,醫療機構、公安機關或法院可以通過醫療管理機構向KMC 來獲取,及時應對.獲取的過程也要生成帶有相關操作信息的查詢交易單,作為記錄保存.
2.3.3 權限管理
權限管理功能是醫療區塊鏈中十分重要的一部分,它直接關系到醫療區塊鏈的安全性,以及是否能妥善保護患者的隱私等方面.醫療區塊鏈的參與者大致分為三類,包括:衛生管理部門、醫療機構和醫療服務接受者.衛生管理部門主要分為國家級、省級和市級,在中國則對應于國家衛生和計劃生育委員會、省衛生和計劃生育委員會和市衛生和計劃生育委員會.醫療機構中主要由醫療人員和管理人員構成,醫療人員是醫療機構中提供醫療服務的人員,如醫生、護士等,管理人員是維持醫院正常運行的人員,如人力、財政等.醫療服務接受者包括患者和患者的家屬.針對這種特點,Medical chain 采用基于角色的訪問控制模型(Role-based access control,RBAC)來實現權限管理.RBAC 將用戶映射到角色,用戶通過角色享有許可.該模型通過定義不同的角色、角色的繼承關系、角色之間的聯系以及相應的限制,動態或靜態地規范用戶的行為[29].Medical chain 中的角色分為三大類:衛生管理部門、醫療機構和醫療服務接受者.如圖8 所示.

圖8 Medical chain 角色與權限Fig.8 Medical chain role and authority
1)衛生管理部門是Medical chain 運行的監管部門,在三類角色中管理權限最高.其中國家級管理部門擁有最高的管理權限,可以賦予省級管理部門權限.省級管理部門可以在自己的權限范圍內賦予市級管理部門權限.這里的衛生管理部門不包括公安、法院等部門,當它們需要介入到系統中或者需要系統中的信息時,需要通過衛生管理部門授權.
2)醫療機構是Medical chain 中提供醫療服務的部門,分為醫療人員和管理人員兩類角色.醫療人員角色可以在病人授權的期限內,查看患者以往在外院或本院的醫療信息.在就診過程中,為患者增刪改相關的醫療信息.在期限以內可以查看自己問診過的患者的醫療信息.管理人員是醫療機構中沒有直接涉及到醫療過程中的角色,其可以授權醫療人員查看未在自己處就診的患者的醫療信息(不包括隱私信息).同時可以通過衛生管理部門,查詢其他醫療機構的醫療信息.
3)醫療服務接受者是接受醫療服務的角色,主要分為患者和家屬兩種角色.患者可以對自己的個人信息和醫療信息進行查詢、更改、刪除、增加和隱藏,家屬可以在患者的授權之下,對患者的信息進行以上操作.當患者不具備行為能力時,可以通過醫療管理部門獲取授權.
與一般授權系統不同的是,Medical chain 中的權限信息存儲在區塊鏈中,極難被篡改.另外采用智能合約的方式,執行增刪改查操作.智能合約(Smart contract)由Szabo[30]于1995 年提出,他對智能合約的定義為:智能合約是一系列以數字形式指定的承諾,包括各方履行這些承諾的協議.簡單來講,智能合約就是發布在區塊鏈上的一段代碼,在某個時間觸發合約中的條款時,代碼就會自動執行.這些代碼在Medical chain 中由衛生管理部門發布,并在全網公開,通過這種方式實現透明的權限管理.
2.3.4 隱私與安全
Medical chain 在隱私與安全保護上主要通過人為干預和系統安全模塊來保證.在人為干預方面主要通過:1)嚴格篩選系統管理維護人員.2)設置明確的管理維護準則.3)對系統管理人員進行權限劃分與監督.通過這些方面保證系統能夠安全穩定的運行,降低惡意行為或其他故障的發生頻率.在系統安全模塊方面主要通過:1)利用“密鑰與認證架構”來限制參與人員與標志參與人員的身份.2)利用“權限管理”模塊來保證參與到Medical chain中的各方能夠在規定權限下,正常使用其所需功能.通過衛生管理部門分級,實現有效的權限監管與分配.3)通過對電子病歷(Electronic medical record,EMR)的分類存儲,實現醫療數據在Medical chain中安全高效穩定地存儲.4)通過Medical Chain 中的驗證器(Validator)和打包器(Blocker)組件,采用PBFT 共識算法,保證系統可以處理節點的惡意行為與運行故障,且保證存儲在區塊鏈中的醫療數據不被篡改或抵賴.
本節通過一個患者P從醫院HA轉診到醫院HB接受醫生D的門診治療的過程,展示本區塊鏈的基本工作流程.其中,患者的私鑰與公鑰存儲在患者的手機當中.
1)首先患者的P信息存儲在區塊鏈當中的一個交易單中,患者的信息有:身份證號、姓名、性別、年齡、公鑰PUB_KEY_P.其中身份證號、姓名是經過非對稱加密的,而性別、年齡是沒有經過加密的.醫生D的信息與患者類似.
2)患者P得有疑難雜癥I,在得知醫院HB在該疾病上的治療效果較好,準備從醫院HA轉診到醫院HB.
3)患者P到達醫生D的診室,患者P使用手機,根據公鑰PUB_KEY_P 生成一個查詢交易單,用自己的私鑰進行數字簽名SIG_P,向系統獲取含有自己信息的交易單.系統通過公鑰PUB_KEY_P和數字簽名SIG_P 在“密鑰與認證架構”中校驗P的身份,驗證成功后,返回含有患者信息的交易單.該查詢交易單會被保存在每個驗證節點的本地數據庫中,等待打包器打包進新的區塊.患者通過私鑰解密后,將解密后的信息(不包括患者的私鑰),發送給醫生客戶端,展示在醫生的電腦上.同時根據公鑰PUB_KEY_P 獲取患者P在醫院HA時就診的交易單ID,進而獲取患者P在醫院HA時的就診信息.獲取患者P在醫院HA的就診記錄是通過公鑰得到實體信息關聯交易單,進而得到就診記錄交易單的過程得到的,該過程與獲取患者信息的過程類似.醫生D了解患者P在醫院HA的就診記錄,并經過一番問診,確認了患者P的病情,在門診系統中輸入患者的目前病情與新的治療方案,點擊保存.醫生點擊保存后,生成一個ID 為TX1、類型為增加、公鑰為醫生的公鑰PUB_KEY_D和醫院HB的公鑰PUB_KEY_HB,數字簽名為醫生使用自己的私鑰PVT_KEY_D 進行簽名的數字簽名SIG_D 和醫院HB使用醫院私鑰PVT_KEY_HB 進行簽名的數字簽名SIG_HB,內容為“公鑰=PUB_KEY_P,病情=目前病情,治療方案=新的治療方案”的交易單.然后生成一個ID 為TX2,類型為保存、公鑰為醫生的公鑰PUB_KEY_D 和醫院HB的公鑰PUB_KEY_HB,數字簽名為醫生使用自己的私鑰PVT_KEY_D 進行簽名的數字簽名SIG_D 和醫院HB使用醫院私鑰PVTKEY HB 進行簽名的數字簽名SIG_HB,內容為“公鑰=PUB_KEY_D,門診記錄ID=TX1”的交易單.根據上面兩個交易單生成一條交易單消息TXM,發送給主驗證器節點V AP.其中V AP=vmod|R|計算得到,v表示當前的視圖編號,|R|表示存儲副本節點的個數.交易單消息的結構見圖6.
4)主驗證節點V AP接收到這條交易單消息TXM 后,驗證后進行保存.驗證器集群完成三階段過程后便接受交易單TX1,TX2.
a)首先主節點根據TXM 生成預準備消息PPM,并保存到本地數據庫中,然后廣播給驗證節點V A1,V A2,V A3.
b)V A1,V A2,V A3接受主節點發來的預準備消息后,生成準備消息PM1,PM2,PM3,并保存這兩條消息到本地數據庫,接著廣播PMn給除本節點外的其他所有節點.
c)各節點接受了3 條來自不同節點的準備消息PM 后,便生成提交消息CMP,CM1,CM2,CM3,并保存這兩條消息到本地數據庫,接著廣播提交消息CMn到除本節點外的所有節點.
d)各節點接受至少3 條來自不同節點的提交消息CMn后,便接受交易單TX1,TX2.此時,交易單共識過程結束.
e)已知目前區塊長度為1,最后一個區塊ID 為1,當前驗證器節點數為4,經過一段時間后(如10分鐘),各驗證器節點開始根據公式B=L%(N ?1)來判斷當前區塊是否需要自己來生成.此時B=1%(4?1)=1,故此時各驗證器節點知道下個區塊的生成為者V A1,V A1開始收集一定數量,且包含TX1,TX2的交易單ID,生成區塊Block,其中保存前一個區塊的ID.區塊生成后,V A1將新生成的區塊發送給主驗證器節點,主驗證器節點接受到該區塊消息后,驗證區塊生成者的數字簽名判斷該區塊的生成者是否為V A1,之后生成預準備消息廣播至其他備份節點,這些節點也會根據預準備消息中存儲的區塊消息,來驗證區塊是否為V A1生成.經過PBFT 三階段過程后,將該區塊加入到各節點的區塊鏈中.
f)此時,患者的就診信息已被保存在區塊鏈中.考慮非法操作的情況:
i)若患者的門診信息TX1遭到泄露,因竊取者并不知道該信息屬于哪位患者,故并不會對患者產生影響.若關聯信息TX2遭到泄露,竊取者沒有患者的私鑰,理論上無法解密其中信息,因此也不會知道患者的具體醫療新信息,對患者不會產生影響.
ii)若患者的就診信息遭到篡改,原交易單ID與重新計算的交易單ID 不同,則證明該交易單遭到了篡改;若交易單ID 與重新計算的交易單ID 相同,則通過到區塊鏈中查看交易單ID 是否存在便可知道交易單是否被篡改;若某一驗證器節點中的交易單被惡意刪除,因為其他節點還保存該交易單,因此還可以從其他節點獲取.
以上便是Medical chain 針對一個患者轉診中進行的一系列操作.其他的過程與本過程相似,在遇到新的需求時,可以以此為依據進行實現.如患者通過查詢交易單獲取自己的數據時,其過程與上文中醫生添加新的醫療記錄類似.
另外,在上述過程中,若醫院節點出現惡意行為時,可以根據如下流程來檢測和防止惡意行為的發生:
a)若主節點V AP出現惡意行為:
i)主節點丟棄患者信息,不予進行共識,則醫生就診客戶端隔一段時間后發現患者信息符合規范的情況下,沒有入鏈,則認為主節點失效,更換主節點.
ii)主節點篡改患者信息,則主節點發送給各備份節點的預準備消息中的客戶端消息數字簽名驗證失敗,備份節點檢測出來后,進行視圖更換過程,更換主節點.
iii)若主節點V AP在廣播準備消息或提交消息時出現惡意行為時,參見下面b)中的解決方式.
b)若副本節點V Ai出現惡意行為:
i)V Ai丟棄主節點V AP發送的預準備消息或接受預準備消息后不廣播準備消息,接受來自節點V AP或V Aj(ij)準備消息后不廣播提交消息,則不影響PBFT 算法共識過程,并在檢測出V Ai的惡意行為后,將其排除.
ii)V Ai發送惡意的準備消息或提交消息.對于驗證節點V AP或V Aj在接收到V Ai發來的惡意準備消息或提交消息后,會校驗該準備消息.對比提交消息的視圖編號v,消息序號n和預準備消息簽名PPMsgSign與自己所保存的預準備消息中的視圖編號v,消息序號n和預準備消息簽名PPMsgSign是否一致,若不一致則會丟棄該準備消息或提交消息.
本節涉及到認證的過程,系統都會根據交易單或區塊上的公鑰與數字簽名驗證其所對應的身份,驗證成功后,根據保存在區塊鏈中的權限判斷其行為是否合法.
采用對比分析的方式來對比已有醫療區塊鏈系統與本醫療區塊鏈系統,目前主要的醫療區塊鏈系統有MDSM[8]、MedRec[10]與ModelChain[13],與現有解決方案對比結果如下:
由表1 對比可知,使用PBFT 作為共識算法的Medical chain:

表1 Medical chain 與現有醫療區塊鏈對比Table 1 Medical chain vs.existing medical blockchain
1)相對于使用改進DPOS 算法MDSM,所需要的啟動節點個數遠遠少于MDSM,且MDSM 需要人為設定每個醫院是否具有投票的權力與投票在決定最終結果中的比例.
2)相對于使用POW 算法的MedRec,所需維護區塊鏈系統的節點數遠遠少于MedRec,不需要支付給區塊鏈系統共識參與節點報酬,且不需要大量算力去維護區塊鏈系統.
3)ModelChain 采用了私有區塊鏈的形式,其所需節點個數不確定.但由于工作證明共識機制容易受到“51%攻擊”,即節點通過掌握全網超過51%的算力就有能力成功篡改和偽造區塊鏈數據[3],因此需要較多的節點來“平均”算力,防止這種攻擊的發生.所以相對于使用POI 算法的ModelChain,不需要支付給共識參與節點報酬,需要的節點數也較少,并且POI 算法基于POW 算法,因此所需的算力也較大.
因此,可以看出,采用PBFT 共識算法更加適合醫療區塊鏈系統.其不需要支付報酬、所需啟動與運行節點少、后期可擴展、不需要進行“挖礦”運算,算力需求小,且不需要人為設置投票權比重的特點,對各醫院或其他醫療機構公平,因此與醫療系統中的需求與特點相契合.
醫療區塊鏈系統在算力需求方面的分析是基于其所采用的共識機制.算力需求的大小判定基于以下方面:
1)采用改進DPOS 共識機制的MDSM 的區塊生成方式是由醫療機構聯盟服務器群(Medical institution federate servers,MIFS)中的101 個記賬節點輪流生成區塊鏈,之后醫療機構聯盟服務器群中其他100 個節點,以及審計聯盟服務器群(Auditing federate servers,AFS)中的20 個校驗節點會對該區塊進行校驗.采用改進DPOS 共識算法的MDSM 的區塊由101 個節點的醫療機構聯盟服務器群輪流生成,因此每生成一個區塊除生成Merkle樹外,僅需2 次哈希運算用來計算前一個區塊的ID和對新生成的區塊進行數字簽名.采用PBFT 共識算法的Medical chain 中的區塊由備份節點們輪流生成,與MDSM 類似,每生成一個區塊,除生成Merkle 樹外,僅需2 次哈希運算來計算本區塊的ID 與對新生成的區塊進行數字簽名.但在生成區塊后,MDSM 中的需要固定的接受擁有100 個節點的醫療機構聯盟服務器群和擁有20 個節點的審計聯盟服務器群校驗,而Medical chain 中新生成的區塊接受校驗的次數為n ?1,n為當前集群節點的個數,并且醫療區塊鏈中的節點個數通常不會太大,因此Medical chain 對于MDSM 在算力需求上相對靈活,總體相差不大.
2)采用POW 共識機制的區塊鏈大多為公有鏈,其維護者參與維護的動力在于賺取虛擬貨幣,以謀求較高的利潤.POW 共識機制的原理在于“礦工”不斷尋找一個隨機數,誰先找到便生成一個區塊,將一定數量的比特幣獎勵給這個“礦工”,而其他礦工需要在這個新區塊后繼續挖礦,之前的哈希運算變為完全無用的工作.因此POW 機制會刺激“礦工”們提高自己的算力,盡快找到這樣一個隨機數,而當每個“礦工”都不斷購買硬件增加自己算力,新的“礦工”不斷加入時,總算力便會飛速增長到海量的程度.這里算力指的是做哈希運算的能力.MedRec 基于以太坊,以太坊是一個開放式的區塊鏈平臺,任何人都可以在以太坊中建立和運行區塊鏈應用,但需要支付一定的“以太幣”.以太坊的平臺維護方式與比特幣類似,采用工作量證明的共識方式,任何人都可以隨時加入或退出到以太坊的維護過程中,因而造成大量的算力白白浪費.因此,采用工作量證明共識機制的MedRec 所需的算力是巨大的.截止到2018 年2 月1 日以太坊全網總算力已達到264 THash/s[31],即以太坊全網每秒可以進行264×1012次哈希運算.以AMD RX580 顯卡為例,該顯卡的算力大約為25 MHash/s,即以太坊全網總算力大約相當于108張AMD RX580 顯卡的總算力,而每張AMD RX580 顯卡約為2 600~3 000元,因此僅顯卡就需要耗費將近260~300 億元,還有相關的其他設備、電力等,因此所造成的資源浪費是十分嚴重的.而比特幣全網算力截止2018 年2月1 日已達到19.59 EHash/s[32?33],相當于此時以太坊全網算力的8.9 萬倍,所造成的浪費更為嚴重.
3)采用POI 共識機制的ModelChain 將隱私保護在線機器學習[34?35]與私有區塊鏈網絡整合,使用隱私保護在線機器學習來預測患者重新入院風險的模型,使用工作量證明(POW)作為共識機制,因此與MedRec 類似,其所需的算力依然是巨大的.并且ModelChain 還采用了線上機器學習,這對硬件進一步提出了更高的要求.
4)采用PBFT 共識機制的Medical chain 由備份節點輪流負責生成區塊,不需要進行大量無用的“挖礦”運算,因此Medical chain 所需的算力較小.
經過多年的醫療信息化的發展,目前中國醫療信息化已經較為成熟,各大醫院已基本實現各種醫療過程的信息化,醫療過程更加標準、完備.但醫療信息化依然面臨者諸多問題,急需解決.醫療信息化所面臨的問題,與Medical chain 所提供的解決方式如表2 所示.

表2 醫療信息化問題與Medical chain 應對方式Table 2 Medical informatization issues and medical chain's solutions
目前,區塊鏈技術越來越受到國內外研究者們的關注,并在他們的研究探索下,一步步走向完善與成熟.醫療區塊鏈作為區塊鏈技術應用的一種,在實現醫療數據的安全共享與存儲方面有著顯著的優勢,是區塊鏈技術應用研究中的一個重要的發展方向.本文提出的聯盟式醫療區塊鏈系統采用PBFT 共識機制,能夠保證以很小的算力來實現系統安全穩定的運行.同時該系統以較少的節點啟動,有助于區塊鏈技術在醫療信息方面的應用推廣.聯盟式醫療區塊鏈系統Medical chain 在一致性確認(共識)及區塊生成加入上仍存在效率不高等問題,未來的研究將采用拜占庭容錯算法與非拜占庭容錯算法相結合的共識方式,來提高系統的運行效率.