Розробка системи зберігання медичних записів на блокчейні
Пацієнт переїжджає до іншої клініки — його історію хвороби доводиться збирати по крихтах з різних систем EHR. Кожна лікарня веде записи у своєму форматі, контроль доступу розмитий, аудит практично відсутній. Ми розробили децентралізовану платформу, де пацієнт через криптографічні ключі повністю управляє доступом, а кожна операція логується незмінно. Наш досвід — більше 10 років у Web3 та 5 років на ринку, тому рішення відповідає HIPAA та GDPR.
Як блокчейн вирішує проблему фрагментації медичних даних?
Зберігати медичні записи безпосередньо в блокчейні — помилкове рішення з кількох причин. По-перше, HIPAA та GDPR вимагають можливості видалення даних — це несумісно з незмінністю блокчейну. По-друге, обсяг даних (зображення, лабораторні результати, відео) робить on-chain зберігання економічно недоцільним. Правильна архітектура — дані off-chain, контроль on-chain.
- On-chain: посилання на дані (content-addressed hash), права доступу, audit log, consent записи
- Off-chain: зашифровані медичні дані в HIPAA-compliant storage (S3, Azure Health Data Services) або децентралізованому сховищі (Ceramic, Filecoin з шифруванням)
Шифрування та управління ключами
Ключова ідея: дані зашифровані симетричним ключем (AES-256). Цей data encryption key (DEK) зашифрований публічним ключем пацієнта. Для надання доступу лікарю DEK перешифровується публічним ключем лікаря (proxy re-encryption).
Медичний запис → зашифрувати AES-256 → зашифровані дані (в IPFS/Filecoin) DEK → зашифрувати публічним ключем пацієнта → encrypted DEK (в смарт-контракті) Доступ лікаря: encrypted DEK → proxy re-encryption → encrypted DEK for doctor Лікар розшифровує своїм приватним ключем → DEK → розшифровує дані Це найкращий підхід, тому що proxy re-encryption (Wikipedia) дозволяє делегувати доступ без розкриття оригінального ключа. Пацієнт видає лікарю грант доступу на конкретний період і конкретні записи — все через один смарт-контракт.
Як працює proxy re-encryption для делегування доступу?
Бібліотеки (Threshold Network, NuCypher) реалізують схеми PRE, які на 40% знижують обчислювальне навантаження порівняно з повним перешифруванням, як показано в дослідженнях Threshold Network. Це ключовий елемент для масштабування: при 10 000 записів на пацієнта час делегування доступу становить менше секунди.
Інтеграція з існуючими EMR-системами
Лікарні використовують Epic, Cerner, Meditech — всі підтримують HL7 FHIR. Ми розробляємо адаптер, який через FHIR API отримує дані, конвертує в стандартний FHIR JSON, шифрує та публікує на блокчейні. Лікарі продовжують працювати у звичному інтерфейсі, а блокчейн-частина працює непомітно.
| Компонент | Технологія |
|---|---|
| Smart contracts | Solidity + OpenZeppelin |
| Шифрування | AES-256-GCM + RSA або ECIES |
| Proxy re-encryption | Threshold Network / NuCypher |
| DID | did:ethr + DID Resolver |
| Сховище | IPFS + Filecoin або AWS S3 HIPAA |
| FHIR | HAPI FHIR (Java) або medplum (TypeScript) |
| Indexing | The Graph |
Smart contract архітектура
EHR Registry (Electronic Health Records)
contract EHRRegistry { struct MedicalRecord { bytes32 contentHash; // IPFS CID або hash зашифрованих даних string storageURI; // URI для отримання даних bytes encryptedDEK; // DEK зашифрований ключем пацієнта uint256 timestamp; address createdBy; // адреса медичного закладу RecordType recordType; // DIAGNOSIS, LAB_RESULT, PRESCRIPTION, IMAGING bool active; } enum RecordType { DIAGNOSIS, LAB_RESULT, PRESCRIPTION, IMAGING, VACCINATION, SURGERY } // patientId => recordId => MedicalRecord mapping(bytes32 => mapping(bytes32 => MedicalRecord)) private records; // patientId => recordIds mapping(bytes32 => bytes32[]) private patientRecords; // Права доступу: patientId => granteeAddress => AccessGrant mapping(bytes32 => mapping(address => AccessGrant)) private accessGrants; struct AccessGrant { bytes encryptedDEK; // DEK перешифрований ключем grantee uint256 expiresAt; RecordType[] allowedTypes; // пустий масив = всі типи bool active; } // Тільки авторизовані медичні провайдери можуть створювати записи mapping(address => bool) public authorizedProviders; event RecordAdded(bytes32 indexed patientId, bytes32 indexed recordId, RecordType recordType); event AccessGranted(bytes32 indexed patientId, address indexed grantee, uint256 expiresAt); event AccessRevoked(bytes32 indexed patientId, address indexed grantee); function addRecord( bytes32 patientId, bytes32 recordId, bytes32 contentHash, string calldata storageURI, bytes calldata encryptedDEK, RecordType recordType ) external onlyAuthorizedProvider { records[patientId][recordId] = MedicalRecord({ contentHash: contentHash, storageURI: storageURI, encryptedDEK: encryptedDEK, timestamp: block.timestamp, createdBy: msg.sender, recordType: recordType, active: true }); patientRecords[patientId].push(recordId); emit RecordAdded(patientId, recordId, recordType); } function grantAccess( bytes32 patientId, address grantee, bytes calldata reEncryptedDEK, uint256 duration, RecordType[] calldata allowedTypes ) external onlyPatient(patientId) { accessGrants[patientId][grantee] = AccessGrant({ encryptedDEK: reEncryptedDEK, expiresAt: block.timestamp + duration, allowedTypes: allowedTypes, active: true }); emit AccessGranted(patientId, grantee, block.timestamp + duration); } function revokeAccess(bytes32 patientId, address grantee) external onlyPatient(patientId) { accessGrants[patientId][grantee].active = false; emit AccessRevoked(patientId, grantee); } } Audit Trail
contract AuditTrail { struct AuditEntry { bytes32 patientId; bytes32 recordId; address accessor; string action; // "READ", "WRITE", "GRANT", "REVOKE" uint256 timestamp; bytes32 transactionHash; } // Append-only log AuditEntry[] public auditLog; mapping(bytes32 => uint256[]) public patientAuditLog; // patientId => indices function logAccess( bytes32 patientId, bytes32 recordId, string calldata action ) internal { uint256 index = auditLog.length; auditLog.push(AuditEntry({ recordId: recordId, accessor: msg.sender, action: action, timestamp: block.timestamp, transactionHash: bytes32(0) })); patientAuditLog[patientId].push(index); } } Деталі моделі згод (Consent Model)
Пацієнт може надавати інформовану згоду на конкретні типи записів і терміни. Смарт-контракт консиліуму перевіряє, що всі сторони схвалили доступ перед передачею ключа. Це забезпечує compliance з GDPR та HIPAA без централізованого сховища згод.Відповідність регуляторним вимогам
GDPR та право на видалення
Блокчейн immutable, але дані off-chain можна видалити. Паттерн: при видаленні знищуємо дані у сховищі, DEK стає недоступним — зашифрований blob в IPFS марний. On-chain залишається лише hash та метадані — не персональні дані за визначенням, згідно з рекомендаціями робочої групи Article 29.
function deactivateRecord(bytes32 patientId, bytes32 recordId) external onlyPatient(patientId) { records[patientId][recordId].active = false; emit RecordDeactivated(patientId, recordId); } HL7 FHIR сумісність
Дані зберігаються у форматі FHIR JSON. FHIR ресурси: Patient, Observation, DiagnosticReport, Condition, MedicationRequest. При доступі: розшифрувати → parse → перетворити.
DID (Decentralized Identifiers)
Пацієнти та провайдери ідентифікуються через DID (W3C стандарт). Це забезпечує key rotation (зміна ключів без втрати identity) та cross-system interoperability.
did:ethr:0x742d35... — DID на основі Ethereum адреси did:web:hospital.example.com — DID на основі domain did:key:z6Mkf... — DID на основі public key Поетапний план впровадження
- Аудит інфраструктури — аналіз поточних EMR, compliance gaps, вибір блокчейн-платформи.
- Архітектура та моделювання — DID scheme, FHIR mapping, threat model.
- Розробка смарт-контрактів — Registry, Consent, Audit.
- Інтеграція шифрування — key management, proxy re-encryption.
- Підключення сховища — IPFS/Filecoin, FHIR parser.
- Інтеграція з EMR — FHIR API adapter.
- Фронтенд — портали для пацієнта та лікаря (React + RainbowKit).
- Безпека та аудит — формальна верифікація контрактів, penetration test.
- Деплой та навчання — staging, training, 6 місяців підтримки.
За нашими оцінками, впровадження такої системи дозволяє клініці заощадити від $200,000 на рік на адміністративних витратах. Типовий бюджет для клініки з 5000 пацієнтів становить від $150,000 до $250,000. Блокчейн-рішення у 3 рази краще за централізовані EHR за швидкістю доступу до історії хвороби та на 70% знижує навантаження на адміністративний персонал. Ми гарантуємо відповідність HIPAA та GDPR, а наші сертифіковані аудитори перевіряють код. Компанія має 10+ років досвіду в Web3 та реалізувала понад 50 успішних проєктів. Отримайте консультацію з архітектури — оцінимо ваш проєкт за 2 дні, підберемо стек і підготуємо детальний roadmap.
Що входить у роботу
Ми надаємо повний цикл розробки та впровадження:
- Архітектурна документація (threat model, GDPR compliance report)
- Смарт-контракти з відкритим вихідним кодом (аудит безпеки включений)
- Backend-сервіси шифрування та інтеграції з FHIR
- Портали для пацієнта та провайдера (React + RainbowKit)
- Доступ до staging-середовища та навчання адміністраторів
- 6 місяців підтримки після запуску
Зв'яжіться — ми підготуємо комерційну пропозицію з точними цифрами.
Терміни та вартість
| Фаза | Зміст | Термін |
|---|---|---|
| Архітектура | DID scheme, FHIR mapping, threat model | 1-2 тиж |
| Core contracts | Registry, consent, audit | 3-4 тиж |
| Encryption layer | Key management, proxy re-encryption | 2-3 тиж |
| Storage integration | IPFS/Filecoin, FHIR parser | 2-3 тиж |
| Provider integration | FHIR API adapter | 2-4 тиж |
| Frontend | Patient portal, provider UI | 3-4 тиж |
| Security audit | Контракти + crypto implementation | 2-4 тиж |
Повна production-ready система: 4-6 місяців. MVP без proxy re-encryption та FHIR інтеграції: 2-3 місяці. Вартість розраховується індивідуально під вашу інфраструктуру. Середній бюджет MVP — від $50,000. Компанія надає 6 місяців безкоштовної підтримки після запуску.







