APP下载

基于区块链的医疗信息系统及智能合约设计

2020-07-25孙学波姜金希

辽宁科技大学学报 2020年2期
关键词:医疗系统病历合约

孙学波,姜金希

(辽宁科技大学 计算机与软件学院,辽宁 鞍山 114051)

在医疗康复诊断与治疗的过程中,医疗信息的记录是不可缺少的一个环节,主要包括检查项目、治疗项目、医疗设施使用项目以及消费记录。由于医疗信息的隐私性和目前医疗信息记录存储方法的局限性,大部分患者对于自己的医疗信息记录并没有充分的了解和使用,这成为影响医疗质量及发展的主要因素。除此之外,医疗信息安全地共享和使用更成为医疗行业的难点。

区块链技术通过哈希索引形成链式结构,是由多方共同经营维护的数据库,区块链采用数据多节点、分布式多重存取,摆脱对互联网中心服务器的依赖,避免中心服务器篡改和丢失数据[1]。其核心在于通过密码技术确保存储在区块链上的数据记录很难被篡改或者造假。Kuo等[2]采用区块链私链网络技术创建一个跨机构的医疗健康预测模型。Ekblaw等[3]提出一个新颖的去中心化电子病历管理系统。

根据区块链技术和医疗系统的特点[4],本文以传统医疗信息记录存储的局限性为背景,设计一种基于区块链的医疗系统。此系统可以解决目前医疗系统中心化存储存在的问题。基于区块链技术的医疗系统可以保证信息的安全,同时患者可以通过系统及时了解自己的信息,有利于患者对医疗信息的使用和管理,方便患者的同时可以提高医疗保障的效率。

1 区块链在医疗信息系统中的应用

麻省理工学院Azaria等开发了一个名为ΜedRec的系统[5],解决数据的互操作性和权限管理问题,用于管理医疗记录。该系统的运行原理如图1所示。

该系统创新的关键在于采用新颖的区块链智能合约,为跨医疗机构分散的医疗数据创建记录管理系统,即使用区块链保存和管理电子病历,以满足患者、医疗机构和医学研究人员的需求。

ΜedRec提出三类智能合约,即登记合约(RC)、医患关系合约(PPC)和总结合约(SC),实现数据的权限管理。登记合约用来管理用户信息表,公钥作为其身份实现患者匿名登录;医患关系合约定义了一系列指针和相关访问权限,通过指针访问数据库中的数据,用于一个医生对一个患者的医疗信息的管理;总结合约用于管理一个患者所产生的所有医疗信息数据的集合。

在ΜedRec系统中,医疗数据并不存储在区块链上,而是依然存储在医疗机构本地数据库中,所以不能充分地保证医疗数据的安全性和防篡改性。

图1 系统流程图Fig.1 Flow chart of system

2 基于区块链医疗系统的体系结构

2.1 传统的医疗系统体系结构

医疗系统的发展过程经历三个阶段[6],分别为基于C/S(客户机和服务器)结构的医疗系统、基于B/S(浏览器/服务器模式)和C/S混合结构的医疗系统、基于B/S结构的医疗系统[7]。

2.1.1 基于C/S结构的医疗系统 早期的医疗系统使用了基于C/S的体系结构,这种医疗系统仅限于医疗机构内部使用。服务器主要用于存储数据并通过内部局域网为客户端请求做出响应。用户仅局限于医疗机构的内部人员,甚至不包括患者。这种系统中,信息的管理方式是中心化的。客户(或用户)之间的信息交流也必须通过服务器才能完成,客户之间一般不能实现交互。

2.1.2 基于B/S和C/S混合结构的医疗系统

随着互联网的发展,人们对基于C/S结构的医疗系统进行了进一步的改良,出现了基于B/S结构的医疗系统。从安全性和效率的角度考虑,建立基于B/S和C/S混合结构的医疗系统。

基于B/S和C/S混合的体系结构有效地扩大了系统服务的范围,为系统增加更多医疗方面或医疗相关的服务,但数据管理方式仍然是中心化的并且是封闭的,互联网的介入,使得系统的安全性增加了新的隐患。另外,在医疗系统的运作过程中,医疗过程本身的复杂性也为这种模式下数据本身的真实性和可信度提出新的挑战。

2.1.3 基于B/S结构的医疗系统 基于B/S结构的医疗系统用户界面完全通过WWW浏览器实现。数据库服务器没有专门的应用程序,医生客户端、查询浏览客户端、修改维护客户端、辅助检查及治疗客户端、财务客户端、管理客户端和患者服务客户端等应用程序基本上都在服务器端,应用程序的升级和维护都可以在服务器端完成,非常方便。图2为基于B/S的医疗系统体系结构。

2.2 区块链应用的层级架构

区块链最初作为比特币系统的底层技术被应用于比特币[8]。区块链是由多个区块相互链接构成的一种链式结构,每个区块由前一区块哈希、Μerker根、目标哈希、时间戳、随机数和交易数据等构成,并且由分布式存储、加密算法、P2P网络和共识机制等多个核心技术组成。

本文基于区块链基本结构创建了可编程的脚本代码(即智能合约),赋予区块链存储医疗数据和医患交互的功能[9]。在有智能合约功能的区块链平台、前端的调用以及各种接口和图形化的客户端的基础上,开发医疗系统,其层级架构如图3所示。

图2 基于B/S结构的医疗系统Fig.2 Μedical system based on B/S hybrid structure

图3 区块链医疗系统层级架构Fig.3 Hierarchy of blockchain medical system

物理节点层:每个节点进行共识备份和相互连接,网络中每个节点与节点相连,没有中心化的管理,每个节点都拥有服务器的功能[10],都记录整个系统中所有交易信息。

平台层:包括数据层、网络层和共识层。数据层给整个系统提供巨大的存储空间,区块内存储交易数据或普通医疗数据。网络层基于P2P网络、作为消息传播机制和数据验证机制,其作用是创建节点和实现安全的网络连接,为系统建立稳定和牢固的网络体系。共识层就是在不同节点之间建立信任,解决数据共享中的信任问题。

平台层的上一层是以太坊虚拟机EVΜ和远程过程调用协议RPC。RPC保证基于以太坊区块链开发的程序在节点之间的相互通信。整个开发系统的核心是基于以太坊虚拟机EVΜ(Ethereum virtual machine)建立代码运行环境[11]。

合约层:合约层是本系统设计的重要步骤[12],系统的所有功能及业务逻辑均通过编写智能合约以及前端的调用实现。本文采用的智能合约编程语言为solidity,经过编写后通过web3.js发送到solc编译器上编译成以太坊识别的二进制码。

应用层:应用层是系统开发出的去中心化应用,其中以太坊源码中提供一套基于JS的SDK—web3.js,开发者可以在自己的浏览器网页中通过调用web3.js执行以太坊所有的相关操作。前端通过区块链上的合约地址、接口和nonce值对其进行调用。

2.3 基于区块链的医疗系统体系结构

从医疗系统的发展现状、运行效率和运营成本等角度出发,本文提出一个比较现实的基于区块链的系统体系结构,如图4。相对于传统的B/S体系结构,增加一个名为区块链结点服务器的新构件,可以为医疗系统提供区块链数据服务。

在这个体系结构中,区块链结点服务器直接与Web服务器相连接,从而使系统的所有节点均可以通过该结点访问区块链系统。系统工作时,用户可以根据需要将医疗信息存储到区块链上或访问存储在区块链上的数据,有效提高系统的服务能力。区块链系统使用的信息将不再局限于某个特定的医疗系统存储和管理的数据,突破了中心化的数据管理方式,医疗过程中产生的各种医疗数据也可以有选择地存储到区块链中,从而进入一个更大的数据空间,这将极大地提高数据的共享程度。另外,区块链技术中的去中心化、可追溯和防篡改等特性为人们提供一个更为安全可靠的管理和使用医疗信息的方式。

图4 基于区块链的医疗系统的体系结构Fig.4 Hierarchical architecture of blockchain-based medical system

