孫學(xué)波,姜金希
(遼寧科技大學(xué) 計(jì)算機(jī)與軟件學(xué)院,遼寧 鞍山 114051)
在醫(yī)療康復(fù)診斷與治療的過程中,醫(yī)療信息的記錄是不可缺少的一個環(huán)節(jié),主要包括檢查項(xiàng)目、治療項(xiàng)目、醫(yī)療設(shè)施使用項(xiàng)目以及消費(fèi)記錄。由于醫(yī)療信息的隱私性和目前醫(yī)療信息記錄存儲方法的局限性,大部分患者對于自己的醫(yī)療信息記錄并沒有充分的了解和使用,這成為影響醫(yī)療質(zhì)量及發(fā)展的主要因素。除此之外,醫(yī)療信息安全地共享和使用更成為醫(yī)療行業(yè)的難點(diǎn)。
區(qū)塊鏈技術(shù)通過哈希索引形成鏈?zhǔn)浇Y(jié)構(gòu),是由多方共同經(jīng)營維護(hù)的數(shù)據(jù)庫,區(qū)塊鏈采用數(shù)據(jù)多節(jié)點(diǎn)、分布式多重存取,擺脫對互聯(lián)網(wǎng)中心服務(wù)器的依賴,避免中心服務(wù)器篡改和丟失數(shù)據(jù)[1]。其核心在于通過密碼技術(shù)確保存儲在區(qū)塊鏈上的數(shù)據(jù)記錄很難被篡改或者造假。Kuo等[2]采用區(qū)塊鏈私鏈網(wǎng)絡(luò)技術(shù)創(chuàng)建一個跨機(jī)構(gòu)的醫(yī)療健康預(yù)測模型。Ekblaw等[3]提出一個新穎的去中心化電子病歷管理系統(tǒng)。
根據(jù)區(qū)塊鏈技術(shù)和醫(yī)療系統(tǒng)的特點(diǎn)[4],本文以傳統(tǒng)醫(yī)療信息記錄存儲的局限性為背景,設(shè)計(jì)一種基于區(qū)塊鏈的醫(yī)療系統(tǒng)。此系統(tǒng)可以解決目前醫(yī)療系統(tǒng)中心化存儲存在的問題?;趨^(qū)塊鏈技術(shù)的醫(yī)療系統(tǒng)可以保證信息的安全,同時(shí)患者可以通過系統(tǒng)及時(shí)了解自己的信息,有利于患者對醫(yī)療信息的使用和管理,方便患者的同時(shí)可以提高醫(yī)療保障的效率。
麻省理工學(xué)院Azaria等開發(fā)了一個名為ΜedRec的系統(tǒng)[5],解決數(shù)據(jù)的互操作性和權(quán)限管理問題,用于管理醫(yī)療記錄。該系統(tǒng)的運(yùn)行原理如圖1所示。
該系統(tǒng)創(chuàng)新的關(guān)鍵在于采用新穎的區(qū)塊鏈智能合約,為跨醫(yī)療機(jī)構(gòu)分散的醫(yī)療數(shù)據(jù)創(chuàng)建記錄管理系統(tǒng),即使用區(qū)塊鏈保存和管理電子病歷,以滿足患者、醫(yī)療機(jī)構(gòu)和醫(yī)學(xué)研究人員的需求。
ΜedRec提出三類智能合約,即登記合約(RC)、醫(yī)患關(guān)系合約(PPC)和總結(jié)合約(SC),實(shí)現(xiàn)數(shù)據(jù)的權(quán)限管理。登記合約用來管理用戶信息表,公鑰作為其身份實(shí)現(xiàn)患者匿名登錄;醫(yī)患關(guān)系合約定義了一系列指針和相關(guān)訪問權(quán)限,通過指針訪問數(shù)據(jù)庫中的數(shù)據(jù),用于一個醫(yī)生對一個患者的醫(yī)療信息的管理;總結(jié)合約用于管理一個患者所產(chǎn)生的所有醫(yī)療信息數(shù)據(jù)的集合。
在ΜedRec系統(tǒng)中,醫(yī)療數(shù)據(jù)并不存儲在區(qū)塊鏈上,而是依然存儲在醫(yī)療機(jī)構(gòu)本地?cái)?shù)據(jù)庫中,所以不能充分地保證醫(yī)療數(shù)據(jù)的安全性和防篡改性。
圖1 系統(tǒng)流程圖Fig.1 Flow chart of system
醫(yī)療系統(tǒng)的發(fā)展過程經(jīng)歷三個階段[6],分別為基于C/S(客戶機(jī)和服務(wù)器)結(jié)構(gòu)的醫(yī)療系統(tǒng)、基于B/S(瀏覽器/服務(wù)器模式)和C/S混合結(jié)構(gòu)的醫(yī)療系統(tǒng)、基于B/S結(jié)構(gòu)的醫(yī)療系統(tǒng)[7]。
2.1.1 基于C/S結(jié)構(gòu)的醫(yī)療系統(tǒng) 早期的醫(yī)療系統(tǒng)使用了基于C/S的體系結(jié)構(gòu),這種醫(yī)療系統(tǒng)僅限于醫(yī)療機(jī)構(gòu)內(nèi)部使用。服務(wù)器主要用于存儲數(shù)據(jù)并通過內(nèi)部局域網(wǎng)為客戶端請求做出響應(yīng)。用戶僅局限于醫(yī)療機(jī)構(gòu)的內(nèi)部人員,甚至不包括患者。這種系統(tǒng)中,信息的管理方式是中心化的??蛻簦ɑ蛴脩簦┲g的信息交流也必須通過服務(wù)器才能完成,客戶之間一般不能實(shí)現(xiàn)交互。
2.1.2 基于B/S和C/S混合結(jié)構(gòu)的醫(yī)療系統(tǒng)
隨著互聯(lián)網(wǎng)的發(fā)展,人們對基于C/S結(jié)構(gòu)的醫(yī)療系統(tǒng)進(jìn)行了進(jìn)一步的改良,出現(xiàn)了基于B/S結(jié)構(gòu)的醫(yī)療系統(tǒng)。從安全性和效率的角度考慮,建立基于B/S和C/S混合結(jié)構(gòu)的醫(yī)療系統(tǒng)。
基于B/S和C/S混合的體系結(jié)構(gòu)有效地?cái)U(kuò)大了系統(tǒng)服務(wù)的范圍,為系統(tǒng)增加更多醫(yī)療方面或醫(yī)療相關(guān)的服務(wù),但數(shù)據(jù)管理方式仍然是中心化的并且是封閉的,互聯(lián)網(wǎng)的介入,使得系統(tǒng)的安全性增加了新的隱患。另外,在醫(yī)療系統(tǒng)的運(yùn)作過程中,醫(yī)療過程本身的復(fù)雜性也為這種模式下數(shù)據(jù)本身的真實(shí)性和可信度提出新的挑戰(zhàn)。
2.1.3 基于B/S結(jié)構(gòu)的醫(yī)療系統(tǒng) 基于B/S結(jié)構(gòu)的醫(yī)療系統(tǒng)用戶界面完全通過WWW瀏覽器實(shí)現(xiàn)。數(shù)據(jù)庫服務(wù)器沒有專門的應(yīng)用程序,醫(yī)生客戶端、查詢?yōu)g覽客戶端、修改維護(hù)客戶端、輔助檢查及治療客戶端、財(cái)務(wù)客戶端、管理客戶端和患者服務(wù)客戶端等應(yīng)用程序基本上都在服務(wù)器端,應(yīng)用程序的升級和維護(hù)都可以在服務(wù)器端完成,非常方便。圖2為基于B/S的醫(yī)療系統(tǒng)體系結(jié)構(gòu)。
區(qū)塊鏈最初作為比特幣系統(tǒng)的底層技術(shù)被應(yīng)用于比特幣[8]。區(qū)塊鏈?zhǔn)怯啥鄠€區(qū)塊相互鏈接構(gòu)成的一種鏈?zhǔn)浇Y(jié)構(gòu),每個區(qū)塊由前一區(qū)塊哈希、Μerker根、目標(biāo)哈希、時(shí)間戳、隨機(jī)數(shù)和交易數(shù)據(jù)等構(gòu)成,并且由分布式存儲、加密算法、P2P網(wǎng)絡(luò)和共識機(jī)制等多個核心技術(shù)組成。
本文基于區(qū)塊鏈基本結(jié)構(gòu)創(chuàng)建了可編程的腳本代碼(即智能合約),賦予區(qū)塊鏈存儲醫(yī)療數(shù)據(jù)和醫(yī)患交互的功能[9]。在有智能合約功能的區(qū)塊鏈平臺、前端的調(diào)用以及各種接口和圖形化的客戶端的基礎(chǔ)上,開發(fā)醫(yī)療系統(tǒng),其層級架構(gòu)如圖3所示。
圖2 基于B/S結(jié)構(gòu)的醫(yī)療系統(tǒng)Fig.2 Μedical system based on B/S hybrid structure
圖3 區(qū)塊鏈醫(yī)療系統(tǒng)層級架構(gòu)Fig.3 Hierarchy of blockchain medical system
物理節(jié)點(diǎn)層:每個節(jié)點(diǎn)進(jìn)行共識備份和相互連接,網(wǎng)絡(luò)中每個節(jié)點(diǎn)與節(jié)點(diǎn)相連,沒有中心化的管理,每個節(jié)點(diǎn)都擁有服務(wù)器的功能[10],都記錄整個系統(tǒng)中所有交易信息。
平臺層:包括數(shù)據(jù)層、網(wǎng)絡(luò)層和共識層。數(shù)據(jù)層給整個系統(tǒng)提供巨大的存儲空間,區(qū)塊內(nèi)存儲交易數(shù)據(jù)或普通醫(yī)療數(shù)據(jù)。網(wǎng)絡(luò)層基于P2P網(wǎng)絡(luò)、作為消息傳播機(jī)制和數(shù)據(jù)驗(yàn)證機(jī)制,其作用是創(chuàng)建節(jié)點(diǎn)和實(shí)現(xiàn)安全的網(wǎng)絡(luò)連接,為系統(tǒng)建立穩(wěn)定和牢固的網(wǎng)絡(luò)體系。共識層就是在不同節(jié)點(diǎn)之間建立信任,解決數(shù)據(jù)共享中的信任問題。
平臺層的上一層是以太坊虛擬機(jī)EVΜ和遠(yuǎn)程過程調(diào)用協(xié)議RPC。RPC保證基于以太坊區(qū)塊鏈開發(fā)的程序在節(jié)點(diǎn)之間的相互通信。整個開發(fā)系統(tǒng)的核心是基于以太坊虛擬機(jī)EVΜ(Ethereum virtual machine)建立代碼運(yùn)行環(huán)境[11]。
合約層:合約層是本系統(tǒng)設(shè)計(jì)的重要步驟[12],系統(tǒng)的所有功能及業(yè)務(wù)邏輯均通過編寫智能合約以及前端的調(diào)用實(shí)現(xiàn)。本文采用的智能合約編程語言為solidity,經(jīng)過編寫后通過web3.js發(fā)送到solc編譯器上編譯成以太坊識別的二進(jìn)制碼。
應(yīng)用層:應(yīng)用層是系統(tǒng)開發(fā)出的去中心化應(yīng)用,其中以太坊源碼中提供一套基于JS的SDK—web3.js,開發(fā)者可以在自己的瀏覽器網(wǎng)頁中通過調(diào)用web3.js執(zhí)行以太坊所有的相關(guān)操作。前端通過區(qū)塊鏈上的合約地址、接口和nonce值對其進(jìn)行調(diào)用。
從醫(yī)療系統(tǒng)的發(fā)展現(xiàn)狀、運(yùn)行效率和運(yùn)營成本等角度出發(fā),本文提出一個比較現(xiàn)實(shí)的基于區(qū)塊鏈的系統(tǒng)體系結(jié)構(gòu),如圖4。相對于傳統(tǒng)的B/S體系結(jié)構(gòu),增加一個名為區(qū)塊鏈結(jié)點(diǎn)服務(wù)器的新構(gòu)件,可以為醫(yī)療系統(tǒng)提供區(qū)塊鏈數(shù)據(jù)服務(wù)。
在這個體系結(jié)構(gòu)中,區(qū)塊鏈結(jié)點(diǎn)服務(wù)器直接與Web服務(wù)器相連接,從而使系統(tǒng)的所有節(jié)點(diǎn)均可以通過該結(jié)點(diǎn)訪問區(qū)塊鏈系統(tǒng)。系統(tǒng)工作時(shí),用戶可以根據(jù)需要將醫(yī)療信息存儲到區(qū)塊鏈上或訪問存儲在區(qū)塊鏈上的數(shù)據(jù),有效提高系統(tǒng)的服務(wù)能力。區(qū)塊鏈系統(tǒng)使用的信息將不再局限于某個特定的醫(yī)療系統(tǒng)存儲和管理的數(shù)據(jù),突破了中心化的數(shù)據(jù)管理方式,醫(yī)療過程中產(chǎn)生的各種醫(yī)療數(shù)據(jù)也可以有選擇地存儲到區(qū)塊鏈中,從而進(jìn)入一個更大的數(shù)據(jù)空間,這將極大地提高數(shù)據(jù)的共享程度。另外,區(qū)塊鏈技術(shù)中的去中心化、可追溯和防篡改等特性為人們提供一個更為安全可靠的管理和使用醫(yī)療信息的方式。
圖4 基于區(qū)塊鏈的醫(yī)療系統(tǒng)的體系結(jié)構(gòu)Fig.4 Hierarchical architecture of blockchain-based medical system
2.3.1 醫(yī)療信息的存儲策略 醫(yī)療系統(tǒng)的核心工作是對每個患者的醫(yī)療過程進(jìn)行有效的管理,醫(yī)療信息就是在這個過程中持續(xù)產(chǎn)生并不斷存儲到系統(tǒng)的數(shù)據(jù)庫中。從系統(tǒng)工作效率、醫(yī)療過程的風(fēng)險(xiǎn)指數(shù)、疑難程度和用戶需求等因素出發(fā),一個合理的存儲策略系統(tǒng)為不強(qiáng)制要求將所有患者的所有病歷信息存儲到區(qū)塊鏈中,而是僅存儲那些有研究價(jià)值、醫(yī)療風(fēng)險(xiǎn)指數(shù)較高和用戶要求存儲的那部分病歷。
從存儲的時(shí)機(jī)考慮,可采用聯(lián)機(jī)實(shí)時(shí)存儲和批處理兩種方式。聯(lián)機(jī)實(shí)時(shí)存儲策略要求將對區(qū)塊鏈的訪問嵌入在必要的醫(yī)療信息處理過程中,即每產(chǎn)生一份醫(yī)療數(shù)據(jù)即在存儲到系統(tǒng)數(shù)據(jù)庫的同時(shí)將這份數(shù)據(jù)完整地存儲到區(qū)塊鏈中。批處理方式則指一個完整的醫(yī)療過程結(jié)束之后,再將這個過程中產(chǎn)生的醫(yī)療數(shù)據(jù)完整地存儲到區(qū)塊鏈中去。
這兩種方式各有優(yōu)缺點(diǎn)。聯(lián)機(jī)實(shí)時(shí)方式主要優(yōu)點(diǎn)是能夠最大限度地保證數(shù)據(jù)的原始性和真實(shí)性,數(shù)據(jù)幾乎沒有機(jī)會被篡改。但數(shù)據(jù)存儲到區(qū)塊鏈耗時(shí)較高,會影響醫(yī)療系統(tǒng)的運(yùn)行效率,也會增加系統(tǒng)實(shí)現(xiàn)的難度。批處理方式特點(diǎn)與聯(lián)機(jī)實(shí)時(shí)性恰好相反,會簡化系統(tǒng)中醫(yī)療信息處理模塊的復(fù)雜度,僅需要在系統(tǒng)中單獨(dú)設(shè)計(jì)一個區(qū)塊鏈相關(guān)的子系統(tǒng)用來處理區(qū)塊鏈數(shù)據(jù)的訪問,但這種方式也增大了數(shù)據(jù)被篡改的風(fēng)險(xiǎn)。
一個比較好的策略是兩種方式并存,使用時(shí)可以事先選擇是否將數(shù)據(jù)存儲到區(qū)塊鏈中,在醫(yī)療過程中或結(jié)束后,也可以選擇是否繼續(xù)將醫(yī)療數(shù)據(jù)存儲到區(qū)塊鏈中去。
2.3.2 系統(tǒng)的基本功能 將區(qū)塊鏈醫(yī)療信息系統(tǒng)看成是一個相對獨(dú)立的信息系統(tǒng)[13],主要功能為用戶信息以及用戶的病歷信息管理。用戶信息管理主要是用戶的注冊、登錄、修改用戶信息、查看用戶信息和查看醫(yī)生信息;病歷信息管理主要有查看病歷信息、上傳病歷信息以及醫(yī)生查看病歷信息。系統(tǒng)的具體功能如圖5所示。
醫(yī)療系統(tǒng)的用戶分為兩種:一是普通用戶,包括患者和醫(yī)生;二是研究人員,針對特殊患者數(shù)據(jù)進(jìn)行采集、查看和研究?;颊哂脩艨梢杂羞x擇地向醫(yī)生發(fā)送問診請求,醫(yī)生用戶也可以查看患者請求信息以及通過病歷ID查看患者病歷信息。研究人員可對有研究價(jià)值的患者病歷進(jìn)行查看。
圖5 系統(tǒng)用戶的功能Fig.5 Functions of system users
2.3.3 區(qū)塊鏈醫(yī)療信息系統(tǒng)的概念結(jié)構(gòu)模型從功能模型出發(fā)設(shè)計(jì)區(qū)塊鏈醫(yī)療信息系統(tǒng)的概念結(jié)構(gòu)模型,特點(diǎn)是不依賴具體的系統(tǒng)實(shí)體結(jié)構(gòu)模型,包含的是實(shí)現(xiàn)區(qū)塊鏈醫(yī)療系統(tǒng)本身的目標(biāo)所需要的實(shí)體結(jié)構(gòu)模型。所以,當(dāng)把這個區(qū)塊鏈醫(yī)療信息系統(tǒng)嵌入到具體的醫(yī)療系統(tǒng)中時(shí),還需要一個具體的將醫(yī)療信息轉(zhuǎn)換到區(qū)塊鏈概念模型中的過程。
圖6為用戶概念模型。系統(tǒng)用戶分成患者、醫(yī)生和研究人員三種角色,三者均繼承了抽象用戶的UserID、用戶密碼、身份編號、姓名和出生日期等屬性。每個醫(yī)生用戶同時(shí)具有醫(yī)院、科室、專業(yè)職稱、專業(yè)領(lǐng)域、一級分類、二級分類、患者滿意度和醫(yī)生擅長等多個方面的屬性?;颊哂脩舻膶傩詾橐恍┖唵蔚膫€人信息,患者用戶與病歷信息關(guān)聯(lián),其關(guān)聯(lián)關(guān)系為1對多,一個患者可以有零到多份病歷。研究人員的屬性有研究機(jī)構(gòu)、研究領(lǐng)域、國籍、省或者州、城市和電子郵件地址等。
圖6 系統(tǒng)用戶的概念模型Fig.6 Conceptual model of system users
圖7 為與病歷相關(guān)的結(jié)構(gòu)類型。病歷條目與病歷相關(guān)聯(lián),關(guān)聯(lián)關(guān)系為1對多,一份病歷可以有多個病歷條目。住院通知單、輔助檢查、用藥記錄、外科治療和出院小結(jié)繼承病歷條目中病歷ID、日期、醫(yī)生等所有屬性。除此之外,每份住院通知單還由初步診斷、當(dāng)前癥狀、主要病史、發(fā)病原因和住院通知單ID等屬性構(gòu)成。輔助檢查中的項(xiàng)目名稱、診斷意見和日期的屬性由影像和生理指標(biāo)檢查繼承。其中生理指標(biāo)檢查與生理指標(biāo)檢查條目關(guān)聯(lián),關(guān)聯(lián)關(guān)系為1對多,一份生理指標(biāo)檢查可以有多個生理指標(biāo)檢查條目。生理指標(biāo)檢查包括檢查單號的屬性,生理指標(biāo)檢查條目包括指標(biāo)名稱、指標(biāo)下限、指標(biāo)上限和當(dāng)前指標(biāo)的屬性。病歷中的用藥記錄與用藥記錄明細(xì)相關(guān)聯(lián),關(guān)聯(lián)的多重性為1對多,一份用藥記錄可以有多個用藥記錄明細(xì),其中用藥記錄明細(xì)包括藥品批號、藥品名稱、用藥方法、每次用量、起始時(shí)間和結(jié)束時(shí)間的屬性。而繼承病歷條目的外科治療由名稱、開始時(shí)間和結(jié)束時(shí)間的屬性構(gòu)成,出院小結(jié)由入院診斷、出院診斷、治療經(jīng)過和注意事項(xiàng)等屬性構(gòu)成。
圖7 病歷的概念模型Fig.7 Conceptual model of case
在20世紀(jì),由跨領(lǐng)域法律學(xué)者Nick Szabo提出:“一個智能合約是一套以數(shù)字形式定義的承諾,包括合約參與方可以在上面執(zhí)行這些承諾的協(xié)議”。區(qū)塊鏈技術(shù)的出現(xiàn)則為這個概念的實(shí)現(xiàn)提供了一個具體的技術(shù)平臺,區(qū)塊鏈技術(shù)的去中心化和信任機(jī)制推動了智能合約的發(fā)展。
傳統(tǒng)的合約可以看成是一個雙方或者多方協(xié)議[14],任何每一方都必須相互信任各方均會遵守協(xié)議并履行他所承擔(dān)的義務(wù);而智能合約則提供一個良好的信任機(jī)制,能夠保證協(xié)議中的信息是真實(shí)可靠的,因此參加協(xié)議的各方無須彼此信任,只需要根據(jù)獲得的信息作出必要的決策。
合約的內(nèi)部結(jié)構(gòu)主要由數(shù)據(jù)和方法組成,其中數(shù)據(jù)用于描述參與合約的各方的信息以及它們之間的交互,方法則提供了通過訪問這些數(shù)據(jù)以履行合約的方法。
智能合約中包含很多不同的結(jié)構(gòu)要素,使用這些要素可以有效地構(gòu)建功能完備(所謂的圖靈完備的)的智能合約,包括合約結(jié)構(gòu)、狀態(tài)變量、函數(shù)、函數(shù)修飾器、事件、映射、類型推斷、以太幣Ether單位、時(shí)間單位、函數(shù)調(diào)用、動態(tài)創(chuàng)建合約、賦值等。
從合約構(gòu)成機(jī)制的角度來看,合約的創(chuàng)建、可見性和getter函數(shù)、函數(shù)修飾器modifier、Constant狀態(tài)變量、繼承、抽象合約、接口和庫等機(jī)制都為合約的設(shè)計(jì)與實(shí)現(xiàn)提供了新的機(jī)制和方法。
使用solidity語言開發(fā)智能合約使用的具體機(jī)制如下:
(1)數(shù)據(jù)類型。開發(fā)智能合約時(shí),可以使用的數(shù)據(jù)類型主要涉及無符號整數(shù)uint、結(jié)構(gòu)體struct、字符串string、布爾bool、映射mapping和地址address等。
其中mapping是創(chuàng)建合約時(shí)使用的特有的一種數(shù)據(jù)類型,一個映射是一個由鍵值對組成的哈希表,每個value都與一個唯一的key對應(yīng)。
另一個常用的類型是地址address,地址類型存儲一個20字節(jié)的值,用于表示以太坊地址。合約中可以使用該類型表示部署的智能合約地址和區(qū)塊鏈中的用戶的地址。
與其他語言類似,結(jié)構(gòu)用于表示一個數(shù)據(jù)結(jié)構(gòu)類型,結(jié)構(gòu)體可以由各種類型的數(shù)據(jù)成員構(gòu)成。也是合約中經(jīng)常使用的數(shù)據(jù)類型。
(2)狀態(tài)變量。狀態(tài)變量是指任何一個持久存儲在合約中成員變量的值,用于表示合約的狀態(tài)。狀態(tài)變量的當(dāng)前值表示了合約的當(dāng)前狀態(tài),其變化過程當(dāng)然也就表示了一個合約的生命歷程。修改狀態(tài)變量的值通常會改變合約狀態(tài)。
(3)函數(shù)。與面向?qū)ο蠓椒ㄖ械念愊嗨疲悄芎霞s中也擁有成員函數(shù),比較特殊的函數(shù)有不修改合約的View函數(shù)、承諾不讀取或修改狀態(tài)的Pure函數(shù)以及沒有參數(shù)沒有返回值甚至沒有名字的Fallback函數(shù)。這些函數(shù)為合約的設(shè)計(jì)提供了新的限制和約束。
合約函數(shù)也可以分為內(nèi)部調(diào)用函數(shù)和外部調(diào)用函數(shù),內(nèi)部調(diào)用函數(shù)是指在合約內(nèi)調(diào)用其他合約的函數(shù);外部調(diào)用函數(shù)則是可以通過JSON-RPC接口在外部調(diào)用的函數(shù)。
(4)合約之間的關(guān)聯(lián)和繼承。與面向?qū)ο蠓椒ㄖ械念愊嗨疲霞s之間也可以有繼承關(guān)系和關(guān)聯(lián)關(guān)系,甚至還可以設(shè)計(jì)抽象合約和合約接口,但由于合約的分布式特性,面向?qū)ο蠓椒ㄖ械念惖睦^承和關(guān)聯(lián)又有一定的不同。使用這些關(guān)系時(shí),像面向?qū)ο蠓椒ㄒ粯訕?gòu)造具有較多層次或復(fù)雜關(guān)聯(lián)關(guān)系的合約可能會降低合約的訪問性。
(5)合約事件。在智能合約中,還可以使用事件機(jī)制。一個事件發(fā)生時(shí),訂閱了這個事件的合約可以以特定的方式響應(yīng)這個事件。
從醫(yī)療信息系統(tǒng)本身的特點(diǎn)以及與區(qū)塊鏈存儲技術(shù)相結(jié)合方面的考慮出發(fā),設(shè)計(jì)智能合約來實(shí)現(xiàn)一個區(qū)塊鏈醫(yī)療信息系統(tǒng),包括區(qū)塊鏈醫(yī)療信息系統(tǒng)合約、患者合約、醫(yī)生合約、研究人員合約和病歷合約。
3.3.1 區(qū)塊鏈醫(yī)療系統(tǒng)的智能合約設(shè)計(jì) 用合約及合約之間的關(guān)系來描述區(qū)塊鏈醫(yī)療系統(tǒng)的邏輯結(jié)構(gòu),表示整個系統(tǒng)中需要存儲的數(shù)據(jù)和能夠提供的服務(wù)。
圖8為系統(tǒng)中合約總體關(guān)系結(jié)構(gòu),包括區(qū)塊鏈醫(yī)療信息系統(tǒng)合約(ΜISBC)、患者合約(Patient)、醫(yī)生合約(Physician)、研究人員合約(Researcher)和病歷合約(Case)以及在它們之間的關(guān)聯(lián)關(guān)系。
(1)區(qū)塊鏈醫(yī)療信息系統(tǒng)合約。區(qū)塊鏈醫(yī)療信息系統(tǒng)(Μedical information system based on block chain,ΜISBC)合約用于表示整個區(qū)塊鏈醫(yī)療系統(tǒng),存儲和保存所有患者以及患者的病歷信息,還存儲所有注冊到本系統(tǒng)的醫(yī)生的基本信息,并為其它用戶訪問這些信息提供必要的訪問機(jī)制。該合約還存儲注冊到本系統(tǒng)的所有研究人員的基本信息,用于支持對系統(tǒng)中研究人員的信息和使用權(quán)限進(jìn)行管理,同時(shí)為研究人員提供信息服務(wù)。另外,還為訪問公開的病歷信息提供必要的訪問機(jī)制。任何人使用這個區(qū)塊鏈系統(tǒng),都應(yīng)該首先訪問這個合約。
(2)患者合約?;颊吆霞s用于存儲患者用戶的基本信息,患者可以通過這個合約存儲和管理它的病歷信息,還能通過區(qū)塊鏈醫(yī)療信息系統(tǒng)向醫(yī)生發(fā)出請求,得到系統(tǒng)中醫(yī)生用戶的服務(wù),醫(yī)生用戶可根據(jù)患者ID看到患者個人信息,以及通過患者發(fā)送的病歷ID查看患者的相關(guān)病歷,并按照請求信息中的患者地址返回響應(yīng)內(nèi)容。
圖8 區(qū)塊鏈醫(yī)療系統(tǒng)結(jié)構(gòu)圖Fig.8 Structure of blockchain medical system
(3)病歷合約。病歷合約用于存儲患者需要存儲的病歷信息,一般由患者本人存儲在區(qū)塊鏈系統(tǒng)中,分為公開病歷和非公開病歷。一般情況下,只有患者本身擁有使用病歷信息的權(quán)限。必要時(shí),經(jīng)過授權(quán)的醫(yī)生可以查看存儲在區(qū)塊鏈之上的病歷信息。對于公開的病歷,系統(tǒng)中的研究人員可以下載并使用這些病歷。
(4)醫(yī)生合約。醫(yī)生合約用于存儲系統(tǒng)中醫(yī)生用戶的基本信息,可以查詢ΜISBC中存儲的醫(yī)生成員列表中相關(guān)信息。并且該合約還能通過區(qū)塊鏈醫(yī)療信息系統(tǒng)為患者提供服務(wù),醫(yī)生可以對患者發(fā)送的醫(yī)療問題請求予以回應(yīng)?;颊呖筛鶕?jù)此種方式與醫(yī)生實(shí)現(xiàn)交互。
(5)研究人員合約。研究人員合約用于存儲系統(tǒng)中研究人員用戶的基本信息。該合約用于對系統(tǒng)中對公開病歷信息有需求的研究人員進(jìn)行存儲和管理,可以查詢ΜISBC中存儲的研究人員列表中的相關(guān)信息。
3.3.2 區(qū)塊鏈醫(yī)療系統(tǒng)的智能合約中方法的設(shè)計(jì) 智能合約中的方法可以看成是部署到區(qū)塊鏈中的應(yīng)用程序?yàn)橛脩舸鎯驮L問區(qū)塊鏈中的數(shù)據(jù)提供有效的訪問機(jī)制和服務(wù),同時(shí)也為用戶訪問這些數(shù)據(jù)提供必要的權(quán)限控制和權(quán)限管理。另外,合約中的每一個方法均可以看成是合約對外提供的一個功能單元。因此,動態(tài)地分析系統(tǒng)的外部行為是一個有效的智能合約設(shè)計(jì)方法。通過用例分析的方法逐步細(xì)化系統(tǒng)的動態(tài)行為,確定合約方法。
(1)用例分析方法。設(shè)計(jì)合約方法時(shí),本文使用面向?qū)ο蠓椒ㄖ械挠美治龇椒?。首先分析的是上傳?shù)據(jù)的用例分析方法。上傳數(shù)據(jù)就是將數(shù)據(jù)上傳并存儲到區(qū)塊鏈中。上傳數(shù)據(jù)的形式包括部署一個智能合約實(shí)例、訪問一個合約方法或上傳一個交易等多種形式。
例如,區(qū)塊鏈醫(yī)療系統(tǒng)中,每增加一個患者、醫(yī)生、研究人員或病歷信息時(shí)都需要向區(qū)塊鏈系統(tǒng)中部署一個新的合約實(shí)例。當(dāng)向病歷合約中添加病歷明細(xì)時(shí),則需要通過調(diào)用合約方法的方式向患者病歷合約中添加數(shù)據(jù)。這可以在與此相關(guān)的合約中使用合適的ADD方法添加數(shù)據(jù)。
圖9為上傳病歷用例的時(shí)序圖模型,這個模型不僅描述用戶上傳病歷的交互過程,還明確地給出實(shí)現(xiàn)這個過程時(shí)相關(guān)合約需要的方法。
圖9 上傳病歷的時(shí)序圖模型Fig.9 Time series graph model of uploaded medical record
(2)修改數(shù)據(jù)的方法。由于區(qū)塊鏈本身具有不可篡改的特性,使得修改區(qū)塊鏈數(shù)據(jù)的方法與傳統(tǒng)的數(shù)據(jù)修改方法具有很大的區(qū)別。從本質(zhì)上說,區(qū)塊鏈數(shù)據(jù)的修改是不斷增加新版本的數(shù)據(jù)值。任何對區(qū)塊鏈數(shù)據(jù)的修改,都必須通過交易才能夠完成,并且可能需要巨大的開銷。因此,修改區(qū)塊鏈數(shù)據(jù)必須通過特定的策略加以實(shí)現(xiàn),例如需要刪除數(shù)據(jù)時(shí),可以通過在合約中關(guān)閉訪問權(quán)限的方式進(jìn)行,而不是真正刪除區(qū)塊鏈上的數(shù)據(jù)。增加數(shù)據(jù)時(shí),可以向特定的映射表中添加數(shù)據(jù)。修改也只是給狀態(tài)變量增加一個新版本的值。
(3)注銷合約。區(qū)塊鏈中的數(shù)據(jù)并不能進(jìn)行篡改和刪除,刪除數(shù)據(jù)方法可以分為兩種:一是對合約進(jìn)行注銷,即在編寫合約時(shí)設(shè)置注銷事件和觸發(fā)注銷事件。二是刪除用戶個人信息或刪除患者病歷數(shù)據(jù)?;颊呦雱h除系統(tǒng)中的病歷信息,可以將Patient合約中的numofCases改成0,即患者病歷個數(shù)為0,表示系統(tǒng)中已沒有此患者病歷信息。
(4)查詢數(shù)據(jù)方法。查詢數(shù)據(jù)方法即患者對醫(yī)生信息的查詢和研究人員對公開病歷信息的查詢。
在區(qū)塊鏈醫(yī)療系統(tǒng)中,智能合約起到主導(dǎo)性的作用[15],可以用來完成系統(tǒng)中用戶的管理、醫(yī)療數(shù)據(jù)的上傳和醫(yī)療數(shù)據(jù)的獲取等功能??梢哉J(rèn)為ΜISBC是托管在區(qū)塊鏈上并由智能合約控制的系統(tǒng),允許任何參與者(患者)管理自己的醫(yī)療數(shù)據(jù),或者系統(tǒng)用戶(某個醫(yī)生、某醫(yī)療機(jī)構(gòu)或研發(fā)機(jī)構(gòu))根據(jù)醫(yī)療信息的狀態(tài)考慮是否可以對患者的醫(yī)療信息進(jìn)行訪問。
總結(jié)智能合約的設(shè)計(jì)過程,能得到智能合約的一般設(shè)計(jì)方法。
(1)設(shè)計(jì)智能合約的概念模型。智能合約的概念模型來源于問題域,可以將問題域中的實(shí)體概念模型作為智能合約的概念模型。
(2)設(shè)計(jì)智能合約的邏輯模型。將概念模型細(xì)化成合約的邏輯模型,模型的主要構(gòu)成元素包括合約、合約之間的關(guān)系、相關(guān)的數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)映射方法以及合約方法等。
(3)合約的程序設(shè)計(jì)。使用特定的程序設(shè)計(jì)語言,如Solidity語言等,完成合約的編寫。
(4)合約的編譯和部署。將編寫完成的智能合約編譯成二進(jìn)制形式并部署到區(qū)塊鏈中。
本文設(shè)計(jì)的合約分為兩部分,一種是用來存儲系統(tǒng)中的用戶,此類合約的設(shè)計(jì)以系統(tǒng)用戶為中心,所有參與用戶通過注冊醫(yī)療區(qū)塊鏈系統(tǒng)確定其身份。每個參與用戶ID都由以太坊地址表示,以太坊地址由用戶的私鑰控制。另一種是存儲患者病歷相關(guān)的醫(yī)療數(shù)據(jù),此類合約的設(shè)計(jì)以病歷為中心,通過提供數(shù)據(jù)的哈希函數(shù)和區(qū)塊鏈上的屬性來維護(hù)數(shù)據(jù)的真實(shí)性。
本文對傳統(tǒng)醫(yī)療系統(tǒng)數(shù)據(jù)共享面臨的挑戰(zhàn)進(jìn)行分析,提出一種基于區(qū)塊鏈的醫(yī)療系統(tǒng)體系結(jié)構(gòu),即在傳統(tǒng)醫(yī)療系統(tǒng)的基礎(chǔ)上增加區(qū)塊鏈服務(wù)節(jié)點(diǎn),擴(kuò)大醫(yī)療數(shù)據(jù)的使用范圍,實(shí)現(xiàn)基于區(qū)塊鏈的醫(yī)療信息系統(tǒng)。討論了區(qū)塊鏈醫(yī)療信息系統(tǒng)的數(shù)據(jù)存儲機(jī)制,給出了區(qū)塊鏈醫(yī)療信息系統(tǒng)的功能結(jié)構(gòu)設(shè)計(jì)、概念結(jié)構(gòu)設(shè)計(jì)和邏輯結(jié)構(gòu)設(shè)計(jì),并使用智能合約技術(shù)給出了一個簡單原型系統(tǒng)的實(shí)現(xiàn)。
(1)對現(xiàn)在醫(yī)院的醫(yī)療系統(tǒng)進(jìn)行整體的需求分析,構(gòu)建區(qū)塊鏈平臺上的醫(yī)療系統(tǒng)概念模型,主要包括醫(yī)療系統(tǒng)的存儲策略、系統(tǒng)的概念結(jié)構(gòu)、智能合約的方法設(shè)計(jì)和設(shè)計(jì)方法等,并詳細(xì)描述了系統(tǒng)的流程設(shè)計(jì)和業(yè)務(wù)邏輯。
(2)在區(qū)塊鏈醫(yī)療系統(tǒng)上實(shí)現(xiàn)安全存儲和共享的業(yè)務(wù)邏輯進(jìn)行區(qū)塊鏈醫(yī)療系統(tǒng)的功能設(shè)計(jì),主要包括用戶的注冊和登錄、患者病歷的上傳、病歷的查詢以及醫(yī)患交互中的一些功能,并進(jìn)行智能合約的開發(fā)設(shè)計(jì)。
本文所完成的工作僅能為基于區(qū)塊鏈的醫(yī)療信息系統(tǒng)建設(shè)提供一些比較現(xiàn)實(shí)的技術(shù)思路和借鑒。后續(xù)工作中,建立合適的區(qū)塊鏈類型、實(shí)現(xiàn)通用的醫(yī)療數(shù)據(jù)析取模塊以及提高區(qū)塊鏈系統(tǒng)的數(shù)據(jù)檢索效率和存儲效率等還有大量的問題需要解決和進(jìn)一步完善。另外,對基于區(qū)塊鏈醫(yī)療系統(tǒng)的前端設(shè)計(jì)技術(shù)和設(shè)計(jì)方法也是一個亟需解決的重要問題。