张 辰,马素刚,李宥谋,牛 坚

(西安邮电大学 计算机学院,陕西 西安170121)

0 引言

医疗记录信息可以帮助医护人员了解患者的历史病情,制定更合适的治疗和护理方案。但是目前大部分患者进行跨机构就医时,由于缺乏以往的医疗记录信息,仍需要重复以前做过的各种检查,造成了医疗资源浪费、医疗费用高昂、医疗效率低下等问题。医疗记录信息高效共享的需求已经变得十分重要。

作为比特币[1]的核心技术,区块链技术得到了迅猛的发展。区块链技术利用加密链式结构来验证和存储数据,利用分布式共识来生成和更新数据。时间戳、对等网络(Peer-to-Peer Networking,P2P网络)[2]、加密技术[3]、共识机制[4]等多种技术的结合和巧妙的使用,使得区块链拥有去中心化、时序数据、不可篡改、可追溯等特性[5]。

在医疗记录共享中,用户信任是成功的关键因素。区块链的蓬勃发展为医疗记录的共享提供了一个新的方向。文献[6-7]结合区块链和云存储技术,提出了医疗数据的管理存储方案,实现了患者对个人医疗数据的完全控制。文献[8]提出了一种基于区块链技术的医疗记录解决方案,解决了用户数据的隐私与安全问题。文献[9]设计了一个基于实用拜占庭容错算法(Practical Byzantine Fault Tolerance,PBFT)的联盟式医疗区块链系统,其内容详尽充实,采用交易单ID上链的方式解决了用户匿名的问题,保护隐私信息。文献[10]针对由于特殊原因导致密钥不可得的情况,建立了一个共享密钥,可以合法地由各方共同参与密钥重建,从而保持数据的可用性。文献[11]构建了一个数据共享模型:MedChain模型。利用两个分散网络,将数据的可变部分和不可变部分有效地分离开来,实现了医疗数据的灵活存储和共享。

为了实现医疗记录的高效共享,本文构建了一个基于区块链的医疗系统。首先,系统利用了两个分散网络:区块链网络和访问网络。区块链网络存储记录文件的引用信息等一些固定的信息,访问网络用来存储文件的地址信息和权限信息等易变信息。通过将记录文件的地址信息分离到另一个网络中,可以打破记录文件存储位置的限制,实现灵活存储。其次,设计记录链把患者的记录信息连接起来,以及基于患者ID在链外建立严格平衡二叉排序树来提高查询效率。最后,只有记录文件的引用信息上链,而具体的文件仍由拥有它的医疗服务提供者独立存储和管理,有利于传统系统向基于区块链的医疗系统的过渡。

1 相关技术

1.1 严格平衡二叉排序树

平衡二叉排序树[12]是基于二分法策略提高数据查找速度的二叉树类型的数据结构。但是平衡二叉排序树的查找效率并不一定能达到静态查找表二分查找的时间效率,如图1所示。

显然,平衡二叉排序树还可以变得更加平衡,这就是严格平衡二叉排序树,引用文献[13]中的定义来描述严格平衡二叉树。

定义1:二叉树节点的严格平衡因子是其左子树的节点个数与右子树的节点个数之差。

定义2:若二叉树的所有节点的严格平衡因子的绝对值小于1,则称该二叉树是严格平衡二叉树。空二叉树被认为是严格平衡二叉树。

定义3:若二叉排序树是严格平衡二叉树,则称该二叉排序树是严格平衡二叉排序树。

严格平衡二叉排序树保证了可以在时间复杂度O(logN)内查找到结果。将图1的平衡二叉排序树转化为严格平衡二叉排序树,如图2所示,可以明显看出平均查找效率优于图1。

图2 严格平衡二叉排序树

1.2 密码学基础

1.2.1 哈希函数

哈希函数是把任意长度的输入变换成固定长度输出的算法。哈希函数具有以下两个特性:

1)单向性:对于一个给定的输出结果,不能逆推出输入。

2)抗碰撞性:很难找到两个不同的输入,通过哈希计算得出相同的输出。

基于上述两个特性,哈希函数被用来验证数据的完整性和数字签名。

1.2.2 加密技术

加解密算法主要有对称加密算法和非对称加密算法。对称加密算法中加密和解密使用相同的密钥,计算效率高,但是密钥在通信过程中容易泄露。非对称加密算法使用一对公私钥来进行加密和解密操作,这对密钥中,公钥对外公开,私钥自己持有。非对称加密安全度高,但计算效率低。通常通信过程中会使用对称加密和非对称加密结合的方式来传输数据,这种方式称为混合加密。混合加密的原理为:A先将明文进行对称加密后生成密文,然后将对称密钥利用B的公钥进行非对称加密生成加密密钥,最后将密文和加密密钥发送给B。B收到消息后,先将加密密钥利用自身的私钥解密出对称密钥,然后利用对称密钥解密出明文。

1.2.3 数字签名

数字签名巧妙地使用了非对称加密和哈希函数来保证数据的完整性以及确保签名者的身份。生成时,先对明文进行哈希运算得到摘要信息,然后发送方使用自身私钥对摘要信息进行加密,生成数字签名,最后将明文和数字签名发送出去。

验证时,接收方首先使用发送方公钥解密出摘要信息,然后对明文进行哈希运算得到原始摘要,进行对比,完全一致则说明接收到的消息确实来自于发送方且没有被修改过。

2 基于区块链的医疗系统

2.1 系统架构

基于区块链的医疗系统建立在一个分散的网络上,其连接了所有的医疗服务提供者。基于区块链的医疗系统包含两种类型的对等节点:超级对等节点和边缘对等节点。超级对等节点由大型医疗服务提供商的服务器组成,提供了数据共享的基础设施。边缘节点是来自小型医疗提供者的服务器,它们只存储实际的患者数据。图3显示了整个网络模型,其包含两个子网络:区块链网络和访问网络。

图3 系统架构

超级对等节点的资源分为三个模块:区块链服务、访问服务和医疗数据库。区块链服务器维护一条完整的医疗链,用于数据验证和提供查询服务。访问服务器维护所有的医疗服务提供者的服务器地址和医疗记录文件的权限信息。所有超级节点上的这两种类型的服务器构成两个子网络。医疗数据库存储患者的实际医疗记录文件。需要注意的是,基于区块链的医疗系统是传统医疗系统的延伸,并不要求医疗服务提供者将医疗数据迁移到新系统。

2.2 区块链服务

2.2.1 区块结构

区块链服务维护的医疗链存储了医疗记录文件的引用信息。在生成医疗记录文件时,创建数据生成事件,事件包含在区块中。区块及其事件的具体构成如图4所示。区块主要包括区块头和区块头以外的部分。区块头由版本号、前区块哈希值、时间戳、Merkle树根和区块发布者的公钥组成,区块头以外的部分主要包括事件个数、具体的事件以及区块头部的数字签名。其中,数字签名保证了区块内容的原始性,以及用来表明发布者的合法身份。事件主要包括了患者ID、记录文件哈希、产生机构、前一位置(上条记录所属事件在医疗链中的位置)、时间戳以及医疗服务提供者的公钥和数字签名。其中,前一位置字段用来优化查询。

图4 区块及其事件构成

2.2.2 共识算法

区块链服务器在所有的超级对等节点上运行区块链服务,这些超级对等节点共同提供一个区块链网络。每个区块链服务器都有医疗链的完整副本,它们使用PBFT共识机制来使系统快速达到共识。

区块链通过共识协议来保证数据的一致性,不同的共识算法有不同的适用性。对比于工作量证明(Proof Of Work,POW)[14]算法、权益证明(Proof Of Stake,POS)算法以及股份授权证明(Delegated Proof Of Stake,DPOS)[15]算法来说,PBFT算法适用于无代币的分布式系统,且在吞吐量以及交易确认时间方面有着巨大的优势[16-17]。其局限性在于在共识中至少要有超过2 3个正常节点,所以节点运行的环境需要相对安全、稳定。区块链服务参与共识的超级对等节点大多是大型医院,具有一定的公信力,出现恶意行为的情况远小于其他区块链系统,能够提供一个相对安全、稳定的环境,所以PBFT算法适用于系统的区块链服务。

2.2.3 引用查询

基于区块链的医疗系统的区块链服务向用户提供基于患者ID的记录引用查询功能。为了提高查询效率,设计记录链的结构:通过图4所示的前一位置字段可以将区块中的相关事件连接起来,从而将其内的医疗记录的引用信息连接起来,形成记录链。

当进行患者记录引用信息查询时,只需要找到最新的数据,通过记录链就可以把该患者的所有记录引用信息找到。除此之外,如何快速查找到最新的记录引用信息,对此也做了相关设计:对于每个医疗区块,基于患者ID在链外建立一棵严格平衡二叉排序树,使用严格平衡二叉排序树,可以在时间复杂度O(logN)内判断出一个区块内是否包含有所需信息。结合严格平衡二叉排序树和记录链,可以快速查找到一个患者所有记录的引用信息。

2.3 访问服务

医疗记录文件的哈希、产生机构以及所属患者等信息都是文件的固定信息,不可改变。这些信息适合存储在区块链上,但是文件还有一些易变信息,比如文件的存储位置以及文件的权限信息等,由于区块链数据不可篡改的特性,这些信息不适合存储在区块链上,所以要将这些易变信息分离出来另外进行存储。基于区块链的医疗系统的访问服务就是用来管理这些易变信息的,其保存有各个医疗服务提供者的服务器地址(实际提供记录文件访问的服务器地址)和医疗记录文件的权限信息。

访问服务维护一个地址表。地址表内记录了所有医疗服务提供者的服务器地址。系统对于记录文件的存储位置,只提供服务器地址这一单一的信息。因此,医疗服务提供者可以灵活存储自身拥有的医疗记录文件,向外提供统一的服务接口即可。用户只需要根据服务器地址信息,通过文件哈希就可以向对应的服务器进行合法的访问请求。访问服务要向用户提供实时可用的地址信息。当医疗服务提供者需要变更其提供访问的服务器地址时,需要向访问网络发送地址变更的请求,等各个访问服务器验证后,便可更改本地信息。

访问服务维护记录文件的权限信息,访问网络接收患者对自身医疗记录文件的权限变更请求。各个访问服务器只响应自身管理文件的权限变更请求,对于范围外的请求不予响应。也就是说各个医疗服务提供者独立管理自身机构的医疗记录文件的权限信息。

2.4 数据共享

2.4.1 数据生成

数据生成包括将生成事件添加到区块链服务器和将描述信息添加到访问服务。

步骤1:医疗服务提供者获取到患者的医疗记录文件;

步骤2:医疗服务提供者创建数据生成事件并将其发送到区块链服务,之后区块链服务将收集到的事件添加到新区块中;

步骤3:数据入链后,医疗服务提供者将描述信息(包括文件哈希、文件所属患者ID等)发送给对应的访问服务器。

2.4.2 数据访问

将数据信息添加到区块链服务和访问服务后,患者可以通过权限管理向请求者授予对应文件的访问权。完整的访问过程如图5所示。

图5 数据访问过程

图5 中:

步骤1:患者向区块链服务发送医疗记录查询请求。

步骤2:区块链服务器查询出该患者所有记录的引用信息(包括文件哈希、所属机构以及其所属的事件哈希和区块哈希)并返回给该患者。

步骤3、步骤4:患者选择要共享的记录,向访问服务发送权限变更并得到肯定回复。

步骤5:患者将要共享的记录的引用信息发送给请求者。

步骤6:请求者通过文件哈希和所属机构向访问网络获取到提供具体医疗记录文件访问的服务器地址。

步骤7:请求者向具体的医疗服务提供者发送访问请求。

步骤8、步骤9:医疗服务提供者向访问服务器查询请求的有效性并验证其合法性后,返回给请求者经过对称加密的文件和用请求者公钥加密的对称秘钥。

步骤10:请求者收到文件后,用私钥解密出对称秘钥并进一步得到具体文件,然后用记录所属的事件哈希以及区块哈希通过区块链服务来验证数据的完整性,保证得到文件的原始性和真实性。

3 结语

基于区块链的医疗系统为用户提供了便捷的操作、高效的查询、灵活的文件存储,能够有效实现医疗记录信息的安全快速共享,有利于传统医疗系统向基于区块链的医疗系统的转变。但是系统的功能比较单一,未来的研究将在不影响数据共享的情况下,丰富系统的功能,为用户提供更全面的服务。