2.3.1 医疗信息的存储策略 医疗系统的核心工作是对每个患者的医疗过程进行有效的管理,医疗信息就是在这个过程中持续产生并不断存储到系统的数据库中。从系统工作效率、医疗过程的风险指数、疑难程度和用户需求等因素出发,一个合理的存储策略系统为不强制要求将所有患者的所有病历信息存储到区块链中,而是仅存储那些有研究价值、医疗风险指数较高和用户要求存储的那部分病历。

从存储的时机考虑,可采用联机实时存储和批处理两种方式。联机实时存储策略要求将对区块链的访问嵌入在必要的医疗信息处理过程中,即每产生一份医疗数据即在存储到系统数据库的同时将这份数据完整地存储到区块链中。批处理方式则指一个完整的医疗过程结束之后,再将这个过程中产生的医疗数据完整地存储到区块链中去。

这两种方式各有优缺点。联机实时方式主要优点是能够最大限度地保证数据的原始性和真实性,数据几乎没有机会被篡改。但数据存储到区块链耗时较高,会影响医疗系统的运行效率,也会增加系统实现的难度。批处理方式特点与联机实时性恰好相反,会简化系统中医疗信息处理模块的复杂度,仅需要在系统中单独设计一个区块链相关的子系统用来处理区块链数据的访问,但这种方式也增大了数据被篡改的风险。

一个比较好的策略是两种方式并存,使用时可以事先选择是否将数据存储到区块链中,在医疗过程中或结束后,也可以选择是否继续将医疗数据存储到区块链中去。

2.3.2 系统的基本功能 将区块链医疗信息系统看成是一个相对独立的信息系统[13],主要功能为用户信息以及用户的病历信息管理。用户信息管理主要是用户的注册、登录、修改用户信息、查看用户信息和查看医生信息;病历信息管理主要有查看病历信息、上传病历信息以及医生查看病历信息。系统的具体功能如图5所示。

医疗系统的用户分为两种:一是普通用户,包括患者和医生;二是研究人员,针对特殊患者数据进行采集、查看和研究。患者用户可以有选择地向医生发送问诊请求,医生用户也可以查看患者请求信息以及通过病历ID查看患者病历信息。研究人员可对有研究价值的患者病历进行查看。

图5 系统用户的功能Fig.5 Functions of system users

2.3.3 区块链医疗信息系统的概念结构模型从功能模型出发设计区块链医疗信息系统的概念结构模型,特点是不依赖具体的系统实体结构模型,包含的是实现区块链医疗系统本身的目标所需要的实体结构模型。所以,当把这个区块链医疗信息系统嵌入到具体的医疗系统中时,还需要一个具体的将医疗信息转换到区块链概念模型中的过程。

图6为用户概念模型。系统用户分成患者、医生和研究人员三种角色,三者均继承了抽象用户的UserID、用户密码、身份编号、姓名和出生日期等属性。每个医生用户同时具有医院、科室、专业职称、专业领域、一级分类、二级分类、患者满意度和医生擅长等多个方面的属性。患者用户的属性为一些简单的个人信息,患者用户与病历信息关联,其关联关系为1对多,一个患者可以有零到多份病历。研究人员的属性有研究机构、研究领域、国籍、省或者州、城市和电子邮件地址等。

图6 系统用户的概念模型Fig.6 Conceptual model of system users

图7 为与病历相关的结构类型。病历条目与病历相关联,关联关系为1对多,一份病历可以有多个病历条目。住院通知单、辅助检查、用药记录、外科治疗和出院小结继承病历条目中病历ID、日期、医生等所有属性。除此之外,每份住院通知单还由初步诊断、当前症状、主要病史、发病原因和住院通知单ID等属性构成。辅助检查中的项目名称、诊断意见和日期的属性由影像和生理指标检查继承。其中生理指标检查与生理指标检查条目关联,关联关系为1对多,一份生理指标检查可以有多个生理指标检查条目。生理指标检查包括检查单号的属性,生理指标检查条目包括指标名称、指标下限、指标上限和当前指标的属性。病历中的用药记录与用药记录明细相关联,关联的多重性为1对多,一份用药记录可以有多个用药记录明细,其中用药记录明细包括药品批号、药品名称、用药方法、每次用量、起始时间和结束时间的属性。而继承病历条目的外科治疗由名称、开始时间和结束时间的属性构成,出院小结由入院诊断、出院诊断、治疗经过和注意事项等属性构成。

图7 病历的概念模型Fig.7 Conceptual model of case

3 智能合约的设计

3.1 智能合约概述

在20世纪,由跨领域法律学者Nick Szabo提出:“一个智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议”。区块链技术的出现则为这个概念的实现提供了一个具体的技术平台,区块链技术的去中心化和信任机制推动了智能合约的发展。

传统的合约可以看成是一个双方或者多方协议[14],任何每一方都必须相互信任各方均会遵守协议并履行他所承担的义务;而智能合约则提供一个良好的信任机制,能够保证协议中的信息是真实可靠的,因此参加协议的各方无须彼此信任,只需要根据获得的信息作出必要的决策。

合约的内部结构主要由数据和方法组成,其中数据用于描述参与合约的各方的信息以及它们之间的交互,方法则提供了通过访问这些数据以履行合约的方法。

3.2 智能合约的程序设计机制

智能合约中包含很多不同的结构要素,使用这些要素可以有效地构建功能完备(所谓的图灵完备的)的智能合约,包括合约结构、状态变量、函数、函数修饰器、事件、映射、类型推断、以太币Ether单位、时间单位、函数调用、动态创建合约、赋值等。

从合约构成机制的角度来看,合约的创建、可见性和getter函数、函数修饰器modifier、Constant状态变量、继承、抽象合约、接口和库等机制都为合约的设计与实现提供了新的机制和方法。

使用solidity语言开发智能合约使用的具体机制如下:

(1)数据类型。开发智能合约时,可以使用的数据类型主要涉及无符号整数uint、结构体struct、字符串string、布尔bool、映射mapping和地址address等。

其中mapping是创建合约时使用的特有的一种数据类型,一个映射是一个由键值对组成的哈希表,每个value都与一个唯一的key对应。

另一个常用的类型是地址address,地址类型存储一个20字节的值,用于表示以太坊地址。合约中可以使用该类型表示部署的智能合约地址和区块链中的用户的地址。

与其他语言类似,结构用于表示一个数据结构类型,结构体可以由各种类型的数据成员构成。也是合约中经常使用的数据类型。

(2)状态变量。状态变量是指任何一个持久存储在合约中成员变量的值,用于表示合约的状态。状态变量的当前值表示了合约的当前状态,其变化过程当然也就表示了一个合约的生命历程。修改状态变量的值通常会改变合约状态。

(3)函数。与面向对象方法中的类相似,智能合约中也拥有成员函数,比较特殊的函数有不修改合约的View函数、承诺不读取或修改状态的Pure函数以及没有参数没有返回值甚至没有名字的Fallback函数。这些函数为合约的设计提供了新的限制和约束。

合约函数也可以分为内部调用函数和外部调用函数,内部调用函数是指在合约内调用其他合约的函数;外部调用函数则是可以通过JSON-RPC接口在外部调用的函数。

(4)合约之间的关联和继承。与面向对象方法中的类相似,合约之间也可以有继承关系和关联关系,甚至还可以设计抽象合约和合约接口,但由于合约的分布式特性,面向对象方法中的类的继承和关联又有一定的不同。使用这些关系时,像面向对象方法一样构造具有较多层次或复杂关联关系的合约可能会降低合约的访问性。

(5)合约事件。在智能合约中,还可以使用事件机制。一个事件发生时,订阅了这个事件的合约可以以特定的方式响应这个事件。

3.3 区块链系统的智能合约设计

从医疗信息系统本身的特点以及与区块链存储技术相结合方面的考虑出发,设计智能合约来实现一个区块链医疗信息系统,包括区块链医疗信息系统合约、患者合约、医生合约、研究人员合约和病历合约。

3.3.1 区块链医疗系统的智能合约设计 用合约及合约之间的关系来描述区块链医疗系统的逻辑结构,表示整个系统中需要存储的数据和能够提供的服务。

图8为系统中合约总体关系结构,包括区块链医疗信息系统合约(ΜISBC)、患者合约(Patient)、医生合约(Physician)、研究人员合约(Researcher)和病历合约(Case)以及在它们之间的关联关系。

(1)区块链医疗信息系统合约。区块链医疗信息系统(Μedical information system based on block chain,ΜISBC)合约用于表示整个区块链医疗系统,存储和保存所有患者以及患者的病历信息,还存储所有注册到本系统的医生的基本信息,并为其它用户访问这些信息提供必要的访问机制。该合约还存储注册到本系统的所有研究人员的基本信息,用于支持对系统中研究人员的信息和使用权限进行管理,同时为研究人员提供信息服务。另外,还为访问公开的病历信息提供必要的访问机制。任何人使用这个区块链系统,都应该首先访问这个合约。

(2)患者合约。患者合约用于存储患者用户的基本信息,患者可以通过这个合约存储和管理它的病历信息,还能通过区块链医疗信息系统向医生发出请求,得到系统中医生用户的服务,医生用户可根据患者ID看到患者个人信息,以及通过患者发送的病历ID查看患者的相关病历,并按照请求信息中的患者地址返回响应内容。

图8 区块链医疗系统结构图Fig.8 Structure of blockchain medical system

(3)病历合约。病历合约用于存储患者需要存储的病历信息,一般由患者本人存储在区块链系统中,分为公开病历和非公开病历。一般情况下,只有患者本身拥有使用病历信息的权限。必要时,经过授权的医生可以查看存储在区块链之上的病历信息。对于公开的病历,系统中的研究人员可以下载并使用这些病历。

(4)医生合约。医生合约用于存储系统中医生用户的基本信息,可以查询ΜISBC中存储的医生成员列表中相关信息。并且该合约还能通过区块链医疗信息系统为患者提供服务,医生可以对患者发送的医疗问题请求予以回应。患者可根据此种方式与医生实现交互。

(5)研究人员合约。研究人员合约用于存储系统中研究人员用户的基本信息。该合约用于对系统中对公开病历信息有需求的研究人员进行存储和管理,可以查询ΜISBC中存储的研究人员列表中的相关信息。

3.3.2 区块链医疗系统的智能合约中方法的设计 智能合约中的方法可以看成是部署到区块链中的应用程序为用户存储和访问区块链中的数据提供有效的访问机制和服务,同时也为用户访问这些数据提供必要的权限控制和权限管理。另外,合约中的每一个方法均可以看成是合约对外提供的一个功能单元。因此,动态地分析系统的外部行为是一个有效的智能合约设计方法。通过用例分析的方法逐步细化系统的动态行为,确定合约方法。

(1)用例分析方法。设计合约方法时,本文使用面向对象方法中的用例分析方法。首先分析的是上传数据的用例分析方法。上传数据就是将数据上传并存储到区块链中。上传数据的形式包括部署一个智能合约实例、访问一个合约方法或上传一个交易等多种形式。

例如,区块链医疗系统中,每增加一个患者、医生、研究人员或病历信息时都需要向区块链系统中部署一个新的合约实例。当向病历合约中添加病历明细时,则需要通过调用合约方法的方式向患者病历合约中添加数据。这可以在与此相关的合约中使用合适的ADD方法添加数据。

图9为上传病历用例的时序图模型,这个模型不仅描述用户上传病历的交互过程,还明确地给出实现这个过程时相关合约需要的方法。

图9 上传病历的时序图模型Fig.9 Time series graph model of uploaded medical record

(2)修改数据的方法。由于区块链本身具有不可篡改的特性,使得修改区块链数据的方法与传统的数据修改方法具有很大的区别。从本质上说,区块链数据的修改是不断增加新版本的数据值。任何对区块链数据的修改,都必须通过交易才能够完成,并且可能需要巨大的开销。因此,修改区块链数据必须通过特定的策略加以实现,例如需要删除数据时,可以通过在合约中关闭访问权限的方式进行,而不是真正删除区块链上的数据。增加数据时,可以向特定的映射表中添加数据。修改也只是给状态变量增加一个新版本的值。

(3)注销合约。区块链中的数据并不能进行篡改和删除,删除数据方法可以分为两种:一是对合约进行注销,即在编写合约时设置注销事件和触发注销事件。二是删除用户个人信息或删除患者病历数据。患者想删除系统中的病历信息,可以将Patient合约中的numofCases改成0,即患者病历个数为0,表示系统中已没有此患者病历信息。

(4)查询数据方法。查询数据方法即患者对医生信息的查询和研究人员对公开病历信息的查询。

3.4 智能合约的设计方法

在区块链医疗系统中,智能合约起到主导性的作用[15],可以用来完成系统中用户的管理、医疗数据的上传和医疗数据的获取等功能。可以认为ΜISBC是托管在区块链上并由智能合约控制的系统,允许任何参与者(患者)管理自己的医疗数据,或者系统用户(某个医生、某医疗机构或研发机构)根据医疗信息的状态考虑是否可以对患者的医疗信息进行访问。

总结智能合约的设计过程,能得到智能合约的一般设计方法。

(1)设计智能合约的概念模型。智能合约的概念模型来源于问题域,可以将问题域中的实体概念模型作为智能合约的概念模型。

(2)设计智能合约的逻辑模型。将概念模型细化成合约的逻辑模型,模型的主要构成元素包括合约、合约之间的关系、相关的数据结构、数据映射方法以及合约方法等。

(3)合约的程序设计。使用特定的程序设计语言,如Solidity语言等,完成合约的编写。

(4)合约的编译和部署。将编写完成的智能合约编译成二进制形式并部署到区块链中。

本文设计的合约分为两部分,一种是用来存储系统中的用户,此类合约的设计以系统用户为中心,所有参与用户通过注册医疗区块链系统确定其身份。每个参与用户ID都由以太坊地址表示,以太坊地址由用户的私钥控制。另一种是存储患者病历相关的医疗数据,此类合约的设计以病历为中心,通过提供数据的哈希函数和区块链上的属性来维护数据的真实性。

4 结论

本文对传统医疗系统数据共享面临的挑战进行分析,提出一种基于区块链的医疗系统体系结构,即在传统医疗系统的基础上增加区块链服务节点,扩大医疗数据的使用范围,实现基于区块链的医疗信息系统。讨论了区块链医疗信息系统的数据存储机制,给出了区块链医疗信息系统的功能结构设计、概念结构设计和逻辑结构设计,并使用智能合约技术给出了一个简单原型系统的实现。

(1)对现在医院的医疗系统进行整体的需求分析,构建区块链平台上的医疗系统概念模型,主要包括医疗系统的存储策略、系统的概念结构、智能合约的方法设计和设计方法等,并详细描述了系统的流程设计和业务逻辑。

(2)在区块链医疗系统上实现安全存储和共享的业务逻辑进行区块链医疗系统的功能设计,主要包括用户的注册和登录、患者病历的上传、病历的查询以及医患交互中的一些功能,并进行智能合约的开发设计。

本文所完成的工作仅能为基于区块链的医疗信息系统建设提供一些比较现实的技术思路和借鉴。后续工作中,建立合适的区块链类型、实现通用的医疗数据析取模块以及提高区块链系统的数据检索效率和存储效率等还有大量的问题需要解决和进一步完善。另外,对基于区块链医疗系统的前端设计技术和设计方法也是一个亟需解决的重要问题。

猜你喜欢

医疗系统病历合约
佳能医疗系统(中国)有限公司
佳能医疗系统(中国)有限公司
强迫症病历簿
“大数的认识”的诊断病历
为何要公开全部病历?
黑客频繁入侵医疗系统 警惕!医疗健康遭遇安全威胁
村医未写病历,谁之过?
医疗系统内部审计现状与对策
合约必守,谁能例外!——对“情势变更”制度不可寄于过高期望