shamil-t/ehr-blockchain

GitHub: shamil-t/ehr-blockchain

一个基于以太坊和 IPFS 的去中心化电子健康记录系统,通过智能合约实现患者主导的医疗数据访问控制与防篡改记录管理。

Stars: 137 | Forks: 55

# 去中心化电子健康记录 (EHR) 系统 ## 概述 本项目是一个使用以下技术构建的去中心化电子健康记录 (EHR) 管理系统: - Solidity Smart Contracts - Ethereum Blockchain - IPFS (InterPlanetary File System) - ethers.js - MetaMask - Angular - 本地 Anvil 节点 该系统实现了以下内容的安全、去中心化管理: - 患者 - 医生 - 预约 - 病历 - 访问权限 该架构遵循 IPFS 优先的设计,敏感医疗数据存储在链下,而链上仅维护必要的引用和权限。 # 目标 本项目的主要目标是: - 消除对中心化健康记录的依赖 - 确保病历的防篡改性 - 实现健康记录的去中心化所有权 - 提供安全的医患访问控制 - 减少数据重复和未经授权的访问 - 学习基于 Web3 的医疗架构 # 技术栈 | 技术 | 用途 | |---|---| | Solidity | Smart Contract 开发 | | Ethereum | 区块链网络 | | Anvil | 本地 Ethereum 开发节点 | | Hardhat | Smart Contract 工具 | | ethers.js | 区块链交互 | | MetaMask | 钱包身份验证 | | IPFS | 去中心化文件存储 | | Angular | 前端应用 | | TypeScript | 前端逻辑 | # 系统架构 ## 区块链存储 区块链存储: - 钱包地址 - 用户角色 - 预约引用 - 病历引用 - 访问权限 - IPFS 内容标识符 (CID) ## IPFS 存储 IPFS 存储: - 患者资料元数据 - 医生资料元数据 - 预约元数据 - 病历元数据 - 上传的医疗文件/文档 # 用户角色 ## 管理员 负责: - 注册医生 - 注册患者 ## 医生 可以: - 查看授权的患者记录 - 添加病历 - 批准/拒绝预约 - 查看预约 ## 患者 可以: - 预约 - 授予/撤销医生访问权限 - 查看自己的病历 - 取消预约 # Smart Contract 模块 ## 1. 用户管理 ### 功能 - 注册医生 - 注册患者 - 验证用户角色 ### 存储的数据 ``` struct User { address id; string profileCID; bool exists; } ``` ## 2. 预约管理 ### 功能 - 预约 - 更新预约状态 - 按用户查看预约 - 管理员可以查看所有预约 ### 预约状态 - PENDING (待处理) - APPROVED (已批准) - REJECTED (已拒绝) - COMPLETED (已完成) - CANCELED (已取消) ### 数据结构 ``` struct Appointment { uint256 id; address patient; address doctor; string metadataCID; uint256 appointmentTime; AppointmentStatus status; uint256 createdAt; } ``` ## 3. 病历管理 ### 功能 - 上传病历 - 获取患者记录 - 访问受控的记录查看 ### 数据结构 ``` struct MedicalRecord { uint256 id; address patient; address doctor; string metadataCID; string filesCID; uint256 createdAt; } ``` ## 4. 访问控制 患者可以: - 授予医生记录访问权限 - 撤销医生访问权限 医生可以: - 仅在获得许可时访问记录 ### 权限映射 ``` mapping(address => mapping(address => bool)) private doctorAccess; ``` # Smart Contract 设计原则 ## 最小化链上存储 敏感数据不直接存储在链上。 只有以下内容存储在区块链上: - 引用 - 权限 - 关系 - 元数据 CID ## 单一事实来源 预约和记录使用以下方式存储: ``` mapping(uint256 => Appointment) mapping(uint256 => MedicalRecord) ``` 并带有用于可扩展性的索引关系。 ## 访问受控的数据检索 只有在以下情况下才能访问病历: - 请求者是患者本人 - 请求者是获得授权的医生 # 工作流程 ## 患者注册 1. 管理员注册患者 2. 患者资料上传至 IPFS 3. CID 存储在区块链上 ## 医生注册 1. 管理员注册医生 2. 医生资料上传至 IPFS 3. CID 存储在区块链上 ## 预约 1. 患者选择医生 2. 预约元数据上传至 IPFS 3. 预约信息存储在区块链上 ## 病历上传 1. 医生获得权限 2. 医疗文件上传至 IPFS 3. CID 引用存储在区块链上 # 安全特性 - 基于角色的访问控制 - 受权限控制的病历 - 不可篡改的区块链记录 - 去中心化存储 - 患者控制的授权 # 优势 - 去中心化架构 - 提高透明度 - 防篡改 - 减少中心化依赖 - 更好的互操作性 - 患者拥有数据所有权 # 局限性 - 区块链交易成本 - 公链元数据可见性 - IPFS 可用性管理 - MVP 中未实现加密 - 没有索引的情况下可扩展性有限 # 未来改进 - 加密的 IPFS payload - 医院管理模块 - 处方管理 - 分页支持 - 事件索引 - 审计日志 - 多管理员支持 - 集成 The Graph - 基于角色的 dashboard - JWT + Web3 混合身份验证 - 文件加密和密钥管理 # 本地开发设置 ## 启动完整的项目环境 运行: ``` ./start-project.sh ``` 这将启动: - 本地 Anvil 区块链 - 本地 IPFS 节点 - 前端应用 - 必需的开发服务 # Smart Contract 部署 ## 选项 1 — 部署脚本 运行: ``` ./deployer.sh ``` ## 选项 2 — Hardhat Ignition 部署 ### 编译合约 ``` npx hardhat compile ``` ### 部署合约 ``` npx hardhat ignition deploy ignition/modules/EHR.ts --network localhost ``` # 前端设置 安装依赖: ``` npm install ``` 运行 Angular 前端: ``` ng serve ``` # 项目结构 ``` contracts/ ├── EHR.sol frontend/ ├── src/ ignition/ ├── modules/ │ └── EHR.ts scripts/ ├── deployer.sh ├── start-project.sh ``` # 结论 本项目展示了一个使用区块链和 IPFS 技术的去中心化医疗记录管理系统。该架构优先考虑: - 去中心化所有权 - 安全的访问控制 - 可扩展的 smart contract 设计 - 最小化的链上存储 该实现为未来企业级的去中心化医疗应用奠定了坚实的 MVP 基础。
标签:IPFS, Web3, 以太坊, 区块链, 医疗健康, 智能合约, 电子健康档案, 自动化攻击