摘 要 I
ABSTRACT II
第一章 緒論 1
1.1課題研究背景及意義 1
1.2國內外的研究現狀 1
1.3本論文的主要研究內容 3
1.4本文的主要組織結構 3
第二章 相關技術簡介 5
2.1區塊鏈技術 5
2.2星際文件傳輸協議 6
2.3智能合約 6
2.4Mysql 數據庫 7
2.5本章小結 7
第三章 分布式醫療信息管理系統的需求分析 8
3.1系統功能需求分析 8
3.2系統非功能需求分析 9
3.3本章小結 10
第四章 分布式醫療信息管理系統的總體設計 11
4.1整體方案設計 11
4.2用戶層設計 11
4.2.1面向病人用戶操作設計 11
4.2.3 面向醫生用戶操作設計 12
4.3應用層設計 13
4.4數據層設計 14
4.5區塊鏈層設計 15
4 .6本章小結 16
第五章 分布式醫療信息管理系統的實現 17
5.1用戶層的實現 17
5.1.1基于病人用戶的操作 17
5.1.2基于醫生用戶的操作 19
5.2應用層的實現 21
5.2.1登錄模塊 21
5.2.2基本信息管理模塊 23
5.2.3醫療信息管理模塊 24
5.2.4醫療信息權限管理模塊 27
5.2.5監控信息狀態模塊 28
5.2.6就診管理模塊 30
5.2.7調閱信息模塊 31
5.3數據層的實現 33
5.3.1IPFS 層 33
5.3.2Mysql 數據庫 35
5.4區塊鏈層的實現 37
5.4.1區塊鏈層運行形式 37
5.4.2智能合約的部署 37
5.4.3智能合約的調用 41
5.5本章小結 42
第六章 分布式醫療信息管理系統的測試 43
6.1用戶層功能測試 43
6.2數據層測試 46
6.3區塊鏈層測試 46
6.4本章小結 47
第七章 總結與展望 48
7.1 總結 48
7.2展望 49
參考文獻 50
致 謝 53
第一章 緒論
1.1課題研究背景及意義
在當前醫療數據流通的模式中,醫院各自擁有自己獨立的醫療系統,病人到 這個醫院就診時,便被要求登記自己的信息以參與這個醫院的自有的醫療系統的 業務流程。當病人進入就診流程時,病人自述病情,醫生依據病情做出對應的診 療判斷。這個問診過程產生的醫療信息,一部分由就診醫生記錄在紙質病歷上, 歸還給病人,另一部分則存進了醫院內部的信息系統中。當病人在另外的醫院咨 詢不同的病癥時,病人又得重復登記自己的信息,如若病人沒有攜帶病歷,那么 先前相關的就診信息就無法給予醫生作為診斷的補充,同時這一次的就診信息也 將會存儲在這個醫院的數據信息系統里。由于不同的醫院源于一些原因是不會互 相提供醫療數據,這就造成了一種“信息孤島[1]”的現象,并且信息的不互通導 致信息的冗余,形成不了信息之間的互相補充。
病人接觸到的醫療信息系統,主要是以電子信息病歷的形式展現的[2]。病人 對自己的電子信息病歷無法直接持有,也只能到醫療信息系統所在的醫院去查看 相關內容,這對病人是很不友好的。病人的私有醫療數據是具有價值的,病人應 該對自有的醫療數據有一個清楚了解,包括知曉醫療內容,自有數據的流通許可 以及自有數據所存儲位置等方面。然而在現有的醫療信息系統中,病人很難全面 了解到自己的醫療信息,并且自身的數據安全完全取決于醫療信息系統所在平臺, 這種不確定性在一定程度上會帶給病人不同層面的損失。
時下熱門的區塊鏈技術,具備去中心化、分布式、可溯源、數據難篡改的特 點[3],這與現有醫療信息系統存在的醫療信息存儲中心化,數據不流通,醫療信 息使用對病人不透明,醫療信息數據安全性不確定的問題很切合。本論文基于區 塊鏈構建了一個醫療信息管理分布式應用,為存在的問題提供一種更理想的解決 方案。
1.2國內外的研究現狀
隨著比特幣[4]、ETC、EOS等數字貨幣逐漸流行,一種被稱之為區塊鏈 (blockchain)的新技術出現出現在人們的視線中。區塊鏈技術將不同領域的學科 整合起來,其中包括數學、密碼學、計算機科學等[5],構建一個具有去中心化,不 可被篡改,不可被偽造,可溯源等特點的分布式數據庫。區塊鏈技術在未來將被 應用到包括金融、醫療健康、司法和游戲等在內的多個領域。
梅蘭•妮斯萬(Melanie Swan)將區塊鏈技術分為區塊鏈1.0、2.0和3.0三個 發展階段[6]。在區塊鏈1.0階段,以比特幣為代表的一系列數字貨幣的出現,表現 出令人驚訝的創新和廣泛應用,尤其是在匿名轉移和支付數字貨幣資產方面。在 區塊鏈 2.0 階段出現了智能合約,這個階段也被稱為區塊鏈的智能合約時代,通 過部署在區塊鏈上的智能合約實現更強大,復雜,高級的功能,例如實現金融系 統中的股票、證券、期貨和銀行業中的貸款、支付等方面的登記、結算與清算。 隨著區塊鏈的技術應用場景被不斷拓寬,未來的區塊鏈 3.0 階段,在人類意識形 態領域,例如科學,文化等,區塊鏈技術的去中心化和共識機制將造成更深遠的 影響。
近些年,一些發達國家,如英國,美國,德國等,均成立了區塊鏈發展聯盟, 在國家戰略層面上對其重視。中國國務院也將區塊鏈的發展列入《“十三五”國 家信息化規劃》,保證在相關技術領域內不落后于人[7]。國務院工業和信息化部 信息化和軟件服務業司指導中國電子技術標準化研究院聯合國內頂尖公司[8],發 布《中國區塊鏈技術和應用發展白皮書(2016)》,對區塊鏈技術的應用與發展 做了專項研究[9]。在國內,常州市醫聯體與阿里健康聯合,在當地實現了部分醫 療機構對數據進行安全,可控的互聯互通的醫療場景,將區塊鏈技術應用于醫聯 體底層技術架構[10],以低成本、高可靠性的形式解決醫療信息系統中存在的信息 不流通和數據安全不確定的問題。
區塊鏈在醫療領域的應用主要表現在醫療信息方面[11],現有的醫療信息系統 在信息的安全性和隱私性方面難以保障,同時存在病人在系統中的參與程度低, 管理程度不夠高,對自有信息的操作以及訪問不靈活等問題。區塊鏈所具備的技 術特點完全可以滿足醫療信息系統包括數據權限、數據安全在內的功能需求。
Xiao Yue等學者提出Healthcare Data Gateways系統[12],構建了一個基于區塊 鏈的健康數據網關,使患者能夠控制和共享他們自己的數據,提升病人隱私性。 徐健等學者提出Realtime-Security Medical Record解決方案[13],該方案基于區塊 鏈、智能合約以及IPFS,對EMR信息進行實時處理和存儲。瑞士的Healthbank 公司從透明化處理健康系統的角度,在區塊鏈上開展相關事務[14]。Gem Health同 飛利浦區塊鏈實驗室構建了一個基于區塊鏈的健康生態系統[15],旨在使醫療健康 有更長遠發展。麻省理工學院媒體實驗室的 Asaph Azaria 等學者提出了 MedRec 系統[16],通過與區塊鏈技術結合處理EMR,將智能合約按照對象和功能進行設 計,為患者提供全面不可變更的日志,解決醫療行業數據的互操作性和權限管理 問題,同時讓治療結構輕松訪問對應醫療信息。Qi Xia等學者提出MedShare系 統[17],將權限控制與智能合約結合,解決醫療大數據在無信任環境下的共享問題, 并可追蹤數據流通方向。
1.3本論文的主要研究內容
現有的醫療信息系統存在于不同的平臺中,各平臺自成體系,平臺間互相隔 離。隨著時代的發展,平臺之間的聯系將會變得越來越緊密,對數據的交流也會 變得越來越頻繁。區塊鏈依靠其去中心化、分布式、可溯源、數據難篡改的優勢, 非常契合未來的醫療信息系統的發展。同時病人應當對自有醫療數據有一個良好 的管控,讓病人參與對自有信息的把控,能夠提升沉冗數據的活性,讓數據產生 更好的流通。因此本文提出基于區塊鏈技術構建醫療信息管理系統。
本系統分為用戶層、應用層、區塊鏈層以及數據層。用戶層表現為病人或醫 生用戶通過瀏覽器登錄使用。應用層實現著各種模塊功能,并與用戶層、區塊鏈 層和數據庫層建立通信。區塊鏈層采用趣鏈科技開發的聯盟鏈,在其上進行病人 加密信息存儲和獲取信息權限對比。數據層存儲著病人信息以及系統運行過程產 生的臨時值。以下是各部分需要完成的內容:
1.用戶層以前端頁面的形式展現。病人用戶與醫生用戶通過瀏覽器登錄到 各自對應的界面,不同的界面會呈現對應用戶的內容。
2.應用層基于 Flask 構建,由不同功能模塊組合,同時與其他層進行通信。
3.區塊鏈層主要是通過Solidty在聯盟鏈上開發智能合約。智能合約主要功
能是完成對加密醫療信息的存儲和信息獲取權限對比。
4.數據庫層分為IPFS和Mysql數據庫。IPFS能夠提供電子醫療信息與加 密特征之間的映射,同時構建分布式文件存儲。Mysql數據庫承擔各層次 的數據存儲。
1.4本文的主要組織結構
第一章緒論,描述當前醫療信息系統的現狀和存在的問題,國內外對醫療信 息系統應用在區塊鏈方面的設想與實現。提出了分布式醫療信息管理系統,對已 存在的問題提供一種解決方案,并簡要描述該系統的主要研究內容。
第二章相關技術簡介,描述了區塊鏈和星際文件傳輸協議的技術特點,為系 統的設計與實現提供了合理的技術支撐。
第三章分布式醫療信息管理系統的需求分析,描述了系統的功能需求與非功 能需求,并對此作了詳細分析,明確了系統所應具備的功能。
第四章分布式醫療信息管理系統的總體設計,從系統整體設計描述了系統的 架構,簡要介紹用戶層、應用層、數據層和區塊鏈層的功能和業務流程。
第五章分布式醫療信息管理系統的實現,從用戶層的兩種用戶角色的操作, 應用層各個模塊的功能與業務,數據層中 IPFS 和 Mysql 數據庫實現方式與存儲 的數據對象,區塊鏈層中智能合約的部署與調用這些方面做了詳細描述。 第六章分布式醫療信息管理系統的測試,選取病人用戶角色對模塊進行功能 測試,同時測試了數據層中的 IPFS 對不同類型文件加密存儲以及區塊鏈層智能 合約的部署與調用。
最后總結了整個系統的采用的相關技術和開發流程,提出開發中的不足之處, 并對未來展望。
第二章 相關技術簡介
2.1區塊鏈技術
區塊鏈技術[18]是一個分布式的去中心化數據庫,用來存儲交易信息等數據, 這些數據為整個區塊鏈網絡中的節點所共享。區塊是一種信息載體,交易信息、 當前區塊特征信息和上一個區塊特征信息被打包存入里面。每個區塊的特征信息 是以獨一無二的哈希值(Hash)表現的,這個哈希值是區塊的身份標識。
區塊鏈是一種鏈式數據結構,區塊和區塊之間前后相連,即后一個區塊按時 間順序連接到前一個塊[19]。區塊鏈技術有以下特點:
1.不可篡改。交易信息經過共識確認后[20],會被打包加入到區塊鏈,已經 存入到區塊鏈中的數據是不可被刪除和篡改的,這能有效的保證數據的 完整性。
2.去中心化。區塊鏈技術沒有中心節點,每個參與到區塊鏈中的節點均可參 與到區塊鏈網絡的維護[21]。
3.可追溯。區塊鏈是一種帶有時間戳的鏈式數據存儲結構[22],存儲在區塊 鏈中的每筆交易信息都會記錄交易詳情,這有助于對數據進行追溯。
4.可靠性。區塊鏈技術實際上依舊是分布式數據庫,每個節點都有最新數據 庫的備份[23],當部分節點被攻擊,發生數據遺失時,只需要從其他未被 影響到的節點同步數據副本即可,區塊鏈整體不受影響。
5.去信任。區塊鏈的參與者都是匿名的,節點之間無需達到互相信任的程度
[24],節點之間的數據通訊依照共識機制進行,整個運作過程會廣播到區 塊鏈網絡中的其他節點[25],共識過程符合“多數服從少數”的原則。
區塊鏈有三種類型,公有鏈、聯盟鏈和私有鏈[26],三者的區別在于讀寫權限 的開放程度。公有鏈對所有人開放,聯盟鏈對加入聯盟的節點開放,私有鏈對某 個節點開放。為實現不同醫院之間信息的流轉,系統的業務需要能夠達到一定的 吞吐量并保持數據的安全性,聯盟鏈在這兩個方面都有比較明顯的優勢,故本系 統采用聯盟鏈的形式。
區塊鏈表現出來的去中心化、可溯源以及防篡改的特性,非常符合病人醫療 信息的存儲、管控與流通,同時可保證數據的安全與可靠。本文提出的分布式醫 療信息管理系統可以基于區塊鏈做關鍵醫療信息存儲。
2.2星際文件傳輸協議
星際文件系統(Inter Planetary File System, IPFS)是一個分布式,點對點的, 通過內容和身份進行尋址的文件系統[27]。節點之間相互連接,可以跨域傳輸數據, 傳輸的數據形式不單是文件,也可以是其他數據結構。IPFS協議分為一組負責不 同功能的子協議,身份、網絡、路由、交換、對象、文件和命名[28]。
Merkle DAG 的全稱是 Merkle directed acyclic graph,即默克有向無環圖[29]。 它是在Merkle tree基礎上構建的,Merkle DAG跟Merkle tree很相似,但不完全 一樣,比如:Merkle DAG不需要進行樹的平衡操作,非葉子節點允許包含數據 等。Merkle DAG擁有內容尋址,防篡改,去重的功能,IPFS通過Merkle DAG構 造快速穩定的分發和存儲的點對點系統。
當前的醫療信息格式十分復雜,而現階段的區塊鏈技術對數據量大以及數據 格式復雜的數據對象不友好,并且現有的區塊鏈在操作數據的時候,會有交易手 續產生,當數據量過大時,進行數據存儲將造成額外的負擔,在某種程度上來說, 區塊鏈是一種昂貴且低效的存儲方式。基于文件內容加密和內容可尋址的特性, 分布式醫療信息管理系統引入 IPFS 對源電子醫療信息進行加密,建立源電子醫 療信息與加密特征之間的映射,同時提供加密信息的讀取。
2.3智能合約
Nick Szabo 在 1990s 年代提出智能合約的理念。智能合約定義為一個智能合 約是一套以數字形式定義的承諾,包括合約參與方可以在上面執行這些承諾的協 議[30] 。傳統合約需要簽署合約的雙方或者多方能夠誠信的履行合約,使合約生效, 而智能合約當初沒有被應用到實際產業中,在于當時缺少能被信任的執行環境。 比特幣的出現讓人們意識到,智能合約所需的可信執行環境完全可以通過區塊鏈 技術來實現,同時比特幣最核心的創新在于它讓大家知道怎樣在不需要信任第三 方的情形下遠距離轉移價值,而這個創新點天生就與智能合約切合。
智能合約程序不單單作為一個可自動執行的計算機程序,同時本身也是一個 系統的參與者[31]。它可以回應接收到數據,也可以存儲數據和價值以及對外發送 價值,在這樣的情景下,智能合約就好像一個可被信任的對象,能臨時保管資產, 可以總是依照先前規定的步驟執行操作[32]。
比特幣使用的腳本語言不具備圖靈完備性,不可支持復雜的功能。以太坊借 鑒比特幣中的區塊鏈技術,對其應用范圍進行擴展。以太坊能夠支持更復雜的腳 本語言,即具有圖靈完備的編程語言,開發者可以在以太坊上開發各種應用,定 義任意智能合約,可以這么說,以太坊是區塊鏈與智能合約的加法組合[33]。
現階段,智能合約以不同的應用方式呈現在人們眼前,例如金融系統中的差 價合約,代幣與資產進行智能對應的代幣系統,可保證資金安全的儲蓄錢包,作 物保險,多重簽名智能合約等。
基于區塊鏈的分布式醫療信息管理系統有在數據存儲以及數據管控上的功能 需求,加入能夠與區塊鏈結合的智能合約,可以使系統具備有效多樣的功能,系 統同時還具備了橫向擴展性。
2.4Mysql數據庫
Mysql 是一種關系數據庫管理系統[34],在關系型數據庫中,數據都是以表格 的形式存在的[35]。Mysql數據庫具有體積小,速度快,源碼開源,擁有成本小, 提供多語言支持,支持多線程等特點。
基于區塊鏈的分布式醫療信息管理系統是以 WEB 應用的形式進行開發的, 系統在隨著用戶增多和使用時間增加的過程中會產生大量中文或者英文數據,系 統將以數據表的形式對這些數據進行存儲。Mysql數據庫還具備原子性特性,即 整個事務的所有操作要么全成功,要么失敗進行回滾,這樣的一個標準特性可以 滿足本系統對數據的完整性處理。
2.5本章小結
本章介紹了區塊鏈技術、星際文件傳輸協議、智能合約以及 Mysql 數據庫。 區塊鏈具有去中心化、可溯源以及防篡改的特點[36];星際文件傳輸協議可以分布 式的對文件進行加密存儲且支持內容尋址;智能合約可以在區塊鏈上自動按程序 要求嚴格執行;Mysql數據庫能夠滿足系統對醫療信息記錄數據進行管理。以上 提及的各技術特點均十分符合該系統的功能需求,也為系統的實現提供了技術保 障。
第三章 分布式醫療信息管理系統的需求分析
3.1系統功能需求分析
系統存在兩種用戶,分別是病人和醫生。病人和醫生所使用的系統功能是不
同的。醫療信息管理系統的系統用例圖如圖3.1所示。
圖 3.1 系統用例圖
病人和醫生用戶都具備登錄模塊和基本信息管理模塊。登錄模塊提供密碼修 改功能,基本信息管理模塊提供用戶信息完善功能。
病人用戶登錄系統后,病人用戶所需的功能主要由醫療信息管理模塊、醫療 信息權限管理模塊以及監控信息狀態模塊三個模塊提供。醫療信息管理模塊包含 就診信息完善和醫療資料補充功能,病人在就診結束后,可以在系統中補充就診 過程中未被記錄的信息,也可以提供其他方面的就診資料輔助治療;醫療信息權 限管理模塊提供醫療信息權限設定功能,病人對信息做不同級別的閱讀權限設定; 監控信息狀態模塊提供信息被調閱監測功能,一些高級別閱讀權限的信息被調閱 后,會被記錄下來,病人能夠通過這個模塊直觀的看到自身信息被調用情況。
醫生用戶登錄系統后,醫生用戶主要使用就診管理模塊和調閱病人信息模塊 完成對應操作。醫生用戶可以通過就診管理模塊查看已被接診的病人基本醫療信 息。當醫生用戶需要查看某個病人更詳細的信息時,調閱信息模塊會先校驗醫生 的權限級別以判斷該醫生用戶是直接獲取被調閱的信息還是進一步做新權限申請
3.2系統非功能需求分析
系統的非功能需求在一定程度上會影響到系統的交互操作以及系統的穩定運 行。以下對分布式醫療信息管理系統的非功能需求做簡要說明:
(1) 前端頁面設計
前端頁面應做到排版簡潔,例如在基本信息管理模塊中,合理的排版布局能 夠使病人用戶一目了然獲取對應信息。各個功能的操作不可太繁瑣,設定合理的 操作步驟可以提升用戶使用過程中的流暢性并降低掌握系統的難度。不同的用戶 會使用不同的瀏覽器使用本系統,做好對各個瀏覽器的適配,減少系統出錯顯示。
(2) 系統業務響應時間 本系統主要是前后端構建,用戶的每一個基于前端頁面的操作都會與后端通
信,后端中會有一些業務數據需要與區塊鏈通信。為保證系統對業務的正常處理 與及時返回,可以優化調整系統結構,在后端涉及與區塊鏈通信的這部分業務中, 可以對區塊鏈智能合約部分做合理設計。
(3) 系統可擴展性
系統在不斷使用后會隨著場景變化需要增添新的功能,提前對系統做可擴展 性規劃可以減少后期擴展新功能的難度。
(4) 系統日志記錄
對系統做好完備的日志記錄,當產生包括異常、警告和錯誤信息時,有效且 及時通知系統管理員,這有助于對系統做出適當調整并保證系統的安全與健壯。
(5) 系統安全性
本系統會對大量病人的信息進行存儲,數據的泄露與丟失會給用戶帶來隱私 問題與困擾。對病人信息進行可靠性的加密以及妥善備份機制是很有必要的。
3.3本章小結
本章對基于區塊鏈的分布式醫療信息管理系統做了功能與非功能需求分析。 通過系統用例圖對模塊與功能之間的關系進行表示,同時對不同的用戶,如醫生 與病人,需要的功能進行介紹。在系統的非功能需求部分,對前端頁面、系統業 務響應時間以及系統的可擴展性等方面做出說明與建議。
第四章 分布式醫療信息管理系統的總體設計
4.1整體方案設計
整個分布式醫療信息管理系統由用戶層、應用層、數據層以及區塊鏈層構成。 用戶層是系統的入口,兩種用戶通過網頁登錄到系統中[37];應用層集成各個業務 處理模塊,同時建立與各個層之間的聯系;區塊鏈層負責加密信息存儲和加密信 息查看;數據層會存儲應用層所需要的數據,并向應用層提供讀取操作。系統框 圖說明如圖4.1所示。
圖 4.1 系統框圖
4.2用戶層設計
病人在就診的時候存在這樣的一種場景,病人陳述病情,醫生詢問一些細節, 并在病歷上進行記載,從而完成就診。依據病人與醫生不同的行為,在分布式醫 療信息管理系統設有面向病人與醫生的不同操作。
4.2.1 面向病人用戶操作設計 病人用戶使用到的功能模塊有登錄模塊、基本信息管理模塊、醫療信息管理 模塊、醫療信息權限管理模塊以及監控信息狀態模塊。用戶層,面向病人用戶, 模塊與功能之間的分屬關系圖如圖4.2所示。
用戶層(病人用戶)
圖 4.2 用戶層(病人)模型- 功能圖
病人初次使用系統,只可使用登錄模塊對賬號進行管理以及通過基本信息管 理模塊對個人信息進行登記。登記個人信息能夠讓系統自動在病人就診時將病人 個人信息呈現給就診醫生。當病人完成診療后,系統中才會有此次診療過程中產 生的醫療信息。
醫療信息管理模塊提供病人對就診后系統返回的醫療信息進行補充的功能, 包括完善醫療信息和補充醫療資料。醫療信息權限管理模塊的主要功能是讓病人 對自己的醫療信息設定不同層級的閱讀權限。監控信息狀態模塊提供信息被調用 的記錄查看,讓病人能夠知曉自有信息的被調閱情況。
4.2.2 面向醫生用戶操作設計
醫生用戶使用到的功能模塊有登錄模塊、基本信息管理模塊、就診管理模塊 和調閱病人信息模塊。用戶層,面向醫生用戶,模塊與功能之間的分屬關系圖如 圖 4.3 所示。
用戶層〔醫生)
圖 4.3 用戶層(醫生)模型- 功能圖
醫生初次使用系統時,也只可使用登錄模塊對賬號進行管理以及通過基本信 息管理模塊完善個人信息。
醫生可以通過就診管理模塊瀏覽已接診的病人基本信息,在需要的時候,可 以查看病人在此次就診過程中已存在的輔助醫療信息,例如血液檢查結果、CT和 MRI醫學影像等。醫生也可以通過調閱信息模塊查看病人額外的信息,在這個過 程中,系統會檢查當前醫生用戶的閱讀權限級別,以作出“調閱相應信息和權限 不足”或者“建議權限申請”的操作。
4.3應用層設計
應用層是分布式醫療信息管理系統的業務處理核心。應用層與用戶層、區塊 鏈層以及數據層都有數據交互。應用層功能設計圖如圖4.4所示。
圖 4.4 應用層功能設計圖
應用層處理登錄模塊、基本信息管理模塊、醫療信息模塊、醫療信息權限管 理模塊、監控信息狀態模塊、就診管理模塊以及調閱信息模塊的業務。上述提到 的各個模塊都會有相應的數據存儲到數據層中,業務在處理過程中,模塊會從數 據層讀取對應的數據。與區塊鏈層進行通信的模塊有醫療信息管理模塊、醫療信 息權限管理模塊和調閱信息模塊,三個模塊在業務進行時,會依據不同的操作與 區塊鏈層進行數據交互。
4.4數據層設計
數據層負責存儲應用層中產生的數據,并在業務通信過程中提供數據的讀取 任務。
數據層由 IPFS 以及 Mysql 數據庫構成[38],兩者服務的對象不同,功能也是 不同的。數據層的數據來源示意圖如圖4.5所示。
圖 4.5 數據層的數據來源示意圖
醫療信息管理模塊產生的信息將通過 IPFS 進行 Hash 加密,并存儲在 IPFS 的私有存儲網絡中。IPFS能夠將源電子數據與加密Hash值建立映射關系,這種 映射關系能夠用于對源電子數據尋址。調閱信息模塊就是利用 Hash 值與醫療信 息之間的映射關系在IPFS中尋找目標數據集。
應用層中的其他模塊產生的數據會存儲在Mysql數據庫中,例如用戶名與密 碼,用戶的一些基本信息,醫生已接診病人信息,應用層訪問接口得到的具有一 定時效性的信息等。這些模塊也可以連接數據層的Mysql數據庫讀取相應的數據。
4.5區塊鏈層設計
分布式醫療信息管理系統中的區塊鏈層是一個中間層,承接著應用層與聯盟
鏈之間的聯系。區塊鏈層設計圖如圖4.6所示。
區塊鏈層主要實現加密信息主要特征的存儲功能和加密信息查看功能。區塊 鏈層可以從不同的節點接入到聯盟鏈,本系統使用到的功能是以部署在聯盟鏈上 的智能合約為中心構建的,同時聯盟鏈提供接口給區塊鏈層,因此區塊鏈層具備 的功能是與智能合約實現的功能一一對應。
應用層與區塊鏈層之間的業務通信,主要涉及到應用層中的醫療信息管理模 塊、醫療信息權限管理模塊和調閱信息模塊,其中醫療信息管理模塊和醫療信息 權限管理模塊的功能需求是加密信息存儲,調閱信息模塊的功能需求是信息調取。
4.6本章小結
本章對基于區塊鏈的分布式醫療信息管理系統設計從用戶層、應用層、區塊 鏈層以及數據層四個層面做了介紹。描述了用戶層中兩種用戶角色使用的不同功 能對應的各個模塊,應用層包含的各個模塊與其他層的業務關系,數據層中 IPFS 與Mysql數據庫承擔的功能和服務對象,區塊鏈層提供的功能以及和應用層、聯 盟鏈的業務形式。
第五章 分布式醫療信息管理系統的實現
5.1用戶層的實現
5.1.1 基于病人用戶的操作
病人需要通過瀏覽器登錄到系統,需要輸入用戶名、密碼以及驗證碼。登錄 界面如圖5.1所示。
圖 5.1 病人用戶登錄界面
登錄成功后,在病人操作界面中,需要完善個人信息,如圖5.2所示。
圖 5.2 病人完善個人信息界面
病人可以在“醫療信息管理”這一欄中參看已存在的醫療信息記錄,每一條
就診信息會按時間順序,就診地點,就診醫生列出,如圖5-3所示。
病人可以自主對已存在的醫療信息進行數據補充,也可上傳文件,例如做的
CT、核磁共振影像等。如圖5.4所示。
圖 5.4 文件上傳
病人可以對每條醫療信息記錄設定閱讀權限級別,每條醫療信息記錄默認閱
讀權限級別為LOW級別,如圖5.5所示。
圖 5.5 醫療信息記錄閱讀權限修改
病人可以查看自己的信息被調閱的情況,調用記錄中記載包括被調閱時間、
調閱人,以達到病人可知曉數據被使用情況,如圖 5.6所示。
圖 5.6 被調用醫療信息記錄
5.1.2 基于醫生用戶的操作
醫生通過瀏覽器登錄到系統,同樣需要輸入用戶名、密碼以及驗證碼。登錄
界面如圖 5.7 所示。
圖 5.7 醫生登錄界面
登錄成功后,在醫生操作界面中,需要完善個人信息,如圖5.8所示。
醫生可以在“就診管理”中查看已接診的相關醫療信息記錄,這些記錄會按 時間順序列出當天接診的病人病情簡介信息,其中包含醫療記錄名、患者名、年
齡等,以便醫生查看,如圖 5.9所示。
凋閱信息
圖 5.9 已接診病人記錄圖
醫生可以在“調閱信息”中調閱已就診病人更多的信息。醫生賬號有一個默 認閱讀權限級別,當醫生需要調閱病人更多信息時,會首先驗證醫生的權限級別。 當權限符合時,則直接調閱;若權限級別不夠,醫生需要申請暫時提升醫生權限 級別,提升成功后可以調閱對應信息,提升失敗則無法獲取更多信息,如圖 5.10
所示。
圖 5.10 無權限調閱更多信息說明圖
5.2應用層的實現
用戶層所需要使用到的所有模塊的業務均是在應用層實現的。以下將介紹各 個模塊在應用層中的業務流程。
5.2.1 登錄模塊
登錄模塊業務流程圖如圖 5.11所示。
圖 5.11 登錄模塊業務流程圖
登錄模塊的類圖如圖5.12所示。
Mysql
Login
-code_success :int
+_init_(j: void
+ is_right(): string
- query_data(): string + token_info(): int
Token
+ _init_() : void -getToken ( ) : string
+ is_expire() : int
+ is_token( ) : int
-save_token ( ) : int
圖 5.12 登錄模塊的類圖
用戶通過網頁登入系統時,系統接收到用戶層傳來的數據。應用層會先對數 據進行過濾,除去非法字符,以防通過mysql注入威脅到數據安全。Login類中的 query_data 方法將系統接收到的用戶名和對應的密碼作為參數,并在內部構建查 詢條件,同時與數據層中的 Mysql 數據庫連接,進行用戶名、密碼查詢。無論數 據層中的 Mysql 數據庫中是否有用戶名對應的密碼或者是否有該用戶名存在,都 將由 is_right 方法向用戶層返回對應信息。如果不存在用戶輸入的用戶名,則會 返回“用戶名不存在”的提示信息;如果用戶名存在,則緊接著對比密碼,密碼 對比失敗,則會返回“用戶名或密碼錯誤”的提示信息。當所有信息成功對比后, 系統得到一串 token, 這個 token 是由 Token 類中的 getToken 方法產生的,將當前 的用戶名、調用時的時間戳等信息組合進行MD5或SHA256加密,新生成的token 會被保存到數據層中的Mysql數據庫中,這串token是有時效性的,具體時效可 自行設定。系統將登錄成功的信息以及 token 一齊返回給用戶層,用戶層成功接 收后會提示用戶成功登錄。
5.2.2 基本信息管理模塊
基本信息管理模塊業務流程圖如圖5.13所示。
圖 5.13 基本信息管理模塊業務流程圖
基本信息管理模塊類圖如圖5.14所示。
圖 5.14 基本信息管理模塊類圖
無論病人用戶還是醫生用戶在成功登入系統后,都需要通過基本信息管理模 塊完善個人信息。用戶在用戶層的網頁中填入對應的信息,然后提交給系統。系 統首先通過 Token 類校驗 token 的有效性,若沒有校驗通過,系統將跳轉至登錄 界面;若校驗通過。系統接下來會對接收到數據進行過濾,以保證系統的安全。 過濾后的數據按照一定的規則組建后,存儲到數據層的Mysql數據庫中,這一步 驟通過調用 Mysql 類與 Mysql 數據庫進行連接,如果數據存入 Mysql 數據庫失 敗,系統會嘗試重新執行,如果依舊失敗,通過調用Log類,將Mysql數據庫返 回的異常信息記錄到日志當中,并返回“系統異常”的信息至用戶層;當重新執 行數據存儲的操作成功后,系統將返回“信息添加成功”給用戶層。
5.2.3 醫療信息管理模塊
用戶若需要查看自身相關的醫療信息,可以通過醫療信息管理模塊來實現。 醫療信息管理模塊業務流程圖如圖5.15所示。
圖 5.15 醫療信息管理模塊業務流程圖
醫療信息管理模塊類圖如圖5.16所示。
圖 5.16 醫療信息管理模塊類圖
系統在收到用戶層操作時,先會對模塊的操作做一個有效性驗證,這個步驟 由 Token 類中的 is_token 和 is_expire 方法實現。在 is_expire 方法內部,將當前時 間戳與生成 token 時設置的最大期限時間戳進行對比,如果當前時間戳比預存的 時間戳大時,表明該 token 過期了, Manage_info 類中的 token_info 方法將對應的 信息傳遞給系統,系統將會跳轉到登錄界面讓用戶重新登錄。如果當前時間戳小 于預存的時間戳,表明沒有過期,將會延長當前token的有效期,具體延長時間 可自行設置,并將存儲在數據層中的 Mysql 數據庫中的最大期限時間戳更新。 Manage_info類中的data_exist方法會在數據層的Mysql數據庫中檢查當前用戶有 沒就診記錄,如果沒有,則返回none給用戶層;如果有,則會按照一定的規則將 數據組裝,例如就診時間、就診醫院、診斷醫生等,返回給用戶層。
病人用戶若收到無就診記錄信息的提示,意味著病人用戶還未進行過診療。 只有進行過就診后,系統才會錄入相關就診信息。
醫療信息管理模塊中還有就診信息完善和醫療資料補充功能,病人在查看每 條診療信息時,都能通過這兩個功能完善診療信息。
功能業務流程圖如圖5.17所示。
圖 5.17 功能業務流程圖
系統會先校驗 token 是否過期,若過期則返回到登錄界面;若沒過期,系統 識別數據的類型,用戶補充的醫療信息一般是普通數據或者文件,并與數據層的 IPFS進行下一步業務操作。Manage_info類中的update_data方法,會將補充的數 據與原數據綁定,以防數據丟失。該方法也負責與數據層中的 IPFS 進行業務通 信,接收IPFS加密信息后返回的Hash值。系統與區塊鏈層進行業務通信,再由 區塊鏈層上傳信息至聯盟鏈。 Request 類中實現區塊鏈層與聯盟鏈通信,通過 handle_result 方法接收的返回數據判斷信息是否成功上傳。如果沒有成功,系統 將重新申請數據上傳,若依舊上傳失敗,在日志中記錄聯盟鏈返回的錯誤碼,然 后以短信或郵件等形式通知管理員,應用層返回“系統異常”的信息給用戶層; 信息上傳成功,區塊鏈層反饋給應用層,應用層緊接著將“操作成功”的信息返 回給用戶層。
5.2.4 醫療信息權限管理模塊
用戶可以通過醫療信息權限管理模塊對診療信息進行權限級別設置。醫療信 息權限管理模塊業務流程圖如圖5.18所示。
圖 5.18 醫療信息權限管理模塊業務流程圖
醫療信息權限管理模塊類圖如圖5.19所示。
圖 5.19 醫療信息權限管理模塊類圖
用戶對醫療信息設定閱讀權限級別時,有low、mid、high三個級別可供選擇。 應用層在接收到用戶層設置數據權限操作后,由Token類負責判斷token是否過 期。 Token 驗證通過,系統才可進一步處理數據,否則直接返回到登錄頁面。 Authority_info 類中的 data_exist 方法與區塊鏈層的 Mysql 數據庫建立連接,將要 更改權限的醫療信息記錄的詳細信息提取出來,update_level方法將系統提取到的 閱讀級別數據作為參數,實現醫療信息記錄閱讀權限的更改。Reques類將對應醫 療信息的Hash值,上傳到聯盟鏈中,通過智能合約對已存儲的信息進行更改。如 果區塊鏈層返回“操作失敗”的信息,則對數據重發,若依舊存儲失敗,在日志 中記錄區塊鏈層返回的錯誤碼,以短信或郵件等形式通知管理員,應用層返回“系 統異常”的信息給用戶層;如果成功,區塊鏈層返回“操作成功”的信息給應用 層,應用層返回“已成功存儲”信息給用戶層。
5.2.5 監控信息狀態模塊
用戶能夠通過監控信息狀態模塊,查看自己的信息是否被調用。監控信息狀 態模塊業務流程圖如圖5.20所示。
YES
v
返回數據 給用戶層
用戶層申請信 息被調用記錄
tok^n驗證 晨否通過?
”在數據層、
Mysq^據庫查喪「 、記錄是否存在匸
YIES
V
返回Cfnone 至前臺
數據組建
查詢構建
(重新登錄
圖 5.20 監控信息狀態模塊業務流程圖
監控信息狀態模塊類圖如圖5.21所示。
圖 5.21 監控信息狀態模塊類圖
系統收到用戶層查詢請求后,先校驗token是否過期,這個校驗過程由Token 類實現otoken過期,系統跳轉至登錄界面;token沒過期,系統繼續執行剩余步驟。 Monitor_info 類中的 query_data 方法中實現查詢條件構建,與數據層的 Mysql 數 據庫建立連接,在其中查找是否有對應信息被調閱的記錄。若存在記錄,將數據 依照一定的規則組裝后返回給用戶層;若不存在,應用層返回 none 信息至用戶 層,用戶被告知沒有該信息被調用的記錄。
5.2.6 就診管理模塊
醫生用戶通過就診管理模塊查看已接診的病人信息的記錄。就診管理模塊流 程業務圖如圖5.22所示。
就診管理模塊類圖如圖5.23所示。
Mysql
圖 5.23 就診管理模塊類圖
系統接收到醫生用戶查閱病人信息的操作請求后,先進行 token 驗證,這個 校驗過程由Token類實現。token過期,系統跳轉至登錄界面;token沒過期,系 統繼續執行剩余步驟。 Pati_infoTOdoc 類中的 query_data 方法內部實現構建查詢 條件,與數據層的Mysql數據庫連接,并查找是否有該醫生用戶已接診病人記錄。 若存在,將數據按一定規則,如病人ID、就診時間等,進行組合,然后返回給用 戶層;若不存在,則會返回 none 給用戶層,系統會提示沒有新的病人信息記錄
5.2.7 調閱信息模塊
當醫生用戶需要調閱當前所查看的病人的更多信息時,則需要使用調閱信息 模塊。調閱信息模塊業務流程圖如圖5.23所示。
YES
YES
YES
申請病人更 多信息調閱
目標數據 •回給用戶層
tok亡n驗證 是否通過?
返回 調閱失敗' 給用戶層
申請權 限提升是否成 、功孑/
,TS生權釀'、 級別對比是否成 、功? /
從數據層的 IPFS獲取數據
從區塊鏈層 獲取加密特征
數據組裝
圖 5.23 調閱信息模塊業務流程圖
調閱信息模塊類圖如圖5.24所示。
圖 5.24 調閱信息模塊類圖
當醫生用戶發起查看病人更多信息的操作后,系統對 token 進行校驗,這個 校驗過程由Token類實現。token過期,系統跳轉至登錄界面;token沒有過期, 系統繼續執行剩余步驟。Check_infoTOdoc類中的blockchain方法通過Request類 實現區塊鏈層上傳系統提取到的當前醫生用戶閱讀級別至聯盟鏈,如果區塊鏈層 沒有上傳成功,Request類會對數據進行重發,如果多次嘗試后仍失敗,在日志中 記錄聯盟鏈返回的錯誤碼,并且通知管理員,應用層將“系統錯誤”的信息返回 給用戶層。數據上傳成功,當前醫生用戶閱讀級別在聯盟鏈中與要調取信息的閱 讀權限級別做比較,看是否滿足可調閱的要求,應用層等待處理結果。
當應用層收到權限不足的返回信息時,系統會提示用戶是否需要做權限臨時 提升,這個過程由Check_infoTOdoc類中的level_improve方法實現。如果權限申 請沒有通過,應用層返回“申請失敗”的信息給用戶層,用戶層向醫生用戶提示 “權限申請失敗,調閱信息失敗”。如果權限申請通過后,將重復上述訪問操作。 Check_infoTOdoc類中的ipfs方法調用IPFS類,實現在數據層的IPFS中查找目 標信息。目標信息被成功返回后,經過組裝后返回給用戶層,醫生成功獲取信息。
5.3數據層的實現
5.3.1IPFS 層
(1) 搭建私有網絡
分布式醫療信息管理系統是基于聯盟鏈運行,IPFS —般使用的是公有集群, 為與系統相匹配,故需要搭建私有IPFS網絡。
在本系統中,設定四個節點,一個為主機節點A,另外三個為虛擬機節點B, C,Do私有網絡所有的節點必須共享同一個密鑰,通過密鑰工具創建一個密鑰, 并將同一密鑰復制進B、C、D節點中,同時在每一個節點下刪除掉所有的默認啟 動節點,然后添加一個默認節點,默認節點可以是 A,B,C,D 中的任意一個, 這里選取A為默認節點。將A節點的地址添加進其他三個節點里面,啟動各個節 點,A,B,C,D四個節點銜接在一起,構成了私有IPFS網絡。私有網絡示意圖 如圖5.25所示。
圖 5.25 私有網絡示意圖
私有網絡構建后,便可添加目標文件到私有網絡中。目標文件成功添加到私 有網絡后,會返回一個獨屬于該文件的Hash值,這個Hash值是對目標文件的映 射。
在私有網絡中,我們可以在四個節點中的任意一個節點上查看目標文件。輸 入Hash值,便可讀出我們要查找的文件。為了保證系統的及時響應,會依據網絡 繁忙程度以及訪問者與節點之間的距離來優先選擇接入節點。
(2) IPFS業務運行
IPFS運行示意圖如圖5.26所示。
數據層中的IPFS主要實現兩個功能,文件加密及存儲功能和文件定位功能。 IPFS中提供接口供應用層中的各模塊使用,應用層中的信息管理模塊使用文件加 密及存儲功能,其他的模塊主要使用文件定位功能。接口提供的功能函數如表5.1 所示。
表 5.1 IPFS 接口功能函數
功能函數 參數 說明
add path 存儲文件到IPFS
cat ref 顯示IPFS對象數據
get ref 下載IPFS對象數據
醫療信息模塊通過接口使用add功能函數存儲文件數據,當文件數據成功被 存儲時,IPFS會返回一個與文件數據對應的Hash值,作為兩者之間的映射。
應用中的其他模塊依據需求使用接口提供的 cat 和 get 功能函數對文件進行 讀取或者下載操作,在調用對應的功能函數過程中,待查找的目標文件的Hash值 會作為參數傳入功能函數。
5.3.2Mysql 數據庫
Mysql 數據庫負責存儲應用層的數據,應用層所有模塊產生的數據都會存入 其中,并且應用層會依據用戶層操作對Mysql數據庫進行數據讀取。以下是用戶 層的模塊在Mysql數據庫中建立的數據模型。
登錄模塊的數據模型如表5.2 所示:
表 5.2 登錄模塊的數據模型
字段 類型 說明
id int 用戶編號
username varchar 用戶名
pswd varchar 用戶密碼
login_time timestamp 登錄時間
role_num int 用戶類型
登錄模塊對應的數據表是Login_info,主要存儲用戶的登錄信息,包括用戶 名、密碼、角色類型等。role_num字段的默認值是10,代表著是病人用戶,也可 以設定為20,即醫生用戶。
醫療信息管理模塊的數據模型如表5.3所示:
表 5.3 醫療信息管理模塊的數據模型
字段 類型 說明
id int 信息編號
adding_pati_data txt 診斷信息補充資料
upload_time timestamp 上傳時間
update_time timestamp 修改時間
to_IPFS varchar IPFS返回的加密Hash
信息的閱讀級別。默認
read_level tinyint 設置為1。
醫療信息管理模塊對應的數據表是Patient_info,主要存儲病人用戶的醫療信 息記錄,包括補充醫療信息,上傳時間,信息對應的Hash值等。adding_pati_data 字段存儲的是病人對診斷信息的補充資料。read_level字段默認設置為1,代表閱 讀權限等級為LOW,同樣可設置為2和4,分別代表為MID和HIGH。
監控信息狀態模塊的數據模型如表5.4所示:
表 5.4 監控信息狀態模塊的數據模型
字段 類型 說明
id int 記錄編號
hospital_num int 醫院編號
doctor_id int 調閱醫生的ID
pati_data_id int 病人數據編號
time timestamp 調閱時間
監控信息狀態模塊對應的數據表是Monitor_info,主要是存儲醫療信息記錄 被調用的信息,包括數據編號,調用人,調用時間等。
就診管理模塊的數據模型如表5.5所示:
表 5.5 就診管理模塊的數據模型
字段 類型 說明
id int 記錄編號
treating_data txt 就診病人的診療數據
pati_id int 就診病人的ID
treating_startTime timestamp 診斷開始時間
treating_endTime timestamp 診斷結束時間
doctor id int 診療醫生的ID
就診管理模塊對應的數據表是Pati_info_doc,主要存儲醫生已接診的病人信 息,包括病人編號,醫療信息,診斷開始時間,診斷結束時間等。treating_data字 段存儲的是診療結束后產生的病人診斷信息。
5.4區塊鏈層的實現
5.4.1 區塊鏈層運行形式
區塊鏈層是以接口的形式與聯盟鏈通信的。區塊鏈層與聯盟鏈通信模型如圖 5.27所示。
圖 5.27 區塊鏈層與聯盟鏈通信模型
區塊鏈層通過接口編譯、部署和調用智能合約。當編譯成功后,智能合約才 能部署聯盟鏈中。應用層需要存儲和調用聯盟鏈上的信息時,區塊鏈層會在調用 聯盟鏈上的智能合約完成對應的任務。
5.4.2 智能合約的部署
本系統的智能合約是使用Solidity語言進行編寫的。Solidity是一門面向合約 的、為實現智能合約而創建的高級編程語言,能在以太坊虛擬機(EVM)上運行 a】。Solidity是靜態類型語言,支持繼承、庫和復雜的用戶定義類型等特性。
本系統中的智能合約提供信息存儲以及信息讀取功能,涉及到的主要的結構
函數或結構體 參數 說明
struct _info bytes dataHash; uint threshold; uint dataUpload; address owner; address addr; 存放加密文件所屬信息
struct OWNER mapping(bytes => _info) filemap; bytes fileHash, 映射文件
function saveInfo uint fileUploadTime,
uint level 實現加密文件存儲
function getInfo bytes fileHash,
uint level 獲取文件信息
智能合約部署流程圖如圖5.28所示。
圖 5.28 智能合約部署流程圖
智能合約部署函數調用順序圖如圖5.29所示。
圖 5.29 智能合約部署函數調用順序圖
區塊鏈層在進行智能合約部署過程中,首先初始化QsnarkSDK模塊,這個操 作是為對一些必要參數進行配置。將智能合約的源碼按照dict的格式組裝好,這 將作為編譯函數compile_contract的參數。compile_contract函數會與聯盟鏈的編 譯接口進行通信,依據編譯接口返回的數據查看是否成功編譯。返回的數據中的 Code, Status關鍵字是判斷的關鍵。當Code為0, Status為ok時,表示編譯成 功,同時取出返回結果Bin和Abi關鍵字中的數據進行下一步的智能合約的部署; 若Code為1013時,則表示編譯失敗,此時需要對代碼進行檢查,再次通過編譯 函數上傳至聯盟鏈,直至編譯成功。
聯盟鏈的部署接口提供兩種智能合約部署方式,異步部署與同步部署。異步 部署合約是直接返回交易的Hash值,但不能保證合約一定能部署成功,一般通過 查詢交易 Hash 是否有數據來判斷是否部署成功。同步部署合約是只有合約部署 成功或失敗后,才返回數據至區塊鏈層。考慮到分布式醫療信息管理系統在開發 環境下進行開發的,故在此處選取同步部署方式。智能合約是否部署成功是通過 聯盟鏈的智能合約部署接口返回數據來判斷的。同步部署函數 deploy_contract_sync接收已組織好的數據作為參數,與聯盟鏈的合約部署接口通 信。由于聯盟鏈接口返回數據格式是一致的,同樣是通過Code,Status關鍵字來 判斷部署是否成功。當Code為0,Status為ok時,表示智能合約同步部署成功。 取出其中ContractAddress的值,ContractAddress指的是智能合約部署在聯盟鏈上 的地址,智能合約地址會被保存起來做為緩存,區塊鏈層是通過智能合約地址調 用智能合約的。若Code為1015,則表示部署失敗,對代碼中的一些參數進行檢 查,再次通過同步部署函數上傳至聯盟鏈,直至部署成功。
5.4.3 智能合約的調用
成功部署智能合約后,便可調用合約。聯盟鏈的智能合約調用接口提供異步 和同步調用。異步調用合約是直接返回交易的Hash值,這種調用方式不是保證合 約一定調用成功,一般通過查詢交易Hash是否有數據來判斷是否調用成功;同步 調用合約是只有合約調用成或失敗后,才會返回數據。異步、同步調用合約函數 如表5.7所示。
表 5.7 異步、同步調用合約函數
函數 參數 說明
invoke_contract_async dict data 異步調用
invoke contract sync dict data 同步調用
data參數的數據組織如表5.8所示。
表 5.8 data 參數格式
鍵 值 說明
From string 合約調用者地址 true表示交易不走共識,
Const bool false 表示走共識,默認
為 false
方法名和方法參數經過
Payload string 編碼后的input字節碼
To string 智能合約地址
在調用之前,需要提前獲取到Payload。將編譯成功后得到的Abi的值與變量 值以及函數名組合在一起,訪問聯盟鏈的智能合約接口,成功響應后即得到 Payload。
在本系統中,為了保證系統的可靠性,選取同步調用方式。將組建好的 data 傳入同步調用函數invoke_contract_sync,同時在程序中加入1秒的時延來保證接 收到聯盟鏈的響應。同步調用的響應數據格式如表5.9所示。
表 5.9 同步調用的響應數據格式
返回字段 類型 說明
Code number 錯誤碼
Status string 狀態信息
TxHash string 本次交易的哈希值
ContractAddress string 合約地址
Ret string 調用返回值
DecodeRet string 調用返回值的解析結果
Code和Status字段判斷是否成功調用。當調用成功后,取出其中的TxHash, DecodeRet。 TxHash 的值是能夠查詢這次調用的相關信息,這個值會存入到數據 層中的Mysql數據庫。
智能合約中function saveInfo和function getInfo分別對應著信息存儲和信息 讀取功能。本系統通過智能合約存入到區塊鏈中的數據是加密特征信息,因此 function saveInfo中的參數包括加密Hash值,上傳時間,加密Hash值的閱讀權限 級別。當應用層調用對應的加密特征信息時,需要在function getInfo中通過加密 特征信息的閱讀權限級別對比,醫生用戶當前的信息閱讀權限會作為參數傳入 function getInfo 中。
每一次成功調用智能合約都會產生交易Hash,這個Hash包含了交易的詳情, 聯盟鏈將此統一成TxHash返回給區塊鏈層。聯盟鏈產生的TxHash能夠作為調用 記錄溯源的憑證,并提供給應用層的調閱信息模塊使用。
5.5本章小結
結合上一章中對系統的設計,本章對系統的用戶層、應用層、數據層和區塊 鏈層四個層次的業務與功能的實現做了詳細的描述。對用戶層中不同用戶角色的 操作做了配圖說明;通過業務流程圖和各模塊類圖對應用層中登錄模塊、醫療信 息管理模塊、就診信息模塊等模塊與系統的其他層的交互做了說明;構建數據層 中的 IPFS 私有網絡實現分布式存儲,并可以建立加密 Hash 與醫療信息的聯系, 而數據層中Mysql數據庫負責對不同數據對象的存儲;描述了區塊鏈層中智能合 約的結構與業務邏輯以及部署和調用流程。
第六章 分布式醫療信息管理系統的測試
系統在開發完成后,需要對系統進行測試,測試的進行能快速找到系統的 bug[40],并提升系統的健壯性。
6.1 用戶層功能測試
黑盒測試[41]能夠在不考慮模塊內部結構和內部特性的情況下,通過外部輸入 參數來檢查模塊功能是不是按需求規格說明的正常使用[42]。
在用戶層面上,通過黑盒測試對系統的登錄以及用戶操作進行功能測試[43]。
該測試選取病人用戶角色進行模擬測試。
登錄模塊測試用例如表6. 1所示。
表 6.1 登錄模塊測試用例
用例編號 LOGIN_TEST_001
用例名稱 登錄模塊測試用例
測試用例編號 測試內容 操作步驟 預期結果 實際結果
T-1 用戶名對應
密碼錯誤 在登錄界面 輸入用戶名 和密碼 系統提示
“密碼錯 誤” 與預期一致
T-2 用戶名不存
在 在登錄界面 輸入用戶名 和密碼 系統提示
“用戶名不 存在或密碼 錯誤” 與預期一致
T-3 驗證碼輸入
錯誤 在登錄界面
輸入驗證碼 系統提示
“驗證碼錯
誤” 與預期一致
醫療信息管理模塊測試用例如表6.2所示。
表 6.2 醫療信息管理模塊測試用例
用例編號 MANAGE_INFO_TEST_002
用例名稱 醫療信息管理模塊測試用例
測試用例編 號 測試內容 操作步驟 預期結果 實際結果
T-1 病人用戶登錄成 功,長時間不操 作后,進行其他 操作是否需要重 新登錄 登錄到病人 用戶界面 后,30分 鐘再執行其 他操作 系統提示
“登錄已過 期”,返回 到登錄界面 與預期一致
當前新用戶查看 病人操作界 面中點擊
“醫療信息 管理” 病人操作界
T-2 是否有醫療信息
記錄 面提示“沒
有數據” 與預期一致
T-3 對選中的醫療記 錄進行備注信息 補充 選中一條醫 療記錄,在 準備框填入 信息 系統提示
“數據補充
成功” 與預期一致
對選中的醫療記 選中一條醫 系統提示
T-4 錄,上傳補充文 療記錄,上 “文件上傳 與預期一致
件 傳文件 成功”
醫療信息權限管理模塊測試用例如表6.3所示。
表 6.3 醫療信息權限管理模塊測試用例
用例編號 AUTHORITY_MANAGENT_TEST_003
用例名稱 醫療信息權限管理模塊測試用例
測試用例編號 測試內容 操作步驟 預期結果 實際結果
監控信息狀態模塊測試用例如表6.4所示。
表 6.4 監控信息狀態模塊測試用例
用例編號 INFORMATION_MONITOR_TEST_04
用例名稱 監控信息狀態模塊測試用例
測試用例編號 測試內容 操作步驟 預期結果 實際結果
醫生用戶調 選取一個閱讀 病人用戶可
閱一條閱讀 權限高于MID 以查看到該
權限為MID 級別的醫生用 條醫療記錄
T-1 的記錄,病 戶,查看病人 的調用信息 與預期一致
人用戶可以 用戶一條閱讀
查看到對應 權限為MID的
的調閱記錄 醫療記錄
6.2數據層測試
數據層分為 IPFS 和 Mysql 數據庫。病人用戶對已就診記錄進行補充時,會 選擇上傳相關資料,包括文本,圖片以及醫學影像等。IPFS對不同類型的數據都 可以建立源數據與加密Hash之間的映射。以下選取jpeg格式圖片和dem格式CT 醫學影像進行IPFS存儲測試。
通過ipfs add <path>進行jpeg格式圖片添加。如圖6.1所示。
5 ipfs add 84bb2fld795斗斗亡6且0沁匸弓Of 68且幵?
added Qrn!h,PElYFC8GFCQri pnY17fRMXZ8XNRYL5APUls6ahj h.41f 84bb2fId79544e6a09e22f2c3Of 68a7f? jpeg
28.00 KiB / 2呂?00 KiB 100? 0曲
圖6.1添加jpeg格式圖片至ipfs中
添加格式為dem的CT醫學影像。如圖6.2所示
1 ipfs add 1.3.6.1.4.1.14519.5.2.1.5099.8010.610182862337917843065495431323.dem added QmQCgFsKKTOCpnLi JS&nSf dWBQNGL9D7tRGxeWDqPqUkR 1. 3.6.1.4.1.14519. 5.2.1. 509 9. 8010. 610182&62337917S43065495431323.don
514.71 K1B / 514.71 KiB 100. OO^fi
圖6.2添加dem格式的CT醫學影像至ipfs中
文件添加成功后,都會得到唯一的加密Hash。圖6.1中的加密Hash為 QmWPE1YFC8GFCQripnY17fRNXZ8XNRYL5APU1s6ahjhA1f;圖 6.2 中的加密 Hash 為 QmQCgFsKKTWCpnLiJ8SmSfdWWBQNGL9D7tRGxeWDqPqukR。
6.3區塊鏈層測試
智能合約部署到區塊鏈上,才能通過對智能合約的調用將相關信息存儲在區 塊鏈上。部署說明如圖6.3所示。
Contract2019-01-08 13:39:28 合約狀態:已銅
合約名稱 Contract2019-01-08 13:39:28
合細螢述 This is a contract created through API.
創建時間 2019-01-08 13:39:28
合約地址 ContractFromAPIDeployed: OxeO3 8a979a3ed4e93e6
圖 6.3 智能合約部署說明圖
智能合約中有一個function saveInfo(),通過對saveInfo()的調用,將加密Hash、
上傳時間和閱讀級別存入到區塊鏈中。如圖6.4所示。
/sol$ python3.6 blcokchain.py
{'Code*: 0, 'Status1: 'ok', 'TxHash1: '0x2fd524b6 38a60a5789ac01d95b4d c46fla5e71d6a34OO5dfd09fa', 1ContractAddress1: * 9x000000000000000000000000000000 0000000000', 1 Ret1: 10x000000000000000000000000000000000000000000000000000000000 0000001', 'DecodeRet*: 1abi not exist'}
圖 6.4 智能合約調用結果圖
每一次成功調用智能合約都會產生一個唯一的 TxHash 用于標記此次交易
TxHash提供發起方和接收方的地址信息。圖6.5所示。
接收方
圖6.5唯一交易表示Txhash說明圖
6.4本章小結
本章說明了測試的作用以及必要性。在用戶層,以病人用戶角色通過黑盒測 試方法對登錄模塊、醫療信息管理模塊、醫療信息權限管理模塊和監控信息狀態 模塊進行功能測試,并描述了四個模塊的測試用例;在數據層,選取.jpeg格式圖 片和 dcm 格式醫學影像進行 IPFS 加密存儲測試;在區塊鏈層,測試智能合約是 否正常部署以及智能合約能否被正常調用。
第七章 總結與展望
7.1 總結
現存的醫療信息系統因為平臺問題,彼此之間有很大的隔閡性。信息的不流 通不僅僅造成“信息孤島”現象,而且對病人用戶也不友好,病人用戶無法對自 己的數據有詳盡的了解。同時存儲在醫療信息系統中的信息的安全完全取決于平 臺。
區塊鏈作為一種去中心化分布式點對點數據庫,存儲在其中的信息是經過加 密的,這些技術特質很有利于解決現在的醫療信息系統中存在的問題。本文通過 構建基于區塊鏈的分布式醫療信息系統提出一種解決方案。
通過對分布式醫療醫療信息系統進行功能需求分析,將系統分為用戶層,應 用層,區塊鏈層和數據層四個層次,從這四個層次配合實現系統的功能。用戶層 進行多角色設計,包括病人用戶和醫生用戶,病人因病就醫從而產生醫療信息, 所以病人用戶可以在用戶層一覽自己歷來的醫療信息記錄,同時可以對醫療信息 記錄進行閱讀權限設計,本系統提供的信息被調閱功能可以讓病人用戶知曉對應 記錄被調閱的詳細信息;醫生用戶可以在用戶層查看自己已接診的病人相關信息, 若醫生用戶需要調用病人更多信息時,會有一個權限對比過程,當權限不足時, 系統提示是否進行權限提升申請,申請成功后,權限滿足了即可查看病人對應的 信息,這個過程會被系統記錄下來,作為被調閱信息功能的數據支撐。應用層作 為該系統的核心層次,不僅實現用戶層所需要的功能,同時還需要在業務過程中 與區塊鏈層以及數據層進行通信。區塊鏈層主要通過聯盟鏈提供的接口進行通信, 由部署在聯盟鏈上的智能合約實現加密信息的存儲、權限對比和信息提取。數據 層由IPFS和Mysql數據庫組成,系統構建了一個IPFS私有網絡,應用層可以快 速接入參與節點,實現快速醫療信息記錄的加密與信息記錄的查找功能;Mysql數 據庫中建立各功能模塊的數據模型,并存儲各功能模塊產生的數據。
綜上可知,本文設計的基于區塊鏈的分布式醫療信息管理系統能夠在一定程 度解決現存的醫療信息系統中信息不流通,病人掌握自有信息程度低的問題。
7.2展望
本系統經過設計,并能通過一些功能的實現一定程度上解決目前醫療信息系 統存在的問題,但依舊存在如下不足之處:
1.當前系統的用戶層界面交互不夠良好,可以進一步設置更人性化的提示;
2.該系統當前具備的功能符合一定的場景需求,然而系統在不斷地使用過 程中,會產生多樣化的功能需求,因此需要對系統的功能進行拓展;
3.用戶通過登錄獲取到的Token,本系統是將其存儲到Mysql數據庫中,每 一個操作進行token驗證都會連接到Mysql數據庫,但當用戶量變多,業 務量增大時,這樣會極大地影響服務器的性能,因此需要引入緩存機制或 是通過引入Redis數據庫將token存儲到內存中,減少與Myql數據庫的 連接;
4.在瀏覽器中通過加密Hash獲取存儲在IPFS中的文件后,不是所有的文 件都能在瀏覽器中打開,例如醫學影像。對源文件進行格式檢查,智能喚 醒可打開源文件的軟件,提升用戶良好使用體驗感;
5.當前使用的聯盟鏈是趣鏈科技公司開發的,由于醫療信息系統應用場景 是特定的,為滿足特殊需求需要對聯盟鏈進行定制開發,而不單單使用可 應用在一般場景的區塊鏈。自主構建聯盟鏈還能夠減輕業務與區塊鏈之 間通信時延,提升業務處理效率;
6.該系統中區塊鏈層對智能合約的調用采取的是同步調用方式,當用戶量 變多,為了保證用戶的體驗,應該采用異步調用的方式調用智能合約;
7.在未來,為了實現更多的功能,可以對智能合約進一步開發,實現多樣化 生態。
希望本系統在未來推廣使用過程中,不斷地改良,更好地解決以上問題。
參考文獻
[1]王慧.基于URP的校園信息化建設的研究[D].河海大學,2006.
[2]邱聲.論結構化電子病歷的應用[J].海峽科學,2013(09):25-27.
[3]能源系統中的區塊鏈:概念、應用與展望[J].電力建設,2017(2).
[4]Nakamoto S.Bitcoin:a peer-to-peer electronic cash system[Online],
available:https://bitcoin.org/bitcoin.pdf.October5,2018
[5]何蒲,于戈,張巖峰,etal •區塊鏈技術與應用前瞻綜述J] •計算機科學,2017(4).
⑹ 趙延紅[1],原寶華[2],梁軍[3].區塊鏈技術在醫療領域中的應用探討J] •中國醫 學教育技術, 2018.
[7]黃建華,江亞慧,李忠誠,et al.區塊鏈在醫療行業的應用前景[J] •醫學信息學雜 志,2018.
[8]大成•國家能源局:督查全國“兩會”保電工作[J] •中國設備工程,2018.
[9]葉珊珊,王濤•區塊鏈技術與陜西能源產業融合發展初探[J] •新西
部,2018,No.443(16):50-52.
[10]王現方,賈音,彭真,et al.密碼工程的創新——區塊鏈J].信息安全與通信保密, 2018,No.293(05):78-84.
[11]羅誠,溫麗君•區塊鏈技術在醫療領域的應用前景研究J].經貿實踐,2018, No.226(08):242.
[12]Yue X ,Wang H ,Jin D ,et al.Healthcare Data Gateways:Found Healthcare Intelligence on Blockchain with Novel Privacy Risk Control[J]. Journal of Medical Systems, 2016, 40(10).
[13]徐健,陳志德,龔平,王可可.基于區塊鏈網絡的醫療記錄安全儲存訪問方案 [J/OL].計算機應用:1-8[2019-03- 13].http://kns.cnki.net/kcms/detail/51.1307.TP.20190121.1013.058.html.
[14]薛騰飛,傅群超,王樅,et al.基于區塊鏈的醫療數據共享模型研究[J].自動化學 報,2017(09):73-80.
[15]薛騰飛,傅群超,王樅,et al.基于區塊鏈的醫療數據共享模型研究[J].自動化學 報,2017(09):73-80.
[16]Azaria A , Ekblaw A , Vieira T , et al. MedRec: Using Blockchain for Medical Data Aeeess and Permission Management[C]// 2016 2nd International Conferenee on Open and Big Data (OBD). IEEE, 2016.
[17]Xia Q , Sifah E B , Asamoah K O , et al. MeDShare: Trust-less Medieal Data Sharing Among Cloud Serviee Providers Via Bloekehain[J]. IEEE Aeeess, 2017:1-1.
[18]Peter Howson,Sarah Oakes,Zaehary Baynham-Herd,Jon Swords. Cryptoearbon: The promises and pitfalls of forest proteetion on a bloekehain[J]. Geoforum,2019,100.
[19]王元地,李粒,胡諜•區塊鏈研究綜述J] •中國礦業大學學報(社會科學 版),2018,20(03):74-86.
[20]楊宇光,張樹新•區塊鏈共識機制綜述[J].信息安全研究,2018,4(04):369-379.
[21]劉越男•區塊鏈技術在文件檔案管理中的應用初探J] •浙江檔案,2018, No.445(05):9-13.
[22]董寧•區塊鏈技術演進及產業應用展望J].信息安全研究,2017, 3(3):200-210.
[23]江曉珍•區塊鏈技術在金融領域的應用研究J] •四川文理學院學報,2018, v.28; No.154(04):34-39.
[24]王剛,劉珊杉,崔軍峰,et al.區塊鏈技術與應用淺析J] •中國無線電,2017(7).
[25]韓璇,劉亞敏•區塊鏈技術中的共識機制研究[J].信息網絡安全,2017(09):147-
152.
[26]張秋子•區塊鏈技術在金融行業的應用構想[D].2017.
[27]Chen Y , Li H , Li K , et al. An improved P2P file system seheme based on IPFS and Bloekehain[C]// 2017 IEEE International Conferenee on Big Data (Big Data). IEEE, 2017.
[28]Sicilia M A, Sanehez-Alonso S, Gare^a-B arrioeanal E. Sharing Linked Open Data over Peer-to-Peer Distributed File Systems: The Case of IPFS[M]// Metadata and Semanties Researeh. 2016.
[29]Dias D , Benet J . Distributed Web Applieations with IPFS, Tutorial[C]// International Conferenee on Web Engineering. Springer International Publishing, 2016.
[30]興業銀行股份有限公司西寧分行課題組,高海明.基于區塊鏈技術的合同防偽
[J]. 青海金融, 2018(3).
[31]王春宇,張守坤•智能合約與金融合約[J] •商,2016(6).
[32]金武,洪武,李濤,et al.區塊鏈技術發展現狀及其金融應用研究[J].海南金 融,2017(1):26-30.
[33]袁勇,王飛躍•區塊鏈技術發展現狀與展望[J].自動化學報,2016, 42(4):481-494.
[34]朱曉華•基于XML的MEMS材料數據庫設計與實現[D]•西北工業大學,2005.
[35]王倫,楊國東,許盛偉•數字土地信息系統的數據庫設計[J].測繪與空間地理信 息,2003,26(2):31-32.
[36]韓璇,劉亞敏•區塊鏈技術中的共識機制研究[J].信息網絡安全,2017(9).
[37]張圣垚.基于區塊鏈的電子病歷系統的設計與實現[D] •哈爾濱工業大 學,2018.
[38]趙哲.基于區塊鏈的檔案管理系統的研究與設計[D] •中國科學技術大 學,2018.
[39]安慶文•基于區塊鏈的去中心化交易關鍵技術研究及應用[D].
[40]Anvik J , Hiew L , Murphy G C . Who should fix this bug?[C]// 28th International Conferenee on Software Engineering (ICSE 2006), Shanghai, China, May 20-28, 2006. 2006.
[41]張新,焦豪•兩種黑盒測試方法的比較分析[J] •電子技術與軟件工 程,2018(07):61-63.
[42]許知博•基于Android的工廠設備信息點檢系統設計與實現[D]•西安電子科技 大學.
[43]李奕杭.基于區塊鏈的數字簽名系統的設計與實現[D].北京交通大學,2018.