基于区块链的电子病历系统的设计与实现

基于区块链的电子病历系统的设计与实现

ID:77695548

大小:5.29 MB

页数:89页

时间:2024-02-04

上传者:笑似︶ㄣ無奈
基于区块链的电子病历系统的设计与实现_第1页
基于区块链的电子病历系统的设计与实现_第2页
基于区块链的电子病历系统的设计与实现_第3页
基于区块链的电子病历系统的设计与实现_第4页
基于区块链的电子病历系统的设计与实现_第5页
基于区块链的电子病历系统的设计与实现_第6页
基于区块链的电子病历系统的设计与实现_第7页
基于区块链的电子病历系统的设计与实现_第8页
基于区块链的电子病历系统的设计与实现_第9页
基于区块链的电子病历系统的设计与实现_第10页
资源描述:

《基于区块链的电子病历系统的设计与实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

硕士学位论文基于区块链的电子病历系统的设计与实现DESIGNANDIMPLEMENTATIONOFELECTRONICMEDICALRECORDSYSTEMBASEDONBLOCKCHAIN张圣垚哈尔滨工业大学2018年6月 国内图书分类号:TP315学校代码:10213国际图书分类号:681.3密级:公开工程硕士学位论文基于区块链的电子病历系统的设计与实现硕士研究生:张圣垚导师:徐志明教授申请学位:工程硕士学科:计算机技术所在单位:计算机科学与技术学院答辩日期:2018年6月授予学位单位:哈尔滨工业大学 ClassifiedIndex:TP315U.D.C:681.3DissertationfortheMaster’sDegreeinEngineeringDESIGNANDIMPLEMENTATIONOFELECTRONICMEDICALRECORDSYSTEMBASEDONBLOCKCHAINCandidate:ZhangShengyaoSupervisor:Prof.XuZhimingAcademicDegreeAppliedfor:MasterofEngineeringSpeciality:ComputerTechnologyAffiliation:SchoolofComputerScienceandTechnologyDateofDefence:June,2018Degree-Conferring-Institution:HarbinInstituteofTechnology 哈尔滨工业大学工程硕士学位论文摘要在传统的医疗电子病历系统中,患者的电子病历由医院进行集中存储。这种集中存储会带来诸如信息安全、信息共享、隐私保护方面的问题。而近年来兴起的区块链技术具有安全可靠、去中心化、隐私性好等的特点,其已被应用在电子货币、数字资产保护、物联网等领域。本系统的目的就是将区块链技术应用到医疗电子病历系统中去,希望通过这样的方式来解决传统医疗电子病历系统中存在的安全性差、共享难、隐私保护性差等问题。本系统基于区块链技术,分别对区块链网络中使用的链代码、可以与区块链网络交互的后端客户端、独立前端以及相应的业务逻辑进行实现并进行了相应的测试。为了解决传统医疗电子病历系统存在的问题,本系统在其原有病历管理的基础上增加了权限管理、加密管理、私钥交易管理以及用户钱包管理等业务内容。其中,客户端的实现原理是基于交易请求在区块链网络内部处理流程。用户私钥加密、客户端动态密码以及链代码中相关结构体对象的标识位共同构成了系统的权限管理体系。私钥管理过程同样依赖区块链中链代码进行的身份认证等操作。AES+RSA混合加密保证了用户的隐私性。后端客户端除与区块链网络进行交互的部分外使用SpringBoot+SpringMVC+MyBatis的模式进行开发,独立前端部分使用Vue.js进行开发。本系统的区块链网络部分基于HyperledgerFaric框架进行开发。在系统测试方面,本文进行了相应的单元测试、功能测试并给出了测试用例。本系统是将区块链技术与医疗电子病历系统相结合的一次尝试,探究了区块链技术应用在该领域的可行性,希望以此为解决传统医疗电子病历系统中安全性差、共享难、隐私保护差等问题提供新的思路。关键字:区块链;数据加密;医疗电子病历-I- 哈尔滨工业大学工程硕士学位论文AbstractInthetraditionalelectronicmedicalrecordsystem,thepatient'selectronicmedicalrecordiscentrallystoredbythehospital.Suchcentralizedstoragewillbringsomeproblemsaboutinformationsecurity,informationsharingandprivacyprotection.Inrecentyears,blockchaintechnologyhasthecharacteristicsofsafety,highreliability,centralization,goodprivacyandsoon.Ithasbeenappliedinthefieldsofelectronicmoney,digitalassetprotection,andtheInternetofthings.Thepurposeofthissystemistoapplytheblockchaintechnologytothemedicalelectronicmedicalrecordsystem.Inthisway,wehopetosolvetheproblemsofpoorsecurity,difficultsharingandpoorprivacyprotectioninthetraditionalmedicalelectronicmedicalrecordsystem.Basedonblockchaintechnology,thesystemimplementsandteststhechaincodeusedintheblockchainnetwork,theclientwhichcaninteractwiththeblockchainnetwork,theindependentfrontpagesandthecorrespondingbusinesslogic.Inordertosolvetheproblemsofthetraditionalmedicalelectronicmedicalrecordsystem,thesystemhasaddedthebusinesslogicaboutauthoritymanagement,encryptionmanagement,privatekeytransactionmanagementanduserwalletmanagementonthebasisofitsoriginalmedicalrecordmanagement.Theimplementationprincipleoftheclientisbasedonthetransactionrequestintheblockchainnetworkinternalprocessingflow.User'sprivatekeyencryption,clientdynamicpassword,andmarkbitsofrelatedstructureobjectsinchaincodeconstituteasystemofauthoritymanagement.Theprivatekeymanagementprocessalsoreliesontheauthenticationofchaincodesinblockchains.AES+RSAmixedencryptionensurestheprivacyoftheuser.ServerclientsaredevelopedbyusingtheSpringBoot+SpringMVC+MyBatismodeinadditiontotheinteractionpartoftheblockchainnetwork,andtheindependentwebpages’partisdevelopedbyusingVue.js.TheblockchainnetworkofthesystemisdevelopedonthebasisofHyperledgerFaricframework.Intermsofsystemtesting,theunittests,functionaltestsandtestcasesaregiveninthispaper.Thissystemisanattempttocombineblockchaintechnologywithmedicalelectronicmedicalrecordsystemandexploresthefeasibilityoftheapplicationofblockchaintechnologyinthisfield,wehopingtoprovidenewideastosolvetheproblemsofpoorsecurity,difficultsharingandpoorprivacyprotectioninthetraditionalmedicalelectronicmedicalrecordsystem.Keywords:Blockchain,DataEncryption,Medicalelectronicmedicalrecord-II- 哈尔滨工业大学工程硕士学位论文目录摘要...............................................................................................................................IAbstract............................................................................................................................II第1章绪论......................................................................................................................11.1课题研究背景及意义..........................................................................................11.2国内外研究现状...................................................................................................21.2.1国内研究情况................................................................................................21.2.2国外研究情况................................................................................................31.2.3区块链技术在医疗领域研究情况..............................................................51.3区块链技术在医疗电子病历系统中的优势.....................................................51.4区块链技术概述...................................................................................................61.5课题主要研究内容...............................................................................................81.6本文的主要组织结构..........................................................................................8第2章基于区块链的电子病历系统的需求分析.....................................................102.1系统功能需求分析............................................................................................102.2系统非功能需求分析.......................................................................................122.3本章小节............................................................................................................13第3章基于区块链的电子病历系统的概要设计.....................................................143.1区块链网络的配置及原理...............................................................................143.2医疗电子病历系统设计...................................................................................163.2.1系统总体设计.............................................................................................163.2.2病历管理模块设计....................................................................................173.2.3病历权限管理模块设计............................................................................193.2.4登录模块设计.............................................................................................203.2.5区块链客户端设计....................................................................................203.2.6私钥交易管理模块设计............................................................................213.2.7钱包管理模块设计....................................................................................233.3本章小结............................................................................................................24第4章基于区块链的电子病历系统详细设计及实现.............................................254.1电子病历系统智能合约...................................................................................254.2区块链客户端的详细设计及实现...................................................................294.3电子病历系统病历管理模块的详细设计及实现..........................................35-III- 哈尔滨工业大学工程硕士学位论文4.4电子病历系统权限管理模块的详细设计及实现..........................................434.5电子病历系统登录模块的详细设计及实现..................................................454.6电子病历系统隐私保护模块的详细设计及实现..........................................464.7电子病历系统私钥交易管理模块的详细设计及实现.................................484.8电子病历系统钱包管理模块的详细设计及实现..........................................544.9本章小节............................................................................................................58第5章基于区块链的电子病历系统测试..................................................................595.1测试环境............................................................................................................595.2单元测试............................................................................................................595.3功能测试............................................................................................................655.4Web接口测试......................................................................................................725.5本章小节............................................................................................................75结论............................................................................................................................76参考文献........................................................................................................................77哈尔滨工业大学学位论文原创性声明和使用权限.................................................81致谢..............................................................................................................................82-IV- 哈尔滨工业大学工程硕士学位论文第1章绪论1.1课题研究背景及意义在传统的医疗电子病历系统中,患者本身并不持有电子病历,患者的电子病历会集中存储在其就诊的医院的系统中。这些医疗电子病历系统与医院使用的医疗业务系统是高度耦合的,而每家医院中的医疗系统可能都是不同软件厂商定做的。如果患者本身没有病历的备份或者病历备份信息丢失,而医院和医院之间的病历数据又不能及时进行共享,当患者需要去其他医院就诊时过往的医疗病历数据就不会被患者掌握,这无助于医生了解患者的病史以及制定相应的治疗方案。而且由于患者的电子病历集中存储在医院的病历系统中,如果医院的系统管理员出现渎职或者系统遭受黑客攻击,这些病历信息很容易被大量泄漏甚至被一些不法分子获取对患者的财产甚至人身安全造成威胁。另外,患者病历信息在未来甚至可以当作一种形式的电子资产,但传统的医疗电子病历系统中并不允许患者自己对病历信息进行加密,同样也不允许交易电子病历的行为。这些弊端会在未来的生活中逐渐暴露出来,而逐渐兴起的区块链技术正好可以解决上述提出的问题。区块链是一种分布式、去中心化的数据库,其中存储的是在参与者间共享的交易记录[1]。它基于密码学原理而不是信任,它允许任何两个有交易意愿的部分进行直接交易而不必通过可信任的第三方[2]。由于区块链账本是分布式的,任何人都可以获取系统中的公开数据。数据在区块链网络中存储依靠的主要媒介是若干个区块组成的链状结构,同时这些区块都被加盖了时间戳,使其能够容易被追溯。区块链系统的基本特性是去中心化,在这个系统中不存在一个中心支付清算系统。节点和节点之间的信息可以直接进行交互,任一节点的损坏都不会影响到整个网络的运行。这种去中心化的系统具有交易效率高、维护成本低、义务连续性高等优点。区块链使用密码学和数字签名来保护数据以及验证交易。通过这种方式,它就可以检查某个用户是否为某个资源的合法所有者、确认链上区块的有效性。区块链的上述优点和特性弥补了传统电子病历系统安全性低、不可交易、用户不持有自身病历以及共享难的问题,基于区块链的电子病历系统应运而生。-1- 哈尔滨工业大学工程硕士学位论文1.2国内外研究现状1.2.1国内研究情况随着比特币、莱特币等数字加密货币从小众科技舞台逐渐走向大众的视野,其背后所使用的的区块链技术引起了各行各业的关注。区块链技术具有去中心化、去信任、安全性高、隐私保护等特点[3,4]。国内学者和研究机构也越来越多地投入区块链技术的研究之中,其在金融[5]、能源、医疗等各个领域均有较为广泛的应用。在金融领域方面,区块链技术在精减结算流程、减少交易成本上具有很大的潜力[5]。私募股权需要交易和结算活动在安全的环境下按照时间顺序进行。由于目前一些交易股权的程序有第三方机构的参与,这些第三方机构导致了交易过程中出现的速度慢、效率低等问题。在引入了基于区块链技术后,交易时间被缩短、交易效率得到了提升,同时这些交易也变得可被追踪。在数字资产方面,股权、期货等可以被唯一确定的数字资产都能被记录在区块链上。使用区块链能查验数字资产归属权、也能对已完成交易进行追溯,在资产迁移时不需要依赖可信任的第三方中介就可以发动交易[6]。中国邮政银行和中国工商银行率先将区块链技术应用到了实际的业务中去,分别构建了以区块链技术为基础的资产托管系统以及扶贫基金管理平台,解决了传统资产托管、扶贫项目中监督难、审查难以及成本高的问题。在能源领域方面,张宁[7]等论述了区块链技术对能源互联网信息流动、业务交易等不同环节发挥的作用。杨晓东[8]等认为由于区块链具有高度自治化、高度去信任等特点,使能源网络通过相关智能合约变得高度自动化,减少人为干涉。邰雪[9]等提出了以区块链技术为核心的弱中心化的电力交易和阻塞管理方案。张俊[10]使用区块链群对智能分布式电力能源系统中的各种属性进行分析并构建出相应的模型,以此解决传统中心化系统的运营管理在该系统中不适用的问题。在区块链的基础研究方面,贾大宇[11]等提出了一种区块链数据副本分配策略,该策略可以用来提高区块链的存储容量和数据的稳定性。蔡维德[12]等针对区块链的一致性以及可拓展性的要求开展了深层次的研究,提出并讨论了一种新型的基于账户链与交易链的双链模型。邵奇峰[13]等结合比特币、Hyperledger等相关较为成熟的区块链框架平台,阐述了一个基于区块链的系统应当具有的体系结构。钱卫宁[14]等从可信数据管理的角度出发,介绍并分析了基于区块链技术与可信数据管理系统结合的可能性。刘傲迪[15]等从区块链在信-2- 哈尔滨工业大学工程硕士学位论文息安全领域研究现状的角度出发,综述了区块链应用于信息认证、访问权限控制、数据保护等领域的研究进展。袁勇[16]等提出了平行区块链的相关理论和研究方法。1.2.2国外研究情况区块链作为一个不可被篡改的账本,能够允许交易以去中心化的方式进行[17,18]。基于区块链的应用近期也大量涌现,囊括了包含物联网、教育等各个行业。国外的区块链技术起步比较早,相较国内而言,区块链技术也更加成熟,研究该技术的公司和学者也更多。HerbautN[19]提出了基于区块链的用户中心技术,该技术可以解决目前由于不断上升的过度视频消费而造成的互联网架构危机。ChakravortyA[20]等提出了一种用户中心的区块链,它允许社会媒体网络上的用户去控制、追溯他们分享的所有内容,他们还可以对这些内容进行所有权声明以解决可能出现的版权纠纷问题。区块链技术在物联网上也有一定的应用。在教育方面,NelsonBore[21]等利用区块链技术为肯尼亚的学校构建了一套能够保持完整记录的信息系统。ChansonM[22]等探索了区块链在隐私数据保护方面的优势和应用。CachinC[23]等讨论了评估和获得信任的一致性协议暴露于故障或者敌对节点时的恢复过程。CachinC认为通过遵循密码学和计算机安全的既定做法来实现这一目的。WatanabeH[24]提出了一种基于区块链技术的记录合同的方法。通过使用该方法,用户能够确认承包人已获得许可,这些合同的文件归档在区块链中便于追溯。MaesaDDF[25]等提出了一种基于区块链的访问资源的策略,该策略使得任何用户都可以随时了解谁正在访问资源。而且该解决方案允许分布式审计,防止欺诈者拒不执行相关策略。XuX[26]等提出了一种用于分类和比较区块链以及其系统的方法,以此来协助区块链开发者对其应用进行设计和评估。GervaisA[27]等介绍了一种新的定量框架来分析各种共识算法的性能及安全性,该定量框架还可以用于分析区块链工作量证明的网络参数。CoblenzM[28]开发了一种的新的编程语言,以此来帮助开发者编写更安全、更简介的链代码。为了减少隐私问题。O’ConnorR[29]也编写了一种新的编程语言,希望开发者能够在开发加密货币或者区块链应用时使用这种语言。XuL[30]等为基于区块链的共享经济应用提出了一种基于零知识机制的隐私保护的方法。LiangX[31]等设计并实现了一种能够收集并验证云数据来源的系统,它是通过将来源数据嵌入区块链交易中来实现收集和验证的。VukolićM[32]认为目前的区块链平台存在体系结构上的局限性,例如智能合约都是顺序-3- 哈尔滨工业大学工程硕士学位论文执行的、一致性协议是硬编码的以及信任模型是静态而非灵活的。VukolićM还讨论了IBM区块链平台HyperledgerFabric早期版本的局限性以及一种重新设计HyperledgerFabric体系结构的方法。LiW[33]等提出了名为卫星链的新概念,卫星链能够隐式且并行地运行多种不同的共识算法,从而大大增加了系统的可扩展性。GreenM[34]等提出一些构建匿名支付通道的技术,该技术允许安全、即时且私密的支付,大大减少了支付网络的存储负担。PassR[35]等提出了一新的区块链协议,该协议可以满足原始区块链需求的同时,还可以显著减少网络对矿池的需求。PorruS[36]等则认为在软件行业未来发展中,会出现面向区块链的软件工程,PorruS等还提出了一些应用上的挑战以及新方向。LuuL[37]等调查了一些加密货币在公开分布式网络中运行智能合约的安全性问题,他们找到了一些可能导致平台被攻击的问题并给出了改进提升的方法。DickersonT[38]等提出了一种允许矿工和验证者并行执行智能合约新方法,该方法是基于自适应软件事务内存技术。由于区块链具有可追溯的特性,其在供应链管理可以发挥很好的作用。KshetriN[39]等认为区块链技术可以在解决供应链安全问题中扮演重要的角色。AhmedS[40]同样认为通过为食品添加唯一的电子标签的方式,区块链技术可以对食品来源进行追溯,并以此来避免浪费提升食品安全。同时,在能源、物联网领域,引入区块链技术可以降低相关的运营成本并解决这些系统中存在的隐私保护问题。SikorskiJJ等[41]提出了一种区块链技术在机器对机器(M2M)交互方面的应用,该系统建立了一个在化学化工背景下的M2M电力市场。SamaniegoM[42]等认为在物联网中应用区块链技术有利于管理设备的配置信息、存储传感器数据以及使用微支付。SharmaPK[43]等提出了一种基于区块链的安全的物联网SDN架构。ÖzyılmazKR[44]等证明了低电存储量的物联网设备也可以被整合进基于区块链的基础设施网络中去。虽然区块链有许多优点,但是在现存的已投入使用的区块链系统如比特币项目运行中还是暴露了一些缺点。AsteT[45]等认为,区块链系统存在一些诸如能耗大、业务处理较慢、难以管理等缺点,这些在一定程度上可能会造成使用上的不便。FairleyP[46]也同样表达了对区块链技术巨大耗电量的担忧,他认为在未来如果区块链技术继续保持主流,那么维持庞大的区块链架构将是一件非常耗电的事情。-4- 哈尔滨工业大学工程硕士学位论文1.2.3区块链技术在医疗领域研究情况在医疗方面,国内外学者也进行了很多的探索并提出了一些针对当前医疗系统数据共享困难问题的区块链解决方案。薛腾飞[47]等提出了一种电子医疗信息分享模型,该模型以区块链技术为基础,有助于解决各医疗单位之间信息分享困难的问题。RajuS[48]等提出了关于使用区块链技术建立数据银行来管理教育以及医疗数据的设想。ShaeZ[49]等提出了一种区块链平台架构以帮助医学临床试验和精准医疗。AzariaA[50]等提出了一种基于区块链技术的医疗数据获取和权限管理系统。XiaQ[51]等认为病人的医疗记录在传递的过程中可能会面临诸如隐私泄漏、经济损失等多方面的风险。为了解决这些问题,XiaQ提出了一种共享医疗大数据在弱信任环境托管问题的解决方案。该系统基于区块链,并可以提供数据溯源、数据审计、共享医疗数据管控等功能。DubovitskayaA[52]等同样是基于区块链可追溯等优点,提出了一种安全可信任的医疗电子记录系统。AhramT[53]介绍了一种基于区块链的医疗健康应用Healthchain。上述的各种设想或解决方案普遍基于比特币的公有链加工作量机制的工作模式,而这种模式的缺点在于医疗数据无法及时更新到区块链上,其一次业务交易的耗时是远高于联盟链模式的。而且,随着用户客户端数量的增多,整个区块链系统的总耗能也不断增加,其最终可能导致高额的用电成本,变相增加用户的使用成本。最后,这些与区块链相关的医疗数据系统几乎都不支持用户医疗数据的交易。患者作为医疗数据的名义持有人,其医疗数据已经变成患者数字资产的一部分,患者应当有权利对其医疗数据信息进行买卖交易。1.3区块链技术在医疗电子病历系统中的优势在传统医疗系统中按功能角度划分一般分为进行开药、缴费、检测等业务的医疗业务系统以及对患者电子病历进行修改和维护的电子病历系统。患者无法直接持有自身的全部医疗数据,其医疗数据可能分别存储在不同医院的不同医务系统的电子病历子系统中,患者自身无法对自己的病历信息进行有效的控制。由于这些医疗系统的开发商不尽相同,这也导致了这些医疗数据的存储模式不同。而且,由于医院数据的集中性和封闭性,各医院的数据也无法进行共享,这对患者就医造成了很大的不便。而由于病历的集中式存储,一旦医院的系统遭受恶意攻击,其数据被恶意篡改或清除,这就会变相为患者带来不必要的经济损失。示意图如图1-1所示:-5- 哈尔滨工业大学工程硕士学位论文图1-1传统医疗系统模式在基于区块链技术的电子病历系统中,各个医院的患者病历信息都存储在区块链病历系统中。患者通过自身的私钥对其病历数据进行加密,在患者进行授权的情况下,医院才有权对患者的病历信息进行修改、增加等操作,保证了患者数据信息的私密性。医院对数据信息的访问通过统一的客户端进行,实现了数据共享。由于区块链中采用了工作量机制或PBFT算法,其内部数据极难被篡改,有效地保证了患者病历信息的安全。患者还可以对其自身持有的私钥进行交易,这就将传统的电子病历信息转化为新型数字资产。示意图如图1-2所示。图1-2基于区块链技术的医疗系统模式1.4区块链技术概述区块链是用分布式数据库识别、传播和记载信息的智能化对等网络。其分布式、对等节点的构造决定了其具有去中心化的特点。没有一个节点可以垄断-6- 哈尔滨工业大学工程硕士学位论文网络中的大部分信息,分布式网络中的各个节点都可以获取网络中的全量数据。其智能化体现在能运行在网络各个节点中的智能合约,这些智能合约不受人为因素的控制,只执行既定的程序流程,这种智能合约的存在是区块链技术具有去信任特点的一个主要原因。而如工作量机制、PBFT算法等共识算法则是区块链网络数据安全的保证。区块链技术中使用到的密码学相关技术则保证了用户信息的私密性。区块链这种独特的数据存储机制还带来了数据的高可追溯性的优势。所以,从直观的角度理解区块链,其可以被视作分布式网络+P2P网络传输+密码学加解密+智能合约+共识算法+区块链数据结构的结合体。三种具有代表性的区块链体系结构[13]如图1-3所示:图1-3区块链体系结构不同区块链体系结构的决定性差异是其共识层算法的差异。工作量机制的缺点在于其速度慢、耗能高。而医疗数据的要求是要几乎能够进行实时更新,基于工作量机制的公有链模式显然不能胜任这种应用情景。所以,本系统的开发是基于以PBFT作为底层共识算法的HyperledgerFabric。其优点是交易执行速度快,契合了医疗电子病历系统对交易速度的要求。-7- 哈尔滨工业大学工程硕士学位论文1.5课题主要研究内容区块链是一种分布式、去中心化的数据库,其中存储的是在参与者间共享的交易记录。它基于密码学原理而不是信任,它允许任何两个有交易意愿的部分进行直接交易而不必通过可信任的第三方。医疗健康领域对敏感数据的保护要求是非常严格的,区块链技术中隐私保护特性非常契合这一特点。而且由于区块链具有数据公开全网共享的特点,其可以用来解决当前医疗系统数据共享困难的问题。本课题就是基于区块链技术在医疗电子病历领域的一次尝试。本系统由区块链网络、后端客户端以及独立前端三部分构成。独立前端基于Vue.js进行开发,用户可以通过浏览器进行访问。后端客户端基于SpringBoot加SpringMVC开发模式,后端客户端对前端用户请求进行打包并转发给区块链网络。区块链网络部分基于IBM提供的HyperledgerFabric框架,区块链网络部分中的链代码会对数据包进行处理并存储。具体有以下工作内容:(1)详细研究基于区块链的电子病历系统的各种与业务相关的功能性需求和非功能需求,在此基础上设计系统相关的功能模块;(2)根据区块链网络链代码的工作原理以及链代码网络与客户端的交互原理,设计并实现能与区块链网络交互的后端客户端以及具有特定业务功能的链代码;(3)采用MVC架构对后端客户端涉及到的具体业务功能进行设计和实现并完成了独立前端相关页面的编写。1.6本文的主要组织结构本论文章节具体安排如下:第一章绪论简述了基于区块链的电子病历信息系统的研究背景以及国内外区块链相关领域研究现状,并对该电子病历信息系统的主要研究工作做出简单的描述。第二章基于区块链的医疗电子病历系统的需求分析,详细地阐述了该系统中所需要实现的功能性和非功能性需求。第三章基于区块链的医疗电子病历系统的概要设计,阐述了区块链网络拓扑的设计及其内部的原理、系统总体功能结构以及各个功能模块所涉及到的模型的设计。第四章基于区块链的医疗电子病历系统的详细设计及实现,对系统涉及到-8- 哈尔滨工业大学工程硕士学位论文的区块链网络链代码、和区块链交互的后端客户端以及各个功能模块设计到的业务逻辑进行详细设计并阐述相应的实现方案。第五章基于区块链的电子医疗病历系统测试,其对各个模块涉及的各个业务逻辑进行了设计了详细的测试用例并进行了测试以发现系统中存在的问题和不足。本文最后的总结部分对整个基于区块链的电子医疗病历系统开发流程、应用技术等内容进行了回顾,并对后续的相关改进工作进行了展望。-9- 哈尔滨工业大学工程硕士学位论文第2章基于区块链的电子病历系统的需求分析本章介绍了基于区块链的电子病历系统的功能需求以及非功能需求,并给出了系统功能需求的系统用例图以及这些需求的详细描述。2.1系统功能需求分析根据需求给出了系统用例图,如图2-1所示:图2-1系统用例图-10- 哈尔滨工业大学工程硕士学位论文系统所有功能的需求说明如表2-1所示:表2-1系统功能需求需求名称需求说明角色为已挂号且之前没有病历的用户创建新创建新病历用户病历病历修改修改某位用户的指定病历用户添加新病历为某位用户添加新病历用户查询某位用户的全部病历、查询某位用患者病历查询用户户指定病历、查询某用户病历总数等患者上传医学检查相关的图片,并可添图片上传用户加描述信息图片信息查询查询用户某个病历的所有已上传图片用户查询用户的病历是否是可被查询、可被查看患者病历权限系统添加、可被修改的若用户已存在病历,则将该病历设置为患者挂号用户可查询、可添加将用户病历设置为不可被修改、不可被患者注销用户添加使用AES加密患者的病历信息,使用RSA和AES加密系统RSA算法及其公钥加密用户AES密钥使用RSA算法及其私钥解密用户的AESRSA和AES解密系统密钥,使用AES算法解密用户病历信息RSA公钥上传用户RSA公钥上传至数据库用户创建登录账户创建新的登录账号用户登录使用户可以登录进系统中用户修改登录账户密码修改登录账户密码用户对区块链网络中的排序节点、普通节点节点信息配置系统等的网络地址等信息进行配置通过客户端创建并初始化区块链网络中通道创建系统的相关通道将链代码初始化并安装到区块链网络中部署链代码系统的各个节点上对查询类功能创建与链代码对应的查询创建查询请求系统请求发送查询请求向区块链网络中发送查询请求系统对交易类功能创建与链代码对应的查询创建交易请求系统请求-11- 哈尔滨工业大学工程硕士学位论文表2-1(续表)发送交易请求向区块链网络中发送交易请求钥请求方向创建一个关于私钥被请求方创建私钥交易用户的私钥交易私钥被请求方在请求方已支付交易金额后即发送私钥用户可发送其私钥私钥交易定价私钥被请求方为交易定价用户私钥请求方对此次交易进行确认,并以此来确认私钥交易用户获取被请求方发送的私钥在确认私钥交易的过程中,需要对私钥私钥验证系统的有效性进行验证被请求方在请求方已确认私钥交易后可结账对此次交易进行结账以获取请求方支付的钱用户数请求方可在已支付相应的交易金额后,退款确认私钥交易前进行退款操作,退回所支付用户的全部金额钱包创建用户可创建自己的电子钱包用户钱包充值用户可对自己电子钱包的进行充值用户余额查询查询用户电子钱包可用余额用户查询用户的所有交易记录,其中包括充钱包交易记录查询用户值、支出、退款以及收入交易的被请求方可以查询与其有关的交被请求方交易列表查询易列表,其中包含所有与其有关的交易的请用户求方用户id交易的请求方可以查询与其有关的交易请求方交易列表查询列表,其中包含所有与其有关的被请求方用用户户的id2.2系统非功能需求分析除系统的功能需求外,系统还应满足一些必需的非功能需求,本节将对这些非功能需求进行简单的需求。(1)响应时间需求本系统基于区块链网络加后端客户端的模式,由前端页面发送数据包给后端客户端,再由后端客户端将这些数据包进行拆包建模并构建新的交易请求发-12- 哈尔滨工业大学工程硕士学位论文送到区块链网络中由链代码进行处理。链代码处理结束后,会将结果信息一层一层地返回到前端进行显示。因此在后端客户端设计的过程中,应考虑若出现请求高峰期时,构建数据包、执行发送请求的时间时间要快,并尽量减少与区块链网络不必要的网络通讯,使响应时间尽可能快。(2)页面需求前端页面应该尽量简洁,如交易流程中交易状态的显示应尽量减少不必要的页面元素,减少用户的输入。系统整个界面应按模块进行合理划分,使用户能快速找到自己想要的功能。布局应该应适配各个主流浏览器,防止出现前端页面在不同浏览器显示不同的问题。(3)解耦需求为了提高整个系统的可维护性,区块链网络部分、后端客户端部分与前端部分应是相互独立的,它们之间的通信应全部由网络通讯完成。系统由这三个相互独立的部分组成保证了每个部分可以由专人进行维护而不必了解对方的业务,进行开发或更新时只需向对方开发维护人员提供对应的接口文档即可。前端和后端也不必像传统的J2EE一样同时处于一个项目并被部署到同一个服务器中,而是可以单独分开进行部署。通过这样的方式,整个系统的开发和维护成本被降低了,而效率则得到了提升。2.3本章小节本章对基于区块链的电子病历系统的整体功能和非功能需求进行了介绍。在功能需求分析部分给出了系统的用例图并表明了这些需求用例之间的关系,随后给出了基于系统用例图对私钥交易、病历管理等功能进行了详细需求描述。在非功能需求部分,给出了一些如响应时间需求、页面需求等非功能需求的介绍并给出相应的要求。-13- 哈尔滨工业大学工程硕士学位论文第3章基于区块链的电子病历系统的概要设计本章介绍了基于区块链的电子病历系统中区块链网络的配置及其原理,并对区块链网络中链代码中涉及到的结构体进行了设计,并详细阐述了其中的各个属性相应的数据类型及其代表的意义。3.1区块链网络的配置及原理在本区块链网络基于IBM的HyperledgerFabric框架,其中一共有一个排序节点和四个普通节点以及一个管理员节点用于生成相关的启动文件,该管理员节点会在网络启动后作为客户端来执行相关的命令。四个普通节点分别隶属于同一个管理域,该域下存在两个组织Org1以及Org2,Org1和Org2都加入同一个应用通道中。每个组织中的第一个节点作为锚节点与其它的组织进行通讯,所有节点通过域名都是能够彼此访问的[55]。整个区块链网络的网络拓扑图如图2-2所示:图3-1区块链网络拓扑图该区块链网络中的共识算法采用的是PracticalByzantineFaultTolerant(PBFT)算法[56]。定义客户端发送的请求为:σ,其中t代表当前时间的时c间戳,o代表需要进行的操作,c代表发送请求的客户端;定义节点处理结果为σ,其中v为当前视图编号,t为客户端发送请求时的时间戳,ic为客户端,i为处理请求的节点的编号,r为执行被请求的操作o后得到的结果,网络中可能出错的节点总数为f。随机选出网络中的某个节点称为主节点,即primary节点,其余所有节点称为备份节点,即backups节点。primary节点和所-14- 哈尔滨工业大学工程硕士学位论文有backups节点构成一个视图。算法3-1:PBFT算法:输入:请求消息σc输出:响应结果1:通过轮换或者随机算法选出某个节点为primary节点,得到视图v2:在视图v中,客户端c将请求σ发送给primary节点c3:primary节点将请求σ广播到所有backups节点c4:primary节点和所有backups节点执行请求σ中的操作o返并返回c处理结果σi5:客户端c等待f+1个从不同节点返回的相同处理结果并用该结果作为最终结果主节点的广播过程包括三个阶段:Pre-Prepare阶段、Prepare阶段以及Commit阶段。Pre-Prepare阶段及Prepare阶段的目的是为了保证在相同视图内请求发送顺序是正确的。Prepare阶段和Commit阶段的目的是保证在不同视图之间请求的确认的顺序不会发生混乱。Pre-Prepare阶段:primary节点在收到客户端c发送来的请求后为其分配提案编号,之后将Pre-Prepare消息<σ,𝑚>发送给primary各个backups节点,其中d为消息m的摘要,n为请求消息在视图v中被分配编号;Prepare阶段:backups节点收到Pre-Prepare消息后,对其合法性进行检验。如果检验结果为合法则将Prepare消息σ发送给其它节点,i同时接收其它节点发送来的Prepare消息。收到Prepare消息的节点同样需要对消息的合法性进行检验,若消息合法则将该消息写入消息日志中。若一个节点收集到了至少2f个来源不同的验证通过的消息,则该节点进入准备状态;Commit阶段:节点i向其它节点广播提交消息σ,i使其它节点了解提案n在视图v中已经处于准备状态。若节点i收集到的验证成功的提交消息数目大于或等于2f+1,则说明提案通过。整个PBFT算法的流程如图3-2所示,其中节点0为主节点,节点3为出现错误的节点,C是客户端。图3-2PBFT算法流程-15- 哈尔滨工业大学工程硕士学位论文3.2医疗电子病历系统设计3.2.1系统总体设计本系统可分为六个子模块:病历管理模块、病历权限管理模块、文本加解密模块、区块链客户端、私钥交易管理模块、钱包管理模块以及登录管理模块。系统总体设计功能结构图如图3-3所示:图3-3系统总体功能结构图-16- 哈尔滨工业大学工程硕士学位论文3.2.2病历管理模块设计系统中的病历管理模块主要包含以下五个子功能:(1)创建新病历:医生在登录系统后,在某患者已经授权即已经挂号的情况下,可以为该患者创建一份新的电子病历。该电子病历中包含患者的基本信息,例如身份证号、姓名等,和患者的诊疗信息,如患者主诉等;(2)添加新病历:医生在登录系统患者挂号的情况下,可为该患者在原有病历的基础上,添加新的病历且不需要重新创建患者的基本信息;(3)病历修改:对患者的某个病历进行修改,仅能在患者授权后进行操作;(4)患者病历查询:查询患者的病历信息,其中应当包含多种查询方式如查询患者指定病历、查询患者全部病历、查询患者病历总数等;(5)图片管理:包含图片上传以及图片信息查询这两个功能。如果文字不足以描述患者的相关症状,患者可以将医学检查的结果图片上传到系统中去。随后,医生在患者在挂号之后可查询其某次病历的所有相关的已上传的图片。区块链网络中链代码中患者病历模型设计如表3-1所示:表3-1链代码中患者病历模型设计字段名称数据类型说明CreateTimeint64患者病历创建时间IdCardNumberstring患者身份证号PatientNamestring患者姓名Birthdaystring出生日期Genderstring性别m为男性,f为女性Nationstring民族HomeAddressstring家庭住址是否有权限查询,0:不允许查询,AllowQueryint1:允许查询是否允许添加新病历,0:不允许添AllowAppendint加,1:允许添加MedicalContents数组患者的全部电子病历集合区块链网络中链代码中患者主诉等信息模型设计如表3-2所示:-17- 哈尔滨工业大学工程硕士学位论文表3-2链代码中患者主诉等信息信息模型设计字段名称数据类型说明IdNumberint患者该条病历的idAllowModifyint是否能够修改病历MedicalCreateTimeint64该条病历的创建时间MedicalTypeint64患者疾病类型MainSymptomsstring患者主诉DetailSymptomsDetailSymptomsContent患者症状详细信息DiseasesOnceSufferedstring患者曾患病SystemReviewstring系统回顾PatientPersonalPatientPersonalDescription患者个人史-DescriptionContent区块链网络中链代码中患者症状详细信息模型DetailSymptomsContent如表3-3所示:表3-3患者症状详细信息模型字段名称数据类型说明OnsetTimeAndPossiblePathogenystring发病时间和可能的病因MainSymptomsElaborateDescriptionstring主要症状的详细描述SimultaneousPhenomenonstring伴随症状OtherDiseasesstring患者患有的其他疾病GeneralConditionsstring发病以来的一般情况区块链网络中链代码中患者个人史信息模型PatientPersonalDescriptionContent如表3-4所示:表3-4患者个人史信息模型字段名称数据类型说明患者最近去过的地点以及RecentAreaAndDatestring时间患者起居习惯、卫生习HabitsAndCustomsstring惯、饮食规律Occupationstring患者的职业和工作环境患者有无冶游史,以及发VisitProstitutesstring生时间GrowthAndDevelopmentHistorystring患者生长发育史MaritalStatusstring患者婚姻情况Menstruationstring女性患者月经情况ReproductionConditionstring患者生殖健康情况区块链网络中链代码中患者图片相关模型UserImageInfo、UserImageUrls、-18- 哈尔滨工业大学工程硕士学位论文UserImageBank如表3-5、表3-6、表3-7所示:表3-5图片信息模型字段名称数据类型说明ImageDescriptionstring用户所上传的图片的描述信息用户上传的图片所在服务器中ImageUrlstring的位置的url地址UploadTimeint64用户上传图片时间的时间戳表3-6单次病历图片Url集合模型字段名称数据类型说明该数组包含某个用户病历ImageUrls[]UserImageInfo中的全部图片信息即UserImageInfo表3-7用户-图片模型字段名称数据类型说明IdCardNumberstring用户身份证号以map形式存储该用UserImageUrlsBankmap[string](*UserImageUrls)户各个病历相关的所有图片信息该模型中UserImageUrlsBank属性是一个map结构,其中的键为该用户某个病历的index值,该值和病历在患者病历模型的MedicalContents中某次病历在该数组中的位置是一一对应的,value值为UserImageUrls,即某个病历所有相关的图片的url。3.2.3病历权限管理模块设计系统中的病历权限管理模块主要包含以下三个子功能:(1)查询病历权限:对患者病历的查询、添加权限进行查询。对患者某个病历的修改权限进行查询;(2)患者挂号:若患者此前已创建了病历,则将该患者的病历的权限变为可被查询、可被添加;(3)患者注销:将患者的病历权限变为不可被查询、不可被添加。所有已被添加的病历条目权限变为不可被修改。在注销后仅可使用私钥查询自身的病历信息,不能对病历信息进行修改和增加操作。该模块涉及到的模型设计为表3-2、表3-2、表3-4以及表3-5。-19- 哈尔滨工业大学工程硕士学位论文3.2.4登录模块设计系统中登录模块包含以下三个子功能:(1)用户登录:使已创建登录账户的用户登录进电子病历系统以使用创建电子病历、查询电子病历等功能;(2)创建登录账户:新建一个可登录账号以登录电子病历系统;(3)修改登录密码:修改用户登录密码使得用户再次登录时可以用新密码进行登录。Java后端客户端登录账户模型如表3-8所示:表3-8登录账户用户模型字段名称数据类型说明idLong账户iduseridString用户名passwordString登录密码3.2.5区块链客户端设计系统中区块链客户端分为以下四个子功能:(1)请求管理:后端客户端与区块链网络进行交互要构建交互请求并发送请求。在本系统中,交互请求一共有两种。第一种为查询请求,其本身在区块链网络执行时只需进行链代码内置的查询,没有额外的开销。第二种为交易请求,这种请求一般用于执行用户自行实现的链代码,以执行特定的功能;(2)通道创建:用客户端操作区块链网络执行通道创建、通道配置、节点加入通道等功能;此外,客户端还需对以创建的通道进行序列化操作,以便在不重启区块链网络的情况下执行发送交易请求等操作;(3)节点信息配置:对在区块链网络中的所有节点的网络地址等信息进行配置,以便客户端能够与这些节点进行正常的网络交互;(4)部署链代码:对已经实现特定功能的链代码部署到区块链网络中,其中主要涉及链代码的实例化以及链代码的安装等操作。Java后端客户端程序中的组织模型设计如表3-9所示:-20- 哈尔滨工业大学工程硕士学位论文表3-9组织模型设计字段名称数据类型说明nameString组织的名称mspidString组织的mspidcaClientHFCAClient组织的CA客户端userMapMap组织中的所有用户peerLocationsMap组织中所有节点的位置ordererLocationsMap组织中所有排序节点的位置eventHubLocationMap组织中所有eventHub的位置peersSet组织中的所有节点adminSampleUser组织中负责查询、执行交易的成员caLocationString组织中CA的位置caPropertiesProperties组织中CA的配置peerAdminSampleUser组织中负责建立通道的成员domainNameString组织所在域的域名caNameString组织CA客户端名称Java后端程序中区块链网络中组织中的用户的模型设计如表3-10所示:表3-10组织中的用户的模型字段名称数据类型说明nameString组织中该用户的用户名rolesSet组织中该用户的角色accountString组织中该用户的账户信息affiliationString组织中该用户的附属enrollmentSecretString组织中该用户的登录密钥enrollmentEnrollment组织中该用户的注册登录状态keyValStoreSampleStore组织中该用户的相关文件信息组织中该用户的相关文件信息所keyValStoreNameString对应的键3.2.6私钥交易管理模块设计私钥交易管理模块分为以下九个子功能:(1)创建私钥交易:若用户A希望获得用户B的私钥,其可以创建和用户B相关的一个私钥交易请求;(2)私钥交易定价:在用户A创建了和用户B的私钥交易请求后,用户B可以对此次交易进行定价,该定价金额就是A需要支付的金额;-21- 哈尔滨工业大学工程硕士学位论文(3)支付对应金额:在用户B对用户A创建的交易进行定价后,用户A可对此次交易进行支付,支付的款项会被区块链网络中暂存;(4)发送私钥:用户B在用户A对此次交易进行支付后,可以将自己的私钥发送到系统中;(5)确认私钥交易:用户B发送私钥到系统中后,用户A需要对其发送的私钥进行确认,以确保用户B可以正常结账。该功能中包含私钥验证功能;(6)私钥验证:用户B发送私钥到系统中后,用户A在确认私钥交易会对用户B发送的私钥的有效性进行验证;(7)结账:在用户A完成确认私钥交易后,用户B可以对此次交易进行结账,以保证自身收到系统中暂存的款项;(8)退款:用户A在对款项进行支付后、确认私钥交易前可以进行退款,退回已支付的暂存在区块链网络中的所有款项;(9)交易列表查询:用户A即交易发起方和用户B交易被请求方分别可以查询与其相关交易的交易列表。链代码中私钥交易模型KeyTransaction如表3-11所示:表3-11私钥交易模型字段名称数据类型说明此次交易创建的时间的时CreateTimeint64间戳此次交易的定价,若还没Priceint被定价其值为-1此次交易是否已被支付,IsPaiedint已被支付为1,未被支付为0此次交易是否被成功确CanBeGetint认,成功确认时该值为1,未被成功确认时该值为0此次交易需要交易的私钥是否已经被发送至系统,已被PrivateKeySendint发送至系统时该值为1,未被发送至系统时该值为0此次交易是否正常完成,IsFinishedint正常完成为1,正在进行中为0,非正常结束如退款结束为-1-22- 哈尔滨工业大学工程硕士学位论文链代码中用户存储所有交易信息模型AutoTransactionBank如表3-12所示:表3-12用户-交易信息模型字段名称数据类型说明用户唯一标志,即身份IdCardNumberstring证号map结构中的string代表键,即私钥交易的被请求方AutoTransactionsmap[string][*KeyTransaction]的id,*KeyTransaction为值,即私钥交易模型链代码中某用户作为被请求方所存储的所有请求方用户id的模型KeyTransactionRequested如表3-13所示:表3-13私钥被请求方交易列表模型字段名称数据类型说明用户唯一标志,即身份IdCardNumberstring证号所有以该idCardNumberAnotherSideIds[]string为交易被请求方id的交易请求方id的数组集合交易请求方也存在相应的模型KeyTransactionRequest存储其所有被请求密钥方的id集合,KeyTransactionRequested和KeyTransactionRequest的目的是在前端查询某个用户发起的所有请求列表等需求提升运行效率。由于在区块链网络中交易存储的媒介是通过发起方的id,KeyTransactionRequested另外一个目的是使交易的被请求方存在一个模型来对与其相关的交易进行引用。3.2.7钱包管理模块设计钱包管理模块分为四个子功能:(1)钱包创建:创建某位用户的电子钱包,只有创建了钱包,用户才能进行钱包充值、余额查询等与钱包相关的操作;(2)钱包充值:为某位用户的电子钱包进行充值,使该用户可以进行私钥交易;(3)余额查询:查询某位用户的钱包余额;-23- 哈尔滨工业大学工程硕士学位论文(4)钱包交易记录查询:查询某位用户所发生的所有交易的交易记录,这些交易记录包括充值记录、退款记录、收入记录。区块链网络中链代码中用户钱包Wallet的模型如表3-14所示:表3-14钱包模型字段名称数据类型说明IdCardNumberstring用户唯一标志,即身份证号CurrentMoneyint用户当前余额区块链网络中链代码中用户钱包交易记录模型TransactionRecordBill如表3-15所示:表3-15交易账单模型字段名称数据类型说明AnotherSidestring用户所发生交易的另一方的id账单类型,若为1代表收入,为0BillTypeint代表支出、为2代表充值、为3代表退款用户所发生交易的交易金额,支BillAmountint出则为负数,收入则为正数用户所发生交易的交易时间的时HappenTimeint64间戳区块链网络中链代码中用户存储的所有交易记录模型TransactionRecordBills如表3-16所示:表3-16用户-交易账单模型字段名称数据类型说明IdCardNumberstring用户唯一标志,即身份证号用户所发生的所有交易的交易RecordBills[]TransactionRecordBill记录数组集合3.3本章小结本章对基于区块链的电子病历系统进行了概要设计,给出了系统整体功能结构图并对每个模块所应具备的子功能进行了详细的阐述。同时,分析了区块链网络中节点通讯的原理并构建了对应的网络拓扑结构。最后,根据相关的业务逻辑和功能设计了区块链链代码中所使用的结构体的相关属性,为后端客户端中对应实体设计以及业务流程的详细设计打下了基础。-24- 哈尔滨工业大学工程硕士学位论文第4章基于区块链的电子病历系统详细设计及实现本章的主要内容是根据前两章对系统需求的分析和概要设计,对系统所涉及到的所有模块进行详细设计和实现。同时,对各个业务逻辑所涉及到的前端进行开发并展示最后的效果图。4.1电子病历系统智能合约本系统的智能合约即链代码基于Go语言进行实现,运行在Hyperledger构建的区块链网络中,链代码与区块链网络中普通节点的交互流程[55]如图4-1所示:图4-1链代码信息交互用户链代码在调用自身的Start()方法后,首先会向节点发送REGISTER消息进行试注册。随后等待接受节点的消息。此时的状态为created。节点在收到链代码容器发送的REGISTER消息后,会将一个句柄结构注册到本地,返回REGISTERED消息。更新状态为established,随后自动发送READY消息给链代码侧,更新状态为ready。链代码侧在收到REGISTERED后,表明已注册成功,更新状态为established。收到节点发送的READY消息后更新自身状态为ready。随后,节点会向链代码容器一侧发送INIT消息,该消息的目的是使链代码容器-25- 哈尔滨工业大学工程硕士学位论文链代码进行相关初始化操作。链代码容器在收到该INIT消息后,调用用户链代码中的Init()方法进行初始化,注意链代码中的Init()函数和Invoke()函数都是可以被用户自定义的,用户可以在Init()方法内部实现一些根据业务需求定制的初始化流程代码。在初始化正确完成后,链代码容器会向节返回COMPLETED消息,此时链代码容器就可以被调用了。在调用链代码时,节点发送TRANSACTION消息给链代码。链代码在收到TRANSACTION消息后,会调用Invoke()方法,根据用户自己实现的业务逻辑,在Invoke()方法内部可以发出GET_STATE等消息给节点。节点侧在收到这些消息后开始进行处理并回复RESPONSE消息。最终,链代码侧会回复调用完成的消息COMPLETE给节点侧。此外,在整个调用的过程中,节点和代码侧还会定期发送KEEPALIVE给对方,以确保双方在线。Go语言链代码中的结构体详细设计如表4-1所示:表4-1智能合约相关结构体详细设计函数名参数描述信息接收并处理客户端发InvokeChaincodeStubInterface送来的请求InitChaincodeStubInterface链代码初始化函数ChaincodeStubInterface,检测用户某次病历是isAllowModifyUserContentByIndex[]string否是可被修改的ChaincodeStubInterface,检测用户病历是否可isAllowAppendUserContent[]string被添加ChaincodeStubInterface,检测用户病历是否可isAllowQueryUserContent[]string被查询ChaincodeStubInterface,锁定用户病历的可修lockMedicalContent[]string改、可增加权限ChaincodeStubInterface,解锁用户病历的可修patientRegistration[]string改、可增加权限ChaincodeStubInterface,updateMedicalContent更新用户病历信息[]stringChaincodeStubInterface,addNewMedicalContent添加患者病历信息[]stringChaincodeStubInterface,为一名患者创建新病create[]string历ChaincodeStubInterface,查询患者某次的病历queryMedicalContentsByIndex[]string信息-26- 哈尔滨工业大学工程硕士学位论文表4-1(续表)ChaincodeStubInterface,queryUserRecordCount查询患者病历总数[]stringChaincodeStubInterface,addNewKeyTransactionRecord新建一次私钥交易[]stringChaincodeStubInterface,查询某次私钥交易的queryKeyTransactionState[]string状态ChaincodeStubInterface,查询私钥被请求方交queryTransactionRequestedByRange[]string易列表ChaincodeStubInterface,查询私钥请求方交易queryTransactionRequestByRange[]string列表ChaincodeStubInterface,createWallet创建用户钱包[]stringChaincodeStubInterface,rechargeUserWallet用户钱包充值[]stringChaincodeStubInterface,queryUserWallet查询用户钱包余额[]stringChaincodeStubInterface,setKeyTransactionValue设置某次交易的金额[]stringChaincodeStubInterface,goingToPay对某次交易进行支付[]stringChaincodeStubInterface,setWhetherMoneyCanBeGet确认某次私钥交易[]stringChaincodeStubInterface,finishTransaction交易结账[]stringChaincodeStubInterface,validatePrivateKey验证用户私钥有效性[]stringChaincodeStubInterface,queryTransactionBillRecordCount查询用户账单总数[]stringChaincodeStubInterface,查询用户的几个具体queryTransactionBillRecordByRange[]string账单ChaincodeStubInterface,addNewPicture为某次病历添加图片[]stringChaincodeStubInterface,查询某次病历中所有queryUserImagesByIndex[]string图片的url信息ChaincodeStubInterface,查询某次病历中的图queryUserImagesCountByIndex[]string片总数ChaincodeStubInterface,returnMoneyBackToUser用户退款[]string-27- 哈尔滨工业大学工程硕士学位论文客户端调用智能合约即链代码中的Init方法,该方法的作用的初始化链代码并对其中的一些属性提前进行配置。而后,客户端就可以对链代码中提供的方法进行调用。客户端需要对交易请求进行提前配置,将需要调用的方法名以及需要传入的参数配置到请求中,并将请求发送给区块链网络中。在链代码执行交易请求的方法为Invoke方法,在Invoke方法内部会根据用户传入的方法名调用对应的程序逻辑以实现特定的功能。在程序逻辑执行的过程中,若在执行程序逻辑的过程中出现错误,则向客户端返回Error。反之,则返回Success。而这些函数中的ChaincodeStubInterface参数对象提供了对区块链进行读写的GetState、PutState等方法。客户端调用智能合约并执行相应程序逻辑的流程图如图4-2所示:图4-2智能合约执行流程图-28- 哈尔滨工业大学工程硕士学位论文4.2区块链客户端的详细设计及实现客户端和区块链网络的一次交互过程[55]如图4-3所示:图4-3客户端与区块链网络交互过程在这个过程中,客户端若要正确加入到区块链网络的通道中,则需要先从CA处获取有效的身份证书。在进行一个正式交易前,客户端要提前构建交易提案并将该交提案提交给担保节点即Endorser进行担保。客户端在获取一定数量的担保后就能构建一个合法的交易请求。随后,客户端会将该交易请求发送给排序节点进行排序。最后,客户端可以通过事件监听的方式来获悉该交易是否被成功接收。排序节点的唯一作用是将区块链网络中全部合法交易进行全局排序,并利用一组排序后的交易组合创建想要的区块结构。担保节点负责对客户端发送来的交易提案进行签名处理,具体包括合法性检查、模拟运行交易等操作。Committer节点负责维护区块链和账本结构。Committer节点会定期从排序节点处获取区块结构并检查担保策略等内容。在区块通过相关的检查后,Committer会执行合法交易,同时执行结果也会被写入账本中去,而最后Committer才会构建新的区块。CA的作用是管理网络中所有证书。整体而言,该交易过程与PBFT算法中的预处理过程以及其主流程是基本一致的。该交易过程中的节点逻辑角色与PBFT中的节点角色划分也是一致的。区块链客户端相关基类的详细设计如图4-4所示-29- 哈尔滨工业大学工程硕士学位论文图4-4客户端相关基类类图SampleUser和SampleOrg分别为区块链网络中的用户和组织在后端客户端的映射实体。在客户端与区块链网络交互的过程中,可以将其中的用户、组织中的属性信息映射到这些实体中去。通过这样的方式,相当于增加了一层在客户端和区块链网络间的中间层。客户端直接操作的是这些映射实体,在发送请求、创建通道的过程中,这些实体的具体内容才会被反馈到区块链网络中去。客户端初始化区块链网络的流程如图4-5所示:图4-5客户端初始化区块链网络的流程-30- 哈尔滨工业大学工程硕士学位论文检查客户端配置信息基本流程如图4-6所示:图4-6检查客户端配置信息流程图为了能与区块链网络中的管理员等节点进行交互,需要预先配置在客户端生成这些节点的实体并为这些节点按照区块链网络中的配置文件配置节点名称、所属组织以及网络地址等信息。根据配置文件,查看区块链网络中是否要使用CATLS(证书颁发机构传输层安全协议),若使用则配置CATLS的相关证书。否则,直接按照配置为区块链网络中的所有组织创建CA即可。创建并配置通道的程序流程如图4-7所示:-31- 哈尔滨工业大学工程硕士学位论文图4-7创建并配置通道流程图首先要设置节点管理员,因为只有节点管理员才可以创建通道。而创建通道还需要一个排序节点的配合,故要从一个组织的所有排序节点中随机选择一个。随后,对是否为第一次创建通道进行判断,若是第一次创建则创建一个全新的通道并进行序列化操作。反之,则直接通过序列化文件创建通道。随后,根据组织配置将组织中的普通节点和排序节点加入通道并设置通道监听,该监听的目的是获取区块链网络中链代码执行后返回给客户端的相关信息,若链代码没有正确执行客户端也能获取到出现的异常。最后,调用initialize方法对通道进行初始化,在这个过程中该方法会调用区块链网络来进行通道的创建操作。部署链代码的程序流程图如图4-8所示:-32- 哈尔滨工业大学工程硕士学位论文图4-8部署链代码的程序流程图创建交易请求的流程如图4-9所示:图4-9创建交易请求的流程图-33- 哈尔滨工业大学工程硕士学位论文创建交易请求时需要注意的是,在设置需要调用的链代码的方法名的时候该方法名指代的为Invoke、Init等公开方法。而在设置调用链代码的参数时,需要设置一个String类型的数组,该数组的第一个参数为开发者实现的某个链代码函数的函数名,该函数名即为invoke()中需要匹配的对应链代码的名称标识。该数组剩余的参数则是调用该函数需要传入的参数,这里是和链代码的具体实现中传入的参数一一对应的。发送交易请求的信息流程图如图4-10所示:图4-10发送请求信息流程图-34- 哈尔滨工业大学工程硕士学位论文发送交易请求需要提前构建好交易请求提案,具体流程如图4-10所示。将该交易请求提案发送到区块链网络中后通过返回的请求相应集合获取网络中每个节点所执行交易是否成功的结果。随后,对所有节点返回结果的一致性进行判断,若返回值不一致,说明所有节点没有达成共识,此时应抛出异常,程序结束。若所有节点已达成一致性结果,则还需判断是否有足够的担保节点来处理此次交易,若条件不满足则程序抛出异常,程序结束。若有足够的节点担保此次交易提案,则客户端则会根据这些提案构建交易请求,此时交易请求会被发送到区块链网络中,客户端则需要根据事件监听来判断是否需要进行抛出异常等其它操作,若不需要则交易请求被成功发送并执行。构建、发送查询请求的过程与构建、发送交易请求的过程类似。其中之一的区别在于在构建查询请求时调用的区块链网络共有方法为Query方法。另一点区别在于在发送查询请求时不需要判断一致性以及是否有足够的担保节点,因为仅做的为查询操作,不需要对区块链账本进行修改。而且由于区块链网络中每个节点都具有获取区块链中全量数据的能力,故只要有一个节点正确返回查询结果,程序即可结束并将此结果作为最终的查询结果。4.3电子病历系统病历管理模块的详细设计及实现病历管理模块相关基类如图4-11所示:图4-11病历管理模块相关基类类图-35- 哈尔滨工业大学工程硕士学位论文病历管理模块中需要使用的四个DAO类来自于表3-1、表3-2、表3-3以及表3-4中区块链网络中使用到的病历模型,本质上是这些模型在后端客户端中的实体映射。客户端在进行查询操作时,会将查询到的JSON字符串结果转化为以上的DAO类的实例,客户端在执行相关数据操作时就会直接操作这些客户端实例。同理,后端客户端在从前端获取用户输入数据后,也会直接将这些JSON类的字符串先转化为DAO类的实例,这是为了易于在事先分好的软件层次中进行层与层之间的数据传输。在对这些实例进行一些预处理操作后,才会将这些实例再次转换为JSON字符串并将其作为参数构建到需要发送给区块链网络的请求中去。在已分层的后端中,由于每一层都有特殊的功能,如在前端发送给后端的请求中,除了需要有用户输入的数据,还需要有后端提供给已登录用户的一个token字符串。但是token并不属于最终业务流程的一部分,所以要将token字符串和用户输入所构成的DAO再次封装到一个类即DTO中。在病历管理模块使用到的DTO类图如图4-12所示:图4-12DTO类图由于最终处理数据的业务逻辑在链代码上,所以客户端的主要职责为接收前端数据,并将这些数据打包构建成查询请求或是交易请求发送给区块链网络。区块链网络根据客户端所传参数选择正确的链代码进行处理,随后链代码会讲处理返回的结果逐层返回后端客户端,最后再由后端客户端返回给前端并进行相关信息的显示。以添加患者病历为例,其程序流程如图4-13所示:-36- 哈尔滨工业大学工程硕士学位论文图4-13添加患者病历程序流程图-37- 哈尔滨工业大学工程硕士学位论文链代码执行添加患者病历的程序流程如图4-14所示:图4-14链代码添加患者病历流程图-38- 哈尔滨工业大学工程硕士学位论文添加患者病历的前端页面如图4-15所示:图4-15添加患者病历前端页面链代码首先执行invoke方法,根据用户传来的参数选择添加患者病历的方法进行调用。该方法首先提取参数中患者的id和患者需要新建的病历数据。随后,根据患者的id使用链代码内置的GetState方法获取该患者在区块链中存储的病历信息。若在获取过程中出现错误或者该患者信息为空,则直接向客户端返回Error,此时若客户端收到Error信息则会抛出异常。若在获取过程中没有任何问题,则使用Go语言内置的unmarshal函数将获取到的比特数组类型的数据转化为Go语言中结构体指针类型的实例。Go语言中结构体与Java中类的功能是相似的,其指针类似于Java中的对象。转化为结构体指针后,就可以直接使用结构体中的公共方法和属性。由于每位用户都维护着一个病历类型的数组,只需使用相同的方法将用户传来的数据转换为病历类型的结构体指针并将其添加到用户病历类型的数组中即可。又由于区块链在写入时需调用内置的PutState方法,该方法的参数为比特数组类型,故需要将得到的新用户病历信息通过marshal方法转换为比特数组类型,最终将才能将添加的新病历数据写入区块链中去。被正确写入到区块链中的比特数组类型数据随后就可以通过GetState方法通过其键值被链代码取出,并进行相关操作。创建患者病历和查询患者病历的前端页面分别如图4-16和图4-17所示:-39- 哈尔滨工业大学工程硕士学位论文图4-16创建患者病历前端页面图4-17查询患者病历前端页面病历管理模块中图片上传、图片信息查询相关基类如图4-18所示:-40- 哈尔滨工业大学工程硕士学位论文图4-18图片管理相关基类类图UserImageInfoDAO和UserImageUrlsDAO来自区块链网络中图片管理相关结构体是一一对应的。在进行图片上传时,从前端传递来的数据由两部分,第一部分是以springboot提供的MultipartFile类对象进行存储图片数据信息,即图片本身。第二部分是用户自行输入的文本形式的描述信息。后端获取到这些两部分信息后,首先将图片数据存储到服务器外部地址,随后将图片描述信息、图片名称等信息封装成UserImageInfoDAO对象。该对象在后端客户端被逐层传递后,被封装成与区块链链代码中图片上传函数相对应的交易请求,由后端客户端发送给区块链网络。区块链网络中的链代码在接收到该交易请求后,会生成对应的如表3-5所示的UserImageInfo结构体对象,存储到区块链中去。该结构体中包含一个map结构,map结构中键对应的值则是一个数组结构,该数组结构中存储着某个图片的详细信息。这些详细信息包含用户对图片添加的描述信息、用户上传图片时的时间戳以及该图片存储位置的URL地址。图片上传流程示意图如图4-19所示:图4-19图片上传流程示意图-41- 哈尔滨工业大学工程硕士学位论文在进行图片查询操作时,从区块链网络中传递过来的JSON字符串会被映射成UserImageUrlsDAO对象,其中的图片url暂时只是图片存储时的文件名,需要添加对应的前缀,该前缀的配置是在自定义的继承了springboot中WebMvcConfigurerAdapter的类中进行的,重写了addResourceHandlers方法使得前端在访问图片资源时,可以通过将真实图片存储资源地址映射为服务器中文件夹地址的方式进行。图片查询流程图如图4-20所示:图4-20图片查询流程图-42- 哈尔滨工业大学工程硕士学位论文图片上传和查询前端界面分别如图4-21和图4-22所示:图4-21图片上传前端页面图4-22图片查询前端页面4.4电子病历系统权限管理模块的详细设计及实现病历权限管理模块所使用的模型与病历管理模块是相同的,从前端至区块链网络的程序流程与图4-14中的流程类似。区别在于在患者挂号即患者病历权限设置为可被查询、可被添加以及患者出院即将患者病历权限设置为不可被添加、不可被修改等权限时不需要进行患者病历权限查询这一判定。首先是链代码调用内部的invoke方法,invoke方法根据参数调用链代码中的patientRegistration方法。在该方法内部,其会根据用户id找该用户的病历数据。通过内置的函数将这些数据变为程序可以直接操作的结构体指针后对其标识位的数值进行变更并返回Success结果。如果根据用户id未找到其病历数据,-43- 哈尔滨工业大学工程硕士学位论文说明该用户还没有创建电子病历,此时直接返回Success即可。若在函数执行过程中出错,则直接向客户端返回Error。患者挂号的链代码流程如图4-23所示。图4-23链代码患者挂号流程-44- 哈尔滨工业大学工程硕士学位论文患者出院过程是患者挂号的逆过程,在链代码中除了将AllowAppend这个标识位从1变为0之外。还应将该用户的所有病历的AllowModify从1变为0。链代码中查询患者病历权限的流程也是类似的,区别在于最后要为客户端返回查询出的标识位结果,以便于客户端进行权限判断。权限标识位、用户私钥以及客户端提供的动态密码共同构成了本系统的权限管理体系。4.5电子病历系统登录模块的详细设计及实现登录管理模块所用的DAO和DTO如图4-24所示:图4-24登录模块相关DAO和DTO用户登录流程基于传统的token模式,其具体流程如图4-25所示:图4-25用户登录具体流程图-45- 哈尔滨工业大学工程硕士学位论文用户登录时显示的前端页面如图4-26所示:图4-26用户登录前端页面4.6电子病历系统隐私保护模块的详细设计及实现由于区块链具有信息公开透明的特点,所以如果一位患者的信息不经过加密直接存储进区块链中,对于区块链网络管理员来说,这些信息就都是可见的。又由于医疗电子病历信息属于患者隐私信息,无论是在客户端还是在区块链网络端,这些信息在患者未授权的条件下都应是不可对外界公开的。针对客户端,上文中已详细叙述了相关权限管理机制。而针对区块链端,则需要使患者信息加密存储。在区块链网络中需要进行加密存储的数据由患者病历的文本信息以及患者所上传的图片的相关信息。以病历修改为例,后端客户端首先对用户的AES密钥K1使用用户RSA公钥进行加密得到K2。随后,将K2使用Base64进行编码得到K3,这是由于经过RSA加密的字符串信息会出现乱码导致数据传输过程失败,所以需要预先进行Base64编码。最后,将K3、用户RSA私钥以及需要修改的用户信息数据传输到区块链网络中。区块链网络在接收到数据后,会根据用户调用的链代码对这些数据进行处理。首先,链代码会将K3使用Base64解码得到K2。随后,链代码使用客户端传输来的用户RSA私钥对K2进行解密得到K1。链代码此时会使用用户id得到用户存储在区块链中的数据并对这些数据使用K1进行AES解密得到-46- 哈尔滨工业大学工程硕士学位论文D1。在D1的基础上,链代码就可以对这些数据进行正常的修改并得到修改后的数据D2。随后,链代码使用K1将D2进行AES加密得到D3。最后,链代码会将加密后的数据D3存储到区块链中去。嵌入加密、解密后其流程如图4-27所示:图4-27病历修改嵌入加密、解密后其流程通过这种AES与RSA加密相结合的方式,用户的病历信息就不会在用户无察觉的情形下被蓄意篡改。同时,用户的隐私数据安全性也得到了保障。-47- 哈尔滨工业大学工程硕士学位论文4.7电子病历系统私钥交易管理模块的详细设计及实现私钥交易管理模块所使用的DAO类图如图4-28所示:图4-28私钥交易管理其中,KeyTransactionDAO和KeyTransactionRequestedDAO分别为表3-11和表3-13在后端客户端中的映射实体。KeyTransactionDAO是后端客户端使用的代表私钥交易状态的实体类,KeyTransactionRequestedDAO实体类则代表私钥交易中的被请求方需要显示的所有和其有关交易的交易列表。设用户A和用户B分别为一次交易的请求方和被请求方。用户A首先创建请求用户B私钥的交易T。若已存在还在进行中的用户A发起的针对用户B的私钥交易,则该交易T会创建失败。若不存在相同的交易,则用户B需要设定交易T的交易金额M。随后,用户A须对用户B设定的交易金额M进行支付,在支付后交易金额M会从用户A的钱包余额中扣除。在支付完成后,用户A的界面会出现退款的选项,只要用户A没有对交易T进行确认或者交易T没有被成功确认,用户A都可以进行退款操作,交易金额M会被返回至用户A的钱包余额中。进行退款操作后,此次交易会被终止,无法进行后续的操作,但是用户A可以重新创建一个对B的私钥交易。用户A支付完成后,用户B须发送其私钥至系统中,由系统暂存。在用户B发送完私钥后,用户A就可以对此次交易进行确认并进行私钥有效性验证操作。如果验证成功,则用户B可以对此次交易进行结账,交易金额M会增加到用户B的账户中去。如果验证失败,用户A可以继续等待用户B重新发送新私钥,重新进行确认。如果用户A不想继续等待,则可以直接进行退款操作。整个私钥交易的流程图如图4-29所示:-48- 哈尔滨工业大学工程硕士学位论文图4-29私钥交易总流程图-49- 哈尔滨工业大学工程硕士学位论文在区块链网络中,私钥交易一旦被创建,就会以交易发起方id为键,KeyTransaction结构体为值存储到区块链网络中。KeyTransaction结构体中有五个和交易状态相关的标志位属性。Price代表此次交易设定的交易金额,交易刚刚被创建时,该值为-1,代表还没有被设定交易金额;IsPaied代表交易请求方是否已正确支付了此次交易的金额,0代表还没有支付,1代表已正确支付;PrivateKeySend代表私钥交易被请求方是否已发送密钥至系统中,若未发送则为0,若已发送则为1;CanBeGet代表交易被请求方是否可以正常结账,若能正常结账则为1,若不能正常结账则为0;IsFinished代表此次交易的完成状态,若交易正在进行中其值为0,若交易已正常结束其值为1,若交易被退款则其值为-1。用户A在创建与用户B的私钥交易后,KeyTransaction结构体对象中的Price值为-1,其余标志为的值为0。在用户B设定交易金额M后,Price的值变为M,其余标志位不变。用户A进行支付后,IsPaied的值变为1,其钱包余额减少M。在用户B发送其私钥后,PrivateKeySend的值变为1,其余标志位不变。在用户A正确确认完此次交易后,CanBeGet标志位变为1,其余标志位不变。在用户B对此次交易结账后,IsFinished标志位变为1,用户B的钱包余额增加M,该过程的示意图如图4-30所示:图4-30区块链网络私钥交易结构体对象标志位变化示意图用户A在整个私钥交易过程中,在支付该交易的交易金额后或是在确认交易之前可以进行退款操作,此时区块链网络中KeyTransaction结构体对象的IsFinished标志位的值变为-1,此过程的示意图如图4-31所示:-50- 哈尔滨工业大学工程硕士学位论文图4-31退款操作私钥交易结构体对象标志位变化示意图在进行创建私钥交易后,区块链网络中会生成关于用户A的id的KeyTransaction结构体对象。除此之外,创建私钥交易的链代码还会记录下用户A此次交易的目标对象用户B的id。对于用户B来说,其在区块链网络中也存在一个数组结构来存储所有请求其私钥的用户的id,也就是请求其私钥的用户id列表。在查询一个交易时,首先会查询某用户所请求的所有私钥的用户id列表,或是查询所有请求该用户私钥的用户id列表。随后就可以根据请求方id加被请求方id的组合来对某个特定的密钥交易进行查询。私钥创建交易的流程示意图如图4-32所示:图4-32私钥创建交易流程示意图-51- 哈尔滨工业大学工程硕士学位论文私钥交易确认的流程图如图4-33所示:图4-33私钥交易确认流程图-52- 哈尔滨工业大学工程硕士学位论文用户A在对私钥交易进行确认时,首先会对私钥交易有效性进行验证。将用户B发送至系统中的私钥信息以及用户B的id构建成验证私钥请求发送给区块链网络。对应链代码在得到该请求后,会发起对用户B基础病历信息的查询操作,并使用用户B上传的私钥开始解密。若解密过程中抛出异常或返回了错误信息,则说明用户B发送的私钥存在问题,私钥验证失败,将退出私钥确认流程,并将确认失败的结果返回给客户端。如果解密成功,即解密后得到的数据对象中的用户B的id与传递到区块链网络中的数据包中的用户B的id一致。此时负责确认交易的链代码会将KeyTransaction结构体中的CanBeGet标志位的值变为1,这表明私钥交易验证成功。设置交易金额、进行支付、发送私钥、结账和退款的本质都是修改在区块链网络中维护的KeyTransaction的标志位,流程与私钥交易确认的修改标志位流程相似,不同之处在于进行支付、结账和退款操作时还需对用户A或用户B的账户余额进行加减,发送私钥时则需将私钥暂存至系统中,等待验证完毕后再将其删除。另外,在进行交易流程的每一步骤时,都需要对前一步骤是否完成进行验证,如果前一步骤没有完成或是私钥交易发起方已成功进行退款,当前交易步骤是不能被执行的。需要注意的是,用户A在创建和用户B的私钥交易请求以及用户A在确认用户B发送来的私钥时,系统会使用用户A的私钥对A的身份进行验证。如果验证通过,则可以创建私钥交易以及确认私钥。如果失败,说明用户A无法提供其持有的正确私钥,其登录账号密码可能被泄漏,此时创建交易和确认交易这两个会影响用户账户余额的操作会被终止进行,以免对用户的利益造成损害。私钥交易成功结束后前端页面如图4-34所示:图4-34私钥交易成功结束后前端页面私钥交易请求方退款完成前端页面如图4-35所示:图4-35私钥交易请求方退款完成前端页面-53- 哈尔滨工业大学工程硕士学位论文私钥交易被请求方发送私钥页面如图4-36所示:图4-36私钥交易被请求方发送私钥页面查询请求被请求方的私钥的用户id列表的页面如图4-37所示:图4-37查询请求被请求方的私钥的用户id列表页面4.8电子病历系统钱包管理模块的详细设计及实现电子病历系统钱包管理模块涉及的DAO类图如图4-38所示:图4-38钱包管理模块涉及的DAO类图其中,WalletDAO、TransactionRecordBillDAO以及TransactionRecordBillsDAO分别来自表3-14、表3-15以及表3-16的实体映射,分别代表用户钱包实体、用户单个账单实体以及用户账单集合实体。-54- 哈尔滨工业大学工程硕士学位论文用户钱包充值的流程图如图4-39所示:图4-39用户钱包充值流程图-55- 哈尔滨工业大学工程硕士学位论文用户钱包是用户完成私钥交易支付的基础,用户可以自行创建钱包并为已创建的钱包进行充值。充值后的钱包中的余额可以对其他用户设置的私钥交易金额进行支付。在钱包充值过程中,用户首先需要输入充值金额V,前端会将用户id、充值金额V组成的数据包发送到后端客户端。后端客户端在接收到前端发送来的数据包后,对该数据包中的相关信息进行提取。同时,后端客户端需要利用这些相关信息对要发送到区块链网络中的充值交易请求进行构建。最后,后端客户端会将该请求发送至区块链网络。区块链网络中的invoke()方法会对该请求进行接收,并调用相应的链代码执行增加金额V到钱包余额中的操作。同时,链代码会生成一个TransactionRecordBill的结构体对象,设置其anotherSide属性为自身id,billType属性为2即充值,billAmount属性为增加的金额V,happenTime的属性为当前时间的时间戳。生成该对象后,将其置入和用户id相关联的TransactionRecordBills结构体对象中recordBills属性的数组中去。在区块链网络中的链代码正确完成上述操作后,会将充值成功的消息返回至后端客户端,后端客户端会将这些消息封装为数据包返回至前端页面并展示给用户。在查询用户账单时,前端会根据用户id对该用户的交易记录总数进行查询,并根据事先设定好的每页可显示的账单条目总数计算前端需要分的总页数。随后,前端会根据用户id、查询起始位置startIndex以及每页需要显示账单数量count查询该用户的count份交易账单。由于在添加一个交易账单时新的交易账单记录是被直接插入到TransactionRecordBills中RecordBills这个属性的数组的起始位置,所以查询到的交易账单顺序也是从新到旧的。前端第一次查询时startIndex为0,前端页码每次增加一个,startIndex增加count个。需要注意的是,如果startIndex小于账单条目总数,但startIndex+count数大于账单条目总数,最后查询的结果会包含从startIndex开始的剩余账单条目数。另外,在链代码查询的过程中,如果出现结构体对象反序列化失败或者查询用户id时得到结果为空的情况,链代码会立即停止后续的操作,并返回给后端客户端相应的错误输出日志信息,后端会根据这些信息来控制前面页面应该向用户显示提示有关输入错误或服务器内部错误的信息。查询用户账单的流程图如图4-40所示:-56- 哈尔滨工业大学工程硕士学位论文图4-40查询用户账单流程图钱包创建、充值页面如图4-41所示:-57- 哈尔滨工业大学工程硕士学位论文图4-41钱包创建、充值页面用户私钥交易账单查询页面如图4-42所示:图4-42用户私钥交易账单查询页面4.9本章小节本章结合前两章的内容,详细设计并实现了病历管理模块、私钥交易管理、加密解密管理、电子钱包管理等功能模块中涉及到的区块链链代码和后端客户端中的业务逻辑。根据这些具体的业务逻辑,设计了前端页面以及用户与这些页面的交互过程,并实现了包含全部业务页面的独立前端。区块链网络与后端客户端以及独立前端共同构成了一个完整的基于区块链技术的电子病历信息系统。-58- 哈尔滨工业大学工程硕士学位论文第5章基于区块链的电子病历系统测试本章主要介绍了基于区块链的电子病历系统的测试环境、链代码的单元测试、系统功能测试以及Web接口测试。进行这些测试的目的是为了确保该系统在使用过程中的可靠性以及稳定性。5.1测试环境本系统的主要开发环境如下:操作系统:macOSHighSierra数据库:MySQL区块链网络:HyperLedger开发语言:链代码部分为Go语言,后端客户端部分为Java,独立前端部分为Html和Javascript开发环境:Docker,IDEA,WebStorm5.2单元测试在区块链链代码的开发过程中,为了测试链代码是否能完成预期的功能,需要使用Go语言提供的testing包进行自动化单元测试。由于涉及到的链代码函数较多,本文仅选取一些核心函数的测试进行展示,这些函数中包含了其他函数测试时所用到的大部分用例,创建用户病历链代码函数create的测试用例如表5-1所示:表5-1创建用户病历链代码函数create测试用例用例编号:用例名称:链代码创建用户病历函数createCHAIN-01在输入参数为用户id、电子病历文本内容、RSA私钥以及被RSA用例描述公钥加密的AES密钥时,可以将用户相关病历信息进行加密并存储到区块链中用例入口使用Go语言提供的testing包编写的测试代码测试用例编号测试内容及条件测试流程目标结果输入:用例描述中声C-1所有输入参数均正常病历创建成功明的各参数-59- 哈尔滨工业大学工程硕士学位论文表5-1(续表)输入:输入的参数中的AES密钥被RSA公AES密钥解RSA私钥和RSAC-2钥K1加密,解密时使用密失败导致病历公钥不配对RSA私钥K2解密,其中创建失败K1和K2不配对输入参数中的电输入:参数中电子反序列化失子病历文本内容与链病历文本内容对应的C-3败导致病历创建代码中定义病历结构JSON字符串包含错误的失败体形式不一致属性输入:输入的参数输入参数数量与数量增加若干个、减少参数错误导C-4要求参数数量不一致若干个、参数类型变为致病历创建失败或参数类型不同与要求的类型不同按index对用户病历进行查询的函数queryMedicalContentsByIndex的测试用例如表5-2所示:表5-2链代码函数queryMedicalContentsByIndex测试用例用例编号:用例名称:链代码按index查询用户病历函数CHAIN-02queryMedicalContentsByIndex在输入参数为用户id、需要查询的index值、RSA私钥以及使用用例描述RSA公钥加密的AES密钥时,可以查询出患者某个index处即患者某次的病历内容用例入口使用Go语言提供的testing包编写的测试代码测试用例编号测试内容及条件测试流程目标结果所有输入参数均正常且所查询的用户输入:用例描述中声病历查询成C-1id开发了病历查询权明的各参数功限输入:输入的参数中的AES密钥被RSA公AES密钥解RSA私钥和RSAC-2钥K1加密,解密时使用密失败导致病历公钥不配对RSA私钥K2解密,其中查询失败K1和K2不配对输入:参数中的病历查询失index为负数或者index值为一个负数或一C-3败,返回一个空超出患者最大病历数个超出患者最大病历数值的值-60- 哈尔滨工业大学工程硕士学位论文表5-2(续表)输入:输入的参数输入参数数量与数量增加若干个、减少参数错误导C-4要求参数数量不一致若干个、参数类型变为致病历查询失败或参数类型不同与要求的类型不同输入的用户id在输入:参数中包含查询病历失C-5区块链中其病历还没一个没有被创建过的用败,返回一个空被创建户id值关闭用户id对应的所查询的用户id病历的查询权限,并输查询病历失C-6所对应的病历的查询败入用例描述中声明的各权限没有被开放参数创建私钥交易的链代码函数addNewKeyTransactionRecord的测试用例如表5-3所示:表5-3创建私钥交易的链代码函数addNewKeyTransactionRecord测试用例用例编号:用例名称:链代码创建私钥交易函数CHAIN-03addNewKeyTransactionRecord在输入参数为私钥请求方用户id即id1以及私钥被请求方的用户用例描述id即id2时,可以正确创建一个id1与id2之间的交易用例入口使用Go语言提供的testing包编写的测试代码测试用例编号测试内容及条件测试流程目标结果所有输入参数均正常且之前从未创建输入:用例描述中声创建私钥交C-1过id1对id2请求私钥明的各参数易成功的交易首先,创建一次id1所有输入参数均创建私钥交正常且之前创建过id1对id2请求私钥的交易易失败,相同的C-2对id2请求私钥的交T1,使T1正常结束。然交易已正常完易,且上次交易正常成,不能重复创后使用相同的参数创建结束建另一个交易T2-61- 哈尔滨工业大学工程硕士学位论文表5-3(续表)首先,创建一次id1所有输入参数均创建私钥交正常且之前创建过id1对id2请求私钥的交易易失败,相同的C-3对id2请求私钥的交T1,使T1处于进行之交易正在进行,易,且上次交易正在中。然后使用相同的参不能重复创建进行数创建另一个交易T2所有输入参数均首先,创建一次id1创建私钥交正常且之前创建过id1对id2请求私钥的交易易成功,已退款C-4对id2请求私钥的交T1,并进行退款操作。的交易视为被异易,且上次交易已被然后使用相同的参数创常终止,可以被退款建另一个交易T2重新创建输入参数数量与输入:用例描述中声创建私钥交C-5要求参数数量不一致明的各参数易失败或参数类型不同输入的两个用户输入:参数中包含创建私钥交C-6id对应的用户病历信一个或两个没有被创建易失败息没有被创建过的用户id对私钥交易进行支付的链代码goingToPay的测试用例如表5-4所示:表5-4创建私钥交易的链代码函数goingToPay测试用例用例编号:用例名称:链代码私钥交易支付函数goingToPayCHAIN-04在输入参数为私钥请求方用户id即id1以及私钥被请求方的用户用例描述id即id2,可以对id1针对id2的私钥请求交易进行支付用例入口使用Go语言提供的testing包编写的测试代码测试用例编号测试内容及条件测试流程目标结果首先,创建一次id1对所有输入参数均正常且之前存在创建id2请求私钥的交易T1,私钥交易支C-1过id1对id2请求私钥并对T1的交易金额进行付成功的交易,且交易状态设置。然后对此次交易为“已设置交易金额”进行支付-62- 哈尔滨工业大学工程硕士学位论文表5-4(续表)首先,创建一次id1所有输入参数均正常且之前存在已创对id2请求私钥的交易私钥交易支C-2建的id1对id2请求私T1,不对T1的交易金额付失败,没有设钥的交易,且交易没置交易金额进行设置。然后对此次有被设置交易金额交易进行支付首先,创建一次id1所有输入参数均对id2请求私钥的交易私钥交易支正常且之前存在已创T1,进行正常交易的流付失败,该交易C-3建的id1对id2请求私的状态变为已退程并在过程中进行退款钥的交易,且交易状款,交易被终止态为“已退款”操作。然后对此次交易进行支付所有输入参数均首先,创建一次id1正常且之前存在已创对id2请求私钥的交易私钥交易支建的id1对id2请求私T1,并分别完成发送密付失败,此次交C-4钥的交易,且交易状钥、确认交易、结束交易已被支付,不态为“已正常结束”、易的操作。然后每进行能被重复支付“已发送密钥”、“已确完上述一次操作就对此认交易”次交易进行支付输入参数数量与输入:用例描述中声私钥交易支C-5要求参数数量不一致明的各参数付失败或参数类型不同输入的两个用户输入:参数中包含私钥交易支C-6id对应的用户病历信一个或两个没有被创建付失败息没有被创建过的用户id首先,创建用户钱包;不对钱包进行充私钥交易支用户钱包余额不值;创建一次id1对id2付失败,用户钱C-7足包没有足够的余请求私钥交易T1,并对额其交易金额进行设置。然后对此交易进行支付-63- 哈尔滨工业大学工程硕士学位论文表5-4(续表)首先,用户不创建钱包。然后,创建一次私钥交易支用户没有创建钱id1对id2请求私钥交易C-8付失败,用户钱包T2,并对其交易金额进包不存在行设置。最后,对此交易进行支付查询用户钱包交易账单记录的链代码queryTransactionBillRecordByRange的测试用例如表5-5所示:表5-5queryTransactionBillRecordByRange函数测试用例用例编号:用例名称:链代码查询用户钱包交易账单记录函数CHAIN-05queryTransactionBillRecordByRange在输入参数待查询钱包记录的用户id、交易记录起始位置用例描述indexStart以及所查询的交易记录数量count时可以查询出用户从起始位置indexStart的count条账单用例入口使用Go语言提供的testing包编写的测试代码测试用例编号测试内容及条件测试流程目标结果所有输入参数均输入:用例描述中声钱包交易记C-1正常且存在一些已发明的各参数录查询成功生的交易记录查询用户账单的输入:indexStart值钱包交易记C-2起始位置超过账单最超出用户含有的最大账录查询失败大数目单数量输入参数数量与输入:用例描述中声钱包交易记C-3要求参数数量不一致明的各参数录查询失败或参数类型不同输入:indexStart在钱包交易记用户最大账单数目以查询的账单数超录查询成功,只C-4内,但是indexStart加过可查询的账单数目显示可查询的相count的值超过了最大数关账单目-64- 哈尔滨工业大学工程硕士学位论文5.3功能测试在整个电子病历系统开发完毕后,需要对系统的各个功能进行验证,根据功能测试用例,逐项测试以检测产品是否达到标准。在这个过程中,无需考虑系统内部的具体实现,功能测试也叫黑盒测试。本文将给出电子病历系统主要功能模块的功能测试用例。用户登录模块测试用例如表5-6所示:表5-6用户登录模块测试用例用例编号:用例名称:用户登录模块测试用例FUNC-01在用户id即用户名、密码都存在的情况下进入系统;用例描述页面显示是否正确启动区块链网络、后端客户端以及数据库。在浏览器如Chrome用例入口中输入相应登录页面的URL地址并进入系统登录页面测试用例编号测试内容及条件测试流程目标结果页面显示的页面显示是否正根据该用例的入口F-1内容与设计中的确信息查询相关界面效果图相同输入:用户id、密用户已存在的账用户登录进码与数据库中账户信息F-2户的用户id、密码以系统,跳转到主一致,验证码输入也正及验证码菜单页确,点击登录输入:正确的用户用户登录失用户id、密码正F-3id及密码,错误的验证败,验证码自动确但验证码错误码,点击登录更新用户id、密码、验登录失败,用户id、密码、F-4证码其中之一没有填写提示相关信息未验证码校验并点击登录填写病历创建功能测试用例如表5-7所示:-65- 哈尔滨工业大学工程硕士学位论文表5-7病历创建功能测试用例用例编号:用例名称:病历创建功能测试用例FUNC-02在已上传用户公钥和相关私钥后对用户病历进行创建用例描述相关页面显示启动区块链网络、后端客户端以及数据库。打开浏览器输入登用例入口录系统相应的地址,进入系统登录页面并正确登录后选择病历管理菜单下的创建病历标签页测试用例编号测试内容及条件测试流程目标结果页面显示的页面显示是否正根据该用例的入口F-1内容与设计中的确信息查询相关界面效果图相同1.用户的公钥已上传用户id的公钥已2.用户的相关私钥已上传,操作者上传用用户病历创户id对应的相关私上传F-2建成功,显示创钥,在创建病历标签3.输入用户id相关的建成功消息页中输入相关病历信病历信息息对病历进行创建4.点击确定进行创建输入患者用户相1.输入用户id相关的用户病历创F-3关信息之前没有上传病历信息建失败,显示创患者公钥或相关私钥建失败消息2.点击确定进行创建1.输入用户id相关的用户病历创用户信息中存在病历信息,缺少用户建失败,提示用F-4未填写的必填项户有缺少必填信id这个必填项息2.点击确定进行创建病历查询功能、快速添加测试用例如图5-8所示:-66- 哈尔滨工业大学工程硕士学位论文表5-8病历查询功能测试用例用例编号:用例名称:病历信息查询、快速添加功能测试用例FUNC-03查询已存在的患者病历信息用例描述快速添加患者病历信息相关页面显示启动区块链网络、后端客户端以及数据库。打开浏览器输入登用例入口录系统相应的地址,进入系统登录页面并正确登录后选择病历管理菜单下的病历查询标签页测试用例编号测试内容及条件测试流程目标结果页面显示的页面显示是否正根据该用例的入口F-1内容与设计中的确信息查询相关界面效果图相同1.输入患者id查询已存在的患2.保证相关公私钥已上显示患者相F-2者病历信息关病历信息传3.点击查询页面显示患查询患者某次病点击非当前页面页F-3者第index次病历历码index的信息显示含有患快速添加页面显点击查询病历信息F-4者全部待填写信示页面的“快速添加”按钮息的对话框1.点击查询病历信息页面的“快速添加”按钮快速添加患快速添加患者病2.在弹出的对话框中填者病历成功,弹F-5历出添加成功的消写患者相关信息息3.在弹出的对话框最下面点击“确定”按钮在弹出的快速添加快速添加患取消添加患者病F-6患者病历信息的对话框者病历的对话框历最下面点击“取消”按钮消失图片管理功能测试用例如表5-9所示:-67- 哈尔滨工业大学工程硕士学位论文表5-9图片管理功能测试用例用例编号:用例名称:图片管理功能测试用例FUNC-04上传用户图片信息用例描述查询用户某次上传的全部图片信息相关页面显示启动区块链网络、后端客户端以及数据库。打开浏览器输入登用例入口录系统相应的地址,进入系统登录页面并正确登录后选择病历管理菜单下的病历查询标签页测试用例编号测试内容及条件测试流程目标结果1.直接通过用例入口进页面正常跳入输入已存在的用户转,跳转后页面上传图片页面显F-1id进行查询,点击显示的内容与设示是否正确计中的效果图相“编辑”按钮同2.点击“上传图片”按钮1.进入在用户图片上传页面;输入图片描述信息后点击“点击输上传进度条入图片描述信息”按从0更新到100%F-2用户图片上传钮并显示所上传图2.点击“点击上传”按钮片的预览图在弹出的文件夹中选择需要上传的图片3.点击“确定”从用例入口进入,页面跳转至图片查询页面显输入已存在的用户id进F-3图片查询页面,示行查询点击“编辑”按钮页面显示正常点击“图片”查询按钮-68- 哈尔滨工业大学工程硕士学位论文表5-9(续表)显示患者在改次病历中上传进入到图片查询页的所有图片,包F-4图片信息查询面点击“搜索图片”按含上传时间、图钮片描述和预览图信息进入到图片查询页页面跳转至面,点击“搜索图片”F-5图片详情查询图片详情页面,搜索,点击某一行中的显示图片的原图“查看”按钮私钥交易管理模块功能测试用例如表5-10所示:表5-10私钥交易管理功能测试用例用例编号:用例名称:私钥交易管理模块功能测试用例FUNC-05对刚创建的id1请求id2私钥交易的相关流程进行测试,包括设定用例描述交易金额、交易支付、发送密钥、交易确认、结账以及退款;相关页面显示启动区块链网络、后端客户端以及数据库。打开浏览器输入登用例入口录系统相应的地址,进入系统登录页面并正确登录并对私钥交易进行创建后,进入到交易状态查询页面测试用例编号测试内容及条件测试流程目标结果页面显示的内容与设计中的私钥交易状态页根据该用例的入口效果图相同,页F-1面显示信息查询相关界面面中的全部按钮均为不可点击状态-69- 哈尔滨工业大学工程硕士学位论文表5-10(续表)1.用户id2登录进入系统;点击“交易管理”菜单2.点击“被发起的交易状态”的标签页3.点击“搜索交易”交易状态进度条“设置费用”4.点击出现的表格中与F-2设定交易金额一项变为天蓝色id1相关的一行中的并显示“已设置交“查看”按钮易金额为M元”5.进入到状态查询页面后点击唯一可用“设置费用”按钮6.输入交易金额M点击确定1.使用id1账户登录系弹出支付成功消息,交易状统并进入相关私钥状F-3交易金额支付态进度条“缴纳费态查询页面用”一项变为“已2.点击“支付费用”按钮支付”1.使用id2的账户登录系统并进入到相关私钥状态查询页面显示发送密钥成功的消息,2.点击“发送密钥”按钮F-4发送交易密钥交易状态进度条3.在弹出的对话框中填“发送密钥”一项写正确的私钥变为密钥已发送4.在弹出的对话框中点击确定-70- 哈尔滨工业大学工程硕士学位论文表5-10(续表)页面弹出含有用户id2发送的1.使用id1账户登录系私钥信息的对话统并进入相关私钥状框,点击确定后F-5私钥交易确认交易状态进度条态查询页面费用状态一项变2.点击“密钥获取”按钮为“款项已可被获取”页面弹出交1.使用id2账户登录系易完成提示信统并进入相关私钥状息,交易状态进F-6结账度条“交易完成”态查询页面一项的描述变为2.点击“完成交易”按钮“交易完成”页面弹出交1.使用id1账户登录系易退款完成提示退款,私钥交易信息,交易状态状态需在支付成功之统并进入相关私钥状F-7进度条“交易完后,确认交易成功之态查询页面成”一项变为浅蓝前2.点击“退款”按钮色,且其描述变为“用户已退款”用户钱包管理功能测试用例如表5-11所示:表5-11用户钱包管理功能测试用例用例编号:用例名称:用户钱包管理模块功能测试用例FUNC-06测试用户钱包创建、余额查询、交易记录查询以及钱包充值是用例描述否正常;相关页面的显示启动区块链网络、后端客户端以及数据库。打开浏览器输入登用例入口录系统相应的地址,进入系统登录页面并正确登录点击钱包管理菜单测试用例编号测试内容及条件测试流程目标结果页面显示的页面显示是否正根据该用例的入口F-1内容与设计中的确信息查询相关界面效果图相同-71- 哈尔滨工业大学工程硕士学位论文表5-11(续表)1.从用例入口进入显示钱包创F-2用户创建钱包建成功消息2.点击“创建钱包”按钮从用例入口进入,点击“快速充值”按钮,对话框消钱包已创建的前F-3在弹出的对话框中填写失,显示充值成提下进行钱包充值功的提示信息需要充入的金额数目,点击确定在下方的不对有余额的钱包1.从用例入口进入可编辑的输入框F-4进行查询中显示账户id以2.点击“查询”按钮及钱包余额数目显示用户钱1.从用例入口进入包收入支出信息2.点击“查询收入、支出用户钱包交易账表格,包含交易F-5记录”标签页单查询时间、对方id、3.点击“搜索收入、支出交易金额、交易记录”按钮类型信息5.4Web接口测试在开发后端客户端时,由于该后台既是和区块链网络交互的客户端,同时又要向前端提供相应的Web服务接口。在前端进行的相关功能实际上通过Web接口对后端客户端服务进行调用,所以在开发后端客户端的过程中还需要进行相应的Web接口测试。本系统使用的Web接口测试工具为软件Postman,其测试过程时的页面如图5-1所示:-72- 哈尔滨工业大学工程硕士学位论文图5-1测试软件Postman测试界面在使用Postman的过程中,主要需要关注以下五部分内容:(1)发送请求时的请求类型以及请求的URL地址,此处URL地址应和后端客户端提供的Web接口名称一致,请求类型应和后端接口的要求一致;(2)所发送请求的请求体,在本系统中所有的请求体都应为JSON格式;(3)服务器返回值,此处的返回值由服务器处理后提供,具体的内容与所编写的服务器返回内容应一致;(4)Status代表该请求处理的状态,200表示服务器已正常接收到发送的请求。Time代表后端服务器处理响应并返回响应内容所需的时间,单位为毫秒。Size代表返回数据包的大小;(5)此处可以选择查看服务器响应的内容、使用的Cookie、请求头信息等内容。系统主要Web接口响应时间如表5-12所示:-73- 哈尔滨工业大学工程硕士学位论文表5-12系统主要Web接口响应时间Web接口名称请求类型请求体类型响应时间medicalContent/createNewUserPOSTJSON3664mswallet/createUserWalletPOSTJSON2896mskeyTransaction/POSTJSON2787mscreateNewKeyTransactionwallet/rechargeUserWalletPOSTJSON3126mskeyTransaction/POSTJSON2854mssetKeyTransactionValuekeyTransaction/goingToPayPOSTJSON2783mskeyTransaction/sendPrivateKeyPOSTJSON2785mskeyTransaction/POSTJSON3476mssetWhetherMoneyCanBeGetkeyTransaction/finishTransactionPOSTJSON2866mskeyTransaction/POSTJSON741msquerySingleKeyTransactionRecordwallet/POSTJSON722msqueryTransactionBillRecordByRangewallet/queryWalletPOSTJSON790msmedicalContent/addMedicalContentPOSTJSON3551msmedicalContent/JSON3537msPOSTupdateMedicalContentmedicalContent/patientRegistrationPOSTJSON2828msmedicalContent/lockMedicalContentPOSTJSON2835ms从表5-12可以看出,基于区块链技术的电子病历管理系统Web接口处理请求并进行响应的时间约3000ms左右。造成这种情况的原因是,在处理具体的业务逻辑时,后端客户端在得到前端发送的JSON数据包请求后,还需要将其发送至区块链网络部分由相应的链代码进行处理。在这个过程中,从前端到后端在到区块链,在逐一返回的过程需要经过四个网络请求阶段。而且,在区块链网络中,节点与节点之间也需要发送网络请求,并需要进行如图3-2所示的PBFT算法流程。由于上述这两个原因,导致相比纯Java后端无区块链的程序,响应速度会稍慢一些,但对于基于区块链的应用来说,这是较为正常的耗时。相较于处理交易这种业务逻辑,进行查询操作时处理速度就快得多。这是由于查询请求不需要向区块链网络中写入新的内容,只需读取即可,省略了写IO使得读取的速度变得很快。综上所述,本系统的Web接口响应时间是基本满足要求的。-74- 哈尔滨工业大学工程硕士学位论文5.5本章小节本章主要讨论了基于区块链的电子病历系统的测试环境以及相关测试过程。链代码的单元测试保证了链代码中相关函数处理结果的准确性,系统功能测试则保证了系统中相关功能模块的可靠性和完整性,Web接口测试分析了后端客户端调用接口处理时的性能,保证了前端调用后端Web接口时调用的耗时在一个可以接受的范围内。上文所述的相关测试流程,贯穿整个系统开发过程,这些测试使得系统中的程序质量和效率得到了有效的保证。-75- 哈尔滨工业大学工程硕士学位论文结论区块链是一种分布式、去中心化的数据库,其中存储的是在参与者间共享的交易记录。它基于密码学原理而不是信任,而且由于区块链具有数据公开全网共享的特点,其可以用来解决当前医疗系统数据共享难、隐私保护难的问题。本系统就是区块链技术在医疗电子病历领域的一次尝试。本文所述的主要工作内容包括:(1)基于前人对相关领域的研究成果,将区块链技术应用到电子病历系统中并探索了这种应用的可行性。在传统的电子医疗病历系统中,病人是无法有效地查看、保存自身的所有病历的,这些病历被集中存储在医院的系统中。医院和医院之间的信息又不能共享,如果患者丢失了自己的纸质病历备份,去其他医院就医时由于病历信息的缺失就可能会为患者带来很大的不便。同时,由于病历的集中存储,患者本身又不能对这些病历数据进行加密,如果医院的系统被非法入侵,这些具有患者隐私数据的病历信息就会被泄漏出去,从而为患者带来经济上的损失。而患者本身不能保证自己存储在医院的信息在自己出院后不被修改,如果出现相关的医疗纠纷,这种信息的不对称性就会使患者处于相对劣势的地位,患者的合法权益也不能得到保障。而将区块链技术与电子病历系统相结合恰好解决了这些在传统医疗电子病历系统中存在的问题。(2)对基于区块链技术的电子病历系统的需求进行了详尽的分析,提出了该系统中应具有的病历管理、加密管理、私钥交易管理等功能性需求以及性能、响应时间等非功能需求。而这些需求中诸如加密管理、私钥交易管理等功能就是为了解决传统医疗电子病历系统中存在的问题而被提出的。根据这些需求,本文分别对区块链网络中使用的链代码、可以与区块链网络交互的后端客户端所使用的相关原理进行阐述。并结合业务需求对链代码、后端客户端以及独立前端进行实现并完成了相应的测试。希望以此能解决在传统电子病历系统中隐私性差、安全性差、共享难的问题。本文设计的基于区块链的电子病历系统经过测试已经基本达到设计初衷。其本身具有的数据加解密、私钥交易、用户钱包以及病历管理等功能满足了系统服务用户的基本需求。该系统同时也为解决传统电子病历系统中隐私性差、安全性差、共享难的问题提出了一种新的思路。希望该系统在经过不断的改进和提高之后,其能够向用户提供更好的服务。-76- 哈尔滨工业大学工程硕士学位论文参考文献[1]PatelD,BothraJ,PatelV.Blockchainexhumed[C]//AsiaSecurityandPrivacy.IEEE,2017.[2]NakamotoS.Bitcoin:Apeer-to-peerelectroniccashsystem[J].Consulted,2008.[3]袁勇,王飞跃.区块链技术发展现状与展望[J].自动化学报,2016,42(04):481-494.[4]何蒲,于戈,张岩峰,鲍玉斌.区块链技术与应用前瞻综述[J].计算机科学,2017,44(04):1-7+15.[5]王硕.区块链技术在金融领域的研究现状及创新趋势分析[J].上海金融,2016,(02):26-29.[6]李董,魏进武.区块链技术原理、应用领域及挑战[J].电信科学,2016,32(12):20-25.DOI:10.11959/j.issn.1000-0801.2016309.[7]张宁,王毅,康重庆,程将南,贺大玮.能源互联网中的区块链技术:研究框架与典型应用初探[J].中国电机工程学报,2016,36(15):4011-402[8]杨晓东,张有兵,卢俊杰,赵波,黄飞腾,戚军,潘红武.基于区块链技术的能源局域网储能系统自动需求响应[J].中国电机工程学报,2017,37(13):3703-3716.[9]邰雪,孙宏斌,郭庆来.能源互联网中基于区块链的电力交易和阻塞管理方法[J].电网技术,2016,40(12):3630-3638.[10]张俊,高文忠,张应晨,郑心湖,杨柳青,郝君,戴潇潇.运行于区块链上的智能分布式电力能源系统:需求、概念、方法以及展望[J].自动化学报,2017,43(09):1544-1554.[11]贾大宇,信俊昌,王之琼等.区块链的存储容量可扩展模型*[J].计算机科学与探索,2017,.DOI:10.3778/j.issn.1673-9418.1709032.[12]蔡维德,郁莲,王荣,刘娜,邓恩艳.基于区块链的应用系统开发方法研究[J].软件学报,2017,28(06):1474-1487.[13]邵奇峰,金澈清,张召,钱卫宁,周傲英.区块链技术:架构及进展[J/OL].计算机学报,2017,:1-20(2017-11-15).[14]钱卫宁,邵奇峰,朱燕超,金澈清,周傲英.区块链与可信数据管理:问题与方法[J/OL].软件学报,:1-10(2017-12-04).-77- 哈尔滨工业大学工程硕士学位论文[15]刘敖迪,杜学绘,王娜,李少卓.区块链技术及其在信息安全领域的研究进展[J/OL].软件学报:1-24(2018-05-24)[16]袁勇,王飞跃.平行区块链:概念、方法与内涵解析[J].自动化学报,2017,43(10):1703-1712.[17]ZhengZ,XieS,DaiH,etal.AnOverviewofBlockchainTechnology:Architecture,Consensus,andFutureTrends[C]//IEEEInternationalCongressonBigData.IEEE,2017.s[18]HariA,LakshmanTV.TheInternetBlockchain:ADistributed,Tamper-ResistantTransactionFrameworkfortheInternet[C]//ACMWorkshoponHotTopicsinNetworks.ACM,2016:204-210.[19]HerbautN,NegruN.AModelforCollaborativeBlockchain-BasedVideoDeliveryRelyingonAdvancedNetworkServicesChains[J].IEEECommunicationsMagazine,2017,55(9):70-76.[20]ChakravortyA,RongC.Ushare:usercontrolledsocialmediabasedonblockchain[C]//InternationalConferenceonUbiquitousInformationManagementandCommunication.ACM,2017:99.[21]NelsonBore,SamuelKarumba,JulietMutahi,ShelbySolomonDarnell,CharityWayua,andKomministWeldemariam.TowardsBlockchain-enabledSchoolInformationHub[C].//InProceedingsoftheNinthInternationalConferenceonInformationandCommunicationTechnologiesandDevelopment.ACM,2017:1-4[22]ChansonM,BognerA,WortmannF,etal.Blockchainasaprivacyenabler:anodometerfraudpreventionsystem[C]//ACMInternationalJointConferenceonPervasiveandUbiquitousComputingandthe2017ACMInternationalSymposiumonWearableComputers.ACM,2017:13-16.[23]CachinC,VukolićM.BlockchainConsensusProtocolsintheWild[J].2017.[24]WatanabeH,FujimuraS,NakadairaA,etal.Blockchaincontract:Acompleteconsensususingblockchain[C]//ConsumerElectronics.IEEE,2016:577-578.[25]MaesaDDF,MoriP,RicciL.BlockchainBasedAccessControl[J].2017.[26]XuX,WeberI,StaplesM,etal.ATaxonomyofBlockchain-BasedSystemsforArchitectureDesign[C]//IEEEInternationalConferenceonSoftwareArchitecture.IEEE,2017.[27]GervaisA,KarameGO,GlykantzisV,etal.OntheSecurityandPerformanceofProofofWorkBlockchains[C]//ACMSigsacConferenceonComputerandCommunicationsSecurity.ACM,2016:3-16.[28]CoblenzM.Obsidian:ASaferBlockchainProgrammingLanguage[C]//Ieee/acm,InternationalConferenceonSoftwareEngineeringCompanion.IEEE,-78- 哈尔滨工业大学工程硕士学位论文2017:97-99.[29]O’ConnorR.Simplicity:ANewLanguageforBlockchains[J].arXivpreprintarXiv:1711.03028,2017.[30]XuL,ShahN,ChenL,etal.EnablingtheSharingEconomy:PrivacyRespectingContractbasedonPublicBlockchain[C]//ACMWorkshoponBlockchain,CryptocurrenciesandContracts.ACM,2017:15-21.[31]LiangX,ShettyS,ToshD,etal.ProvChain:ABlockchain-basedDataProvenanceArchitectureinCloudEnvironmentwithEnhancedPrivacyandAvailability[C]//Ieee/acmInternationalSymposiumonCluster,CloudandGridComputing.IEEEPress,2017:468-477.[32]VukolićM.RethinkingPermissionedBlockchains[C]//ACMWorkshoponBlockchain,CryptocurrenciesandContracts.ACM,2017:3-7.[33]LiW,SforzinA,FedorovS,etal.TowardsScalableandPrivateIndustrialBlockchains[C]//ACMWorkshoponBlockchain,CryptocurrenciesandContracts.ACM,2017:9-14.[34]GreenM,MiersI.Bolt:AnonymousPaymentChannelsforDecentralizedCurrencies[C]//ACMSigsacConference.ACM,2017:473-489.[35]PassR,ShiE.Fruitchains:Afairblockchain[C]//ProceedingsoftheACMSymposiumonPrinciplesofDistributedComputing.ACM,2017:315-324.[36]PorruS,PinnaA,MarchesiM,etal.Blockchain-OrientedSoftwareEngineering:ChallengesandNewDirections[C]//Ieee/acm,InternationalConferenceonSoftwareEngineeringCompanion.IEEE,2017:169-171.[37]LuuL,ChuDH,OlickelH,etal.Makingsmartcontractssmarter[C]//Proceedingsofthe2016ACMSIGSACConferenceonComputerandCommunicationsSecurity.ACM,2016:254-269.[38]DickersonT,GazzilloP,HerlihyM,etal.AddingConcurrencytoSmartContracts[C]//ACMSymposiumonPrinciplesofDistributedComputing.ACM,2017:303-312.[39]KshetriN.Blockchain'srolesinstrengtheningcybersecurityandprotectingprivacy[J].TelecommunicationsPolicy,2017.[40]AhmedS,BroekNT.Foodsupply:Blockchaincouldboostfoodsecurity.[J].Nature,2017,550(7674):43.[41]SikorskiJJ,HaughtonJ,KraftM.Blockchaintechnologyinthechemicalindustry:Machine-to-machineelectricitymarket[J].AppliedEnergy,2017,195:234-246.[42]SamaniegoM,DetersR.BlockchainasaServiceforIoT[C]//IEEEInternationalConferenceonInternetofThings.IEEE,2017:433-436.-79- 哈尔滨工业大学工程硕士学位论文[43]SharmaPK,SinghS,JeongYS,etal.DistBlockNet:ADistributedBlockchains-BasedSecureSDNArchitectureforIoTNetworks[J].IEEECommunicationsMagazine,2017,55(9):78-85.[44]ÖzyılmazKR,YurdakulA,ÖzyılmazKR,etal.IntegratingLow-PowerIoTDevicestoaBlockchain-BasedInfrastructure[C]//EMSOFT.2017.[45]AsteT,TascaP,MatteoTD.BlockchainTechnologies:TheForeseeableImpactonSocietyandIndustry[J].Computer,2017,50(9):18-28.[46]FairleyP.Blockchainworld-Feedingtheblockchainbeastifbitcoineverdoesgomainstream,theelectricityneededtosustainitwillbeenormous[J].IEEESpectrum,2017,54(10):36-59.[47]薛腾飞,傅群超,王枞,王新宴.基于区块链的医疗数据共享模型研究[J].自动化学报,2017,43(09):1555-1562.[48]RajuS,RajeshV,DeogunJS.TheCaseforaDataBank:anInstitutiontoGovernHealthcareandEducation[C]//The,InternationalConference.2017:538-539.[49]ShaeZ,TsaiJJP.OntheDesignofaBlockchainPlatformforClinicalTrialandPrecisionMedicine[C]//IEEE,InternationalConferenceonDistributedComputingSystems.IEEE,2017:1972-1980.[50]AzariaA,EkblawA,VieiraT,etal.MedRec:UsingBlockchainforMedicalDataAccessandPermissionManagement[C]//InternationalConferenceonOpenandBigData.IEEE,2016:25-30.[51]XiaQ,SifahEB,AsamoahKO,etal.MeDShare:Trust-lessMedicalDataSharingAmongCloudServiceProvidersViaBlockchain[J].IEEEAccess,2017,PP(99):1-1.[52]DubovitskayaA,XuZ,RyuS,etal.SecureandTrustableElectronicMedicalRecordsSharingusingBlockchain[J].2017.[53]AhramT,SargolzaeiA,SargolzaeiS,etal.Blockchaintechnologyinnovations[C]//Technology&EngineeringManagementConference.IEEE,2017.[54]HoepmanJH.Distributeddoublespendingprevention[C]//InternationalConferenceonSecurityProtocols.Springer-Verlag,2007:166-170.[55]杨保华,陈昌.区块链原理、设计与应用[M].机械工程出版社.2017:143,250,276.[56]CastroM,LiskovB.PracticalByzantinefaulttolerance[C]//OSDI.1999,99:173-186.-80- 哈尔滨工业大学工程硕士学位论文哈尔滨工业大学学位论文原创性声明和使用权限学位论文原创性声明本人郑重声明:此处所提交的学位论文《基于区块链的电子病历系统的设计与实现》,是本人在导师指导下,在哈尔滨工业大学攻读学位期间独立进行研宄工作所取得的成果,且学位论文中除己标注引用文献的部分外不包含他人完成或己发表的研究成果。对本学位论文的研究工作做出重要贡献的个人和集体,均己在文中以明确方式注明。作者签名:H心日期:年6月>日学位论文使用权限■学位论文是研宄生在哈尔滨工业大学攻读学位期间完成的成果,知识产权归属哈尔滨工业大学。学位论文的使用权限如下:,(D学校可以采用影印、缩印或其他复制手段保存研宄生上交的学位论文(2)学并向国家图书馆报送学位论文;校可以将学位论文部分或全部内容编入3有关数据库进行检索和提供相应阅览服务;()研宄生毕业后发表与此学位论一文研宄成果相关的学术论文和其他成果时,应征得导师同意,且第署名单位为哈尔滨工业大学。。保密论文在保密期内遵守有关保密规定,解密后适用于此使用权限规定。本人知悉学位论文的使用权限,并将遵守有关规定:么月P日作者签名:日期年:為导师签名:EJ期上年彡月-81- 哈尔滨工业大学工程硕士学位论文致谢感谢导师徐志明教授两年来的悉心教导,在整个研究生期间在学业和生活中对我多有照顾。老师与我进行的关于前沿技术的领域讨论拓宽了我的视野,老师在我研究中遇到的困难的时候给出了许多建议。这些对我在工程和科研方面的水平有了很大的提升,使我掌握了许多有用的方法论,为我未来的工作和学习打下了坚实的基础。感谢父母对我两年研究生学业的支持。感谢实验室全体同窗的热情帮助和支持。感谢在宜信实习期间项目组所有同事的帮助和支持。-82-

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