Kısa bir süre önce blockchain tabanlı bir tıbbi onay uygulaması oluşturdum ve birçok kişinin sıfırdan blockchain tabanlı fullstack uygulaması oluşturmayı öğrenmek isteyeceğini hissettim.
İşte bunun için öğretici!
Bilgilendirilmiş onam almak tıpta standart bir uygulamadır.
Bir hastanın, riskler ve faydalar da dahil olmak üzere bir tıbbi tedavi veya prosedür hakkında tam olarak bilgilendirildiği ve tedavi veya prosedüre gönüllü olarak rıza gösterdiği süreçtir.
Resmi yazılı Onay alınması aşağıdakiler için gereklidir:
- tıbbi prosedürler (lomber ponksiyon, endoskopi yapmak vb.)
- büyük ve küçük ameliyatlar
- deneysel tedaviler
- klinik deneylere katılım ve daha fazlası
İşlemlerin gerçekleştirilmesi pahalı olduğu için Ethereum Mainnet’i kullanmadığımı unutmayın. Bu uygulamayı resmi olarak dağıtmayı planlıyorsak, bunu Testnet yerine Mainnet üzerinde yaparız. Alternatif olarak, bir Katman 2 çözümü (Polygon gibi) kullanılabilir.
Bu terimlerde yeni olanlar için Testnet’ler, bir Mainnet blok zincirinin çalışma ortamını taklit etmek için tasarlanmış blok zincirlerdir.
Bu Testnet’ler, geliştiricilerin uygulamalarını ve akıllı sözleşmelerini Ethereum’un Mainnet ortamına dağıtmadan önce risksiz ve pahalı olmayan bir şekilde test etmelerine yardımcı olur.
Bir Blok Zinciri kullanmak, Blok Zincirinde imzalanan her onay şu şekilde olduğundan, Onay sürecine yardımcı olur:
- kalıcı olarak kaydedildi
- kurcalamaya karşı korumalıdır (değiştirilemez)
- yetkili taraflarca herhangi bir zamanda erişilebilir ve doğrulanabilir
Merkezi veritabanları kullanılırken bu mümkün değildir.
Kodu yazmaya başlamadan önce uygulamanın nasıl görünmesi gerektiğini kabaca çizerek başlayalım.
Temel kullanıcı akışı aşağıdaki gibi olacaktır:
- Klinisyen önce hastaya ilgili prosedürü açıklar ve onay metnini yazar.
- Hasta daha sonra cihazlarını bağlar. MetaMask cüzdanı uygulamaya
- Hasta açıklanan onayı kabul eder ve cüzdanını kullanarak imzalar.
- Her iki taraf da blok zincirindeki onayı görüntüleyebilir ve doğrulayabilir
- Hasta MetaMask cüzdanını uygulamaya bağladığında, cüzdanının hesap detayları (önemlisi Hesap Adresi) alınır.
- Klinisyen tarafından yazılan onay metni, SHA256 karma algoritması kullanılarak hastanın hesap adresiyle birlikte karma haline getirilir.
- Bu karma, cüzdanın hesap adresiyle birlikte blok zincirine kaydedilir.
- Rıza metni, hesaplanan hash, işlem hash ve hesap adresi, muvafakat metninin daha sonraki bir tarihte görüntülenmesine izin vermek için blockchain tabanlı olmayan bir veritabanında saklanır.
SHA-256 tek yönlü bir kriptografik işlev olduğundan, onay metni karmadan yeniden türetilemez çünkü bu yapılır.
Blockchain tabanlı olmayan veritabanının değişken olduğunu ve onayın imzalanmasının kanıtı olarak hareket edemeyeceğini unutmayın. Dolayısıyla bu kanıt, blok zincirinde onayın karma değerinin olup olmadığını kontrol ederek elde edilir.
adlı bir akıllı sözleşme yazarak başlayalım. Consent.sol
.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;contract Consent {
mapping(bytes32 => mapping(address => bool)) private consentRecords;
mapping(address => bytes32()) private addressToConsentHashes;
event ConsentAdded(bytes32 indexed consentHash, address indexed signer);
function addConsent(bytes32 consentHash) public {
// Check if the consent has already been given by this signer
require(!consentRecords(consentHash)(msg.sender), "Consent already given");
// Record the consent
consentRecords(consentHash)(msg.sender) = true;
addressToConsentHashes(msg.sender).push(consentHash);
emit ConsentAdded(consentHash, msg.sender);
}
function getConsentHashByAddress(address signer) public view returns (bytes32() memory) {
return addressToConsentHashes(signer);
}
}
eşlemeler
consentRecords
Bu iç içe eşleme, onay kayıtlarını depolamak için kullanılır.
Dış eşleme, bir onay karmasını eşler (tür bytes32
) bir iç eşlemeye, iç eşleme ise bir Ethereum adresini eşler (tür address
) bir boole değerine (tür bool
).
Boole değeri, iznin adres tarafından belirli izin karması için verilip verilmediğini temsil eder.
Bu eşleme ayrıca birden çok kullanıcının aynı onayı imzalamasına olanak tanır.
2. addressToConsentHashes
Bu eşleme, her bir Ethereum adresiyle ilişkili onay karmalarını depolamak için kullanılır.
Eşleme, bir Ethereum adresini eşler (tür address
) bir dizi izin karmasına (tür bytes32()
).
bu consentRecords
haritalama, izin kayıtlarının etkin kontrollerine ve güncellemelerine izin verirken, addressToConsentHashes
eşleme, sözleşmenin kolay erişim için her bir adresle ilişkili bir onay karma listesi tutmasını sağlar.
Fonksiyonlar
addConsent
Bu genel işlev, bir kullanıcının Ethereum adresiyle ilişkili bir onay kaydı eklemesine izin verir.
fonksiyon alır consentHash
onay için benzersiz bir tanımlayıcı olan bir bağımsız değişken olarak.
İşlev, önce onayın gönderen tarafından verilip verilmediğini kontrol eder (msg.sender
) kullanmak require
ifade.
Onay zaten verilmişse, işlev mesajla birlikte bir hata verir. "Consent already given"
.
Değilse, işlev ayarlayarak onayı kaydetmeye devam eder. consentRecords(consentHash)(msg.sender)
ile true
ve ekleyerek consentHash
gönderenin adresiyle ilişkili izin karmaları listesine (addressToConsentHashes(msg.sender)
).
Son olarak, işlev yayar ConsentAdded
Blok zincirindeki izin kaydının eklenmesini günlüğe kaydetmek için olay.
2. getConsentHashByAddress
Bu genel görünüm işlevi, belirli bir Ethereum adresiyle ilişkili onay karmalarının listesini alır.
İşlev bir Ethereum adresi alır (signer
) bir bağımsız değişken olarak ve bir dizi izin karma değeri döndürür (bytes32()
) bu adresle ilişkili.
İşlev, şu adrese erişerek doğrudan sağlanan adres için onay karmalarının listesini döndürür: addressToConsentHashes
ile eşleme signer
anahtar: return addressToConsentHashes(signer);
.
Bu bir görüntüleme işlevi olduğu için sözleşmenin durumunu değiştirmez ve herhangi bir gas maliyetine neden olmadan çağrılabilir.
bu addConsent
işlevi, kullanıcıların izin kayıtlarını saklamasına izin verirken, getConsentHashByAddress
işlevi, belirli bir adresle ilişkilendirilmiş izin karmalarının listesini almak için bir yol sağlar.
Ben kullanıyorum remiks sözleşmeyi Sepolia Ethereum Testnet üzerinde derlemek ve dağıtmak için.
Sözleşmeyi dağıtmak için MetaMask cüzdanınızı Remix’e bağlamanız ve ardından Sepolia test ağını seçmeniz gerekecek.
Sepolia Ethereum’u cüzdanınıza almak için aşağıdaki musluğu kullanın:
Ardından, sözleşmeyi test ağında konuşlandırın.
Sözleşme dağıtıldıktan sonra, adresini ve ABI’yi kopyalayın ve adlı bir dosyaya kaydedin. consentAbi.js
proje dizininizde.
- adlı yeni bir React uygulaması oluşturun.
consentchain
.
yarn create react-app consentchaincd consentchain
- kullanarak uygulamayla ilişkili bağımlılıkları kurun.
package.json
kullanarak dosyayarn install
.
- Ardından, adlı bir dosya oluşturun.
useMetaMask.js
içindesrc
dizin.
Bu, daha sonra hastanın MetaMask cüzdanını uygulamaya bağlamak için kullanılacak özel bir React Hook sağlar.
Kanca aşağıdakileri içerir:
connectMetaMask
: MetaMask’a bağlanır, bir Web3 örneği oluşturur ve bağlı hesabı ayarlar.disconnectMetaMask
: Web3 örneğini ve bağlı hesabı temizler.useEffect
: Hesap değişikliklerini dinler ve hesap durumunu buna göre günceller.
kanca geri döner web3Instance
, account
, connectMetaMask
Ve disconnectMetaMask
daha sonra kullanmak için.
- Sonra, şunu yaz
App.js
dosya şu şekilde:
Bu, kullanıcıların tıbbi onayları blok zincirine kaydetmelerini sağlar.
App.js
içerir:
- A
TextField
klinisyenlerin izin açıklamasını girmeleri için. - A
Connect Your Wallet
tetikleyen düğmehandleConnectWallet
işlevini kullanan,connectMetaMask
işleviuseMetaMask
MetaMask’a bağlanmak için kanca. - A
Disconnect Your Wallet
tetikleyen düğmehandleDisconnectWallet
çağıran fonksiyon,disconnectMetaMask
işleviuseMetaMask
MetaMask cüzdanından bağlantıyı kesmek için kanca. - A
Sign Consent
tetikleyen düğmehandleSignConsent
işlev.
Bu işlev aşağıdaki adımları gerçekleştirir:
- Onay açıklamasını Solidity’nin SHA3 işlevini kullanarak hash eder
- Karma hale getirilmiş izin açıklamasını ve bağlı cüzdanın adresini birleştirir, ardından sonucu hash eder
- Çağırır
addConsent
akıllı sözleşmenin hesaplanan onay hash’i ile işlevi - Onay verilerini (rıza karması, izin açıklaması, kullanıcının adresi ve işlem karması) Firebase Realtime Database’de depolar
- Başarılı onay imzalamanın ardından kullanıcı arayüzünü işlem karması ile günceller
- Sonra, oluştur
firebase.js
içindesrc
içeren klasöraddConsentDataToFirebase
izin verilerini (rıza karması, izin metni, cüzdan adresi ve işlem karması) bir Firebase Gerçek Zamanlı Veritabanında depolayan bir işlev. - Bu işlevi kullanmadan önce, Firebase konsolunuzda yeni bir proje başlatmanız, projeyi kullanarak yeni bir web uygulaması oluşturmanız ve Firebase yapılandırma ayrıntılarını bu dosyaya kopyalamanız gerekecektir.
- Uygulamaya stil eklemek için,
App.css
Veindex.css
aşağıdaki gibi:
- Kullanmak
yarn build
dağıtım için React uygulamasının optimize edilmiş bir sürümünü oluşturmak. Bu yaratacakbuild
proje dizininizdeki klasör. - Ardından, kullanarak proje dizininizde Firebase barındırmayı başlatın.
firebase init
. Proje dizininizde Firebase CLI yüklü değilse, bash komutunu kullanın.yarn add firebase-tools
. - Ardından,
build
dağıtım kaynağı olarak klasör ve kullanımfirebase deploy
Bu uygulamayı dağıtmak için. Bu size uygulama için dağıtım bağlantısını verecektir.
Ve hepsi bu. Uygulamamız hazır ve çalışıyor!
Aşağıdaki bağlantıyı kullanarak kendiniz deneyin:
Uygulamanın tam kodu aşağıdaki GitHub’ımda bulunabilir:
Bu uygulamanın işlevselliğini geliştirmek için herhangi bir sorunuz veya öneriniz varsa bana bildirin.
Okuduğunuz için teşekkürler!
Aşağıdaki kitaplarıma göz atın: