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, 以太坊, 区块链, 医疗健康, 智能合约, 电子健康档案, 自动化攻击