Розробка системи управління згодою пацієнта на блокчейні

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка системи управління згодою пацієнта на блокчейні
Складний
~1-2 тижні
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Розробка системи управління згодою пацієнта на блокчейні

Управління згодою у здравоохороненні — більше ніж юридична формальність. GDPR вимагає explicit, informed, freely given согласия для обробки даних здоров'я. HIPAA вимагає авторизацію для розкриття PHI (Protected Health Information). Паперові форми згоди теряються, змінюються задним числом, і не дають пацієнту реального контролю. Блокчейн перетворює згоду на verifiable, auditable, і revocable on-chain запис.

Модель згоди

Згода — це структурований документ з конкретними параметрами: хто може видати які дані, для яких цілей, на як довго. Це не бінарне "так/ні", а гранульоване дозвіл.

contract ConsentRegistry {
    enum ConsentStatus { ACTIVE, REVOKED, EXPIRED }
    enum DataCategory { 
        DIAGNOSIS, 
        LAB_RESULTS, 
        PRESCRIPTIONS, 
        IMAGING, 
        MENTAL_HEALTH, 
        GENETIC, 
        HIV_STATUS,
        SUBSTANCE_ABUSE 
    }
    enum Purpose { 
        TREATMENT,           // безпосереднє лікування
        PAYMENT,             // страхові та платіжні операції
        HEALTHCARE_OPS,      // операційна діяльність
        RESEARCH,            // медичні дослідження
        QUALITY_IMPROVEMENT, // покращення якості обслуговування
        CARE_COORDINATION    // координація лікування
    }
    
    struct Consent {
        bytes32 patientId;
        address grantee;         // кому видана згода
        DataCategory[] categories; // які категорії даних
        Purpose[] purposes;      // для яких цілей
        uint256 grantedAt;
        uint256 expiresAt;       // 0 = бессрочно (до відкликання)
        ConsentStatus status;
        bytes32 documentHash;    // hash PDF документу згоди
        string version;          // версія privacy policy
    }
    
    // consentId => Consent
    mapping(bytes32 => Consent) public consents;
    
    // patientId => grantee => consentIds
    mapping(bytes32 => mapping(address => bytes32[])) public patientConsents;
    
    event ConsentGranted(
        bytes32 indexed consentId,
        bytes32 indexed patientId,
        address indexed grantee,
        uint256 expiresAt
    );
    event ConsentRevoked(bytes32 indexed consentId, bytes32 indexed patientId);
    
    function grantConsent(
        bytes32 patientId,
        address grantee,
        DataCategory[] calldata categories,
        Purpose[] calldata purposes,
        uint256 duration,
        bytes32 documentHash,
        string calldata version
    ) external onlyPatient(patientId) returns (bytes32 consentId) {
        consentId = keccak256(abi.encodePacked(
            patientId, grantee, block.timestamp, block.number
        ));
        
        consents[consentId] = Consent({
            patientId: patientId,
            grantee: grantee,
            categories: categories,
            purposes: purposes,
            grantedAt: block.timestamp,
            expiresAt: duration == 0 ? 0 : block.timestamp + duration,
            status: ConsentStatus.ACTIVE,
            documentHash: documentHash,
            version: version
        });
        
        patientConsents[patientId][grantee].push(consentId);
        emit ConsentGranted(consentId, patientId, grantee, block.timestamp + duration);
    }
    
    function revokeConsent(bytes32 consentId) external {
        Consent storage consent = consents[consentId];
        require(
            isPatient(consent.patientId, msg.sender),
            "Not patient"
        );
        require(consent.status == ConsentStatus.ACTIVE, "Not active");
        
        consent.status = ConsentStatus.REVOKED;
        emit ConsentRevoked(consentId, consent.patientId);
    }
    
    function isConsentValid(
        bytes32 consentId,
        DataCategory category,
        Purpose purpose
    ) external view returns (bool) {
        Consent storage consent = consents[consentId];
        
        if (consent.status != ConsentStatus.ACTIVE) return false;
        if (consent.expiresAt != 0 && block.timestamp > consent.expiresAt) return false;
        
        bool hasCategory = false;
        for (uint i = 0; i < consent.categories.length; i++) {
            if (consent.categories[i] == category) { hasCategory = true; break; }
        }
        
        bool hasPurpose = false;
        for (uint i = 0; i < consent.purposes.length; i++) {
            if (consent.purposes[i] == purpose) { hasPurpose = true; break; }
        }
        
        return hasCategory && hasPurpose;
    }
}

Електронна підпис документів згоди

Згода має бути юридично значущою. Це вимагає не лише on-chain запису, але й підписаного документу:

// Пацієнт підписує структуровані дані згоди через EIP-712
const consentTypedData = {
  domain: {
    name: "HealthConsent",
    version: "1",
    chainId: 1,
    verifyingContract: CONSENT_REGISTRY_ADDRESS,
  },
  types: {
    Consent: [
      { name: "patientId", type: "bytes32" },
      { name: "grantee", type: "address" },
      { name: "categories", type: "uint8[]" },
      { name: "purposes", type: "uint8[]" },
      { name: "expiresAt", type: "uint256" },
      { name: "documentHash", type: "bytes32" },
      { name: "version", type: "string" },
    ],
  },
  message: consentData,
};

const signature = await walletClient.signTypedData(consentTypedData);

// Підпис зберігається зі згодою і верифікується при необхідності

PDF документ згоди генерується автоматично з структурованих даних, його SHA-256 хеш зберігається on-chain у documentHash. Пацієнт отримує копію PDF, може верифікувати хеш у блокчейні.

Екстрена допомога

Критичний edge case: пацієнт без свідомості, згода не видана, але медична допомога необхідна. Break-glass механізм:

contract EmergencyAccess {
    struct EmergencyAccessEvent {
        bytes32 patientId;
        address requester;
        string justification;  // причина екстреного доступу
        uint256 timestamp;
        bool approved;         // одобрен ли постфактум
    }
    
    // Час на оспорювання екстреного доступу: 72 години
    uint256 constant CHALLENGE_PERIOD = 72 hours;
    
    mapping(bytes32 => EmergencyAccessEvent[]) public emergencyLog;
    
    // Екстрена допомога доступна авторизованим медичним провайдерам
    // Логується, сповіщення пацієнту після виходу з критичного стану
    function requestEmergencyAccess(
        bytes32 patientId,
        string calldata justification
    ) external onlyEmergencyProvider {
        emergencyLog[patientId].push(EmergencyAccessEvent({
            patientId: patientId,
            requester: msg.sender,
            justification: justification,
            timestamp: block.timestamp,
            approved: false // вимагає постфактум одобрення
        }));
        
        emit EmergencyAccessRequested(patientId, msg.sender, justification);
    }
}

Інтеграція з національними системами

У різних країнах — різні вимоги до управління згодою:

EU (GDPR + eHealth): explicit согласие, право на відкликання, обмеження цілей. Згода має бути гранульованою (не можна вимагати согласие "на все").

US (HIPAA): форма авторизації, принцип мінімальної необхідності, права пацієнта на внесення змін. Згода для research окремо від treatment.

Беларусь / Росія / Україна: національні закони про охорону даних здоров'я, вимоги до локалізації даних.

Для мультинаціональних систем: система шаблонів згоди з jurisdiction-специфічними полями, автоматичне завантаження форми за геолокацією.

Сповіщення та портал пацієнта

Після кожного доступу до даних — сповіщення пацієнту:

// Після кожного доступу до записів
async function notifyPatientOfAccess(event: AccessEvent) {
  const patient = await getPatient(event.patientId);
  
  await sendNotification(patient.email, {
    type: "data_access",
    accessor: await getProviderName(event.accessor),
    dataCategory: event.category,
    purpose: event.purpose,
    timestamp: event.timestamp,
    txHash: event.transactionHash,
  });
}

Портал пацієнта показує: список всіх активних согласий, історію доступів (audit trail), можливість відкликати согласие в один клік.

Технічний стек

Компонент Технологія
Смарт-контракти Solidity + OpenZeppelin
EIP-712 підписи viem / ethers.js
PDF генерація PDFKit / WeasyPrint
Портал пацієнта React + wagmi
Сповіщення Email (SendGrid) + Push (Web Push API)
Індексування The Graph

Розробка системи управління згодою: 2-3 місяці для повної реалізації з портальм пацієнта, PDF генерацією і екстреним доступом.