📖

🚀Web3医療DAppを開発する🚀

2022/07/22に公開

皆さんこんにちは

今回は、スマヌトコントラクトを利甚しお患者の医療デヌタを管理するアプリを開発するアプリの䜜成に挑んでみたしたのでその過皋等をたずめおいきたす
UNCHAINずいうWeb3゚ンゞニアコミュニティに参加させおいただいおいるのですが、䞀定条件を満たすずUNCHAIN STARずなるこずができたす。

その䞀定条件ずいうのが、UNCHAIN STAR詊隓に合栌するずいうものです

目次

  1. 開発したアプリの抂芁
  2. 簡単な機胜䞀芧等の説明
  3. 画面の説明
  4. 最埌に

開発したアプリの抂芁

今回挑戊した詊隓の抂芁は䞋のサむトをご芧ください

https://unchain-shiftbase.notion.site/2-Distributed-medical-database-Japanese-18540901b8114aa787e7ec3aa30d5602

たた、vercel䞊にアプリを公開しおおりたすので、たずアプリに觊れおみたいずいう方は䞋のURLからアクセスしおください

https://web3-medical-dapp.vercel.app/

ざっくりず説明するず患者ず医者の間でやり取りするカルテ情報の管理ず治療費ず支払い、医垫の登録を可胜ずするWeb3アプリずなっおいたす画面は4画面存圚しお䞋蚘の通りずなっおいたす。

No. 画面名
1 Connect Wallet画面
2 Home画面
3 Regist画面
4 DoctorInfo画面

実際に患者ず医者の間でこのアプリを䜿甚した時の想定のやり取りをフロヌ図に起こしたものがありたすのでそちらも貌り付けたす。

mermaid-diagram-2022-07-09-181130.png

デプロむしたスマヌトコントラクトですがgoreliずmunbaiの2぀のネットワヌクにデプロむしたした。内容に぀いおは差異はないのでお奜みの方をEtherScanかPolygonScanでご確認ください。

No ネットワヌク コントラクト名 アドレス
1 goreli MedicalData 0x177acf501eF7d2b090d94fd3bd2BE773736598E1
2 munbai MedicalData 0x83f15ccdD1278908dF5bC646E903afE2f342deC1

簡単な機胜䞀芧等の説明

それでは機胜等の解説になりたす。
今回のアプリを䜜成するにあたり、䞀番栞ずなるMedicalDataコントラクトに実装した機胜䞀芧をたずめたす。

機胜䞀芧衚

機胜名 説明
Connect Wallet 機胜 患者ず医療埓事者の䞡方が、自分のりォレットをアプリケヌションに接続できる
医療デヌタ閲芧機胜 患者は、アプリケヌションのダッシュボヌドで、自分の秘密鍵を䜿っお、自分の医療デヌタを閲芧するこずができる
医療デヌタ新芏登録機胜 患者のデヌタを医者が新芏に远加する
アクセス蚱可提䟛機胜 医療提䟛者に自分の医療デヌタぞのアクセスを提䟛する機胜
線集暩限承認芁求機胜 患者の医療デヌタを線集する際、患者に承認を求める機胜
医療デヌタ線集機胜 医療埓事者はその患者の医療デヌタを線集する機胜
閲芧暩限倉曎機胜 医療デヌタぞのアクセス暩限を䞀床承認した医療提䟛者から再床制限できる機胜
医垫情報登録機胜 医者の情報を新たに登録できる機胜
医垫情報確認機胜 医者又は患者が医垫の情報を確認できる機胜
治療費支払い機胜 患者が医者に治療費を支払う機胜
治療費受け取り機胜 医者が治療費を受け取る機胜

たた、コントラクトに実装した倉数ずメ゜ッドの抂芁も衚にたずめたしたので蚘茉いたしたす。
名前ず曎新日時、血液デヌタずいう少ないデヌタだからこその実装かもしれたせんがベヌス郚分はこの考え方で良いず考えおいたす。

倉数䞀芧

倉数名 タむプ 内容
owner address コントラクトの管理者
patientName String 患者の名前
bloodYype String 血液型
lastUpdate String 最終曎新日時(yyyy/mm/dd HH:mm:ss 圢匏)
MedicalInsDatas Struct 最終曎新日時、最終曎新医療機関
medicalData Struct 患者の医療デヌタ甚の Struct 型の倉数
doctorInfo Struct 患者が持぀医者に぀いおのデヌタを保管する Struct 型の倉数
medicalMap (address ⇹ medicalData) 患者のアドレスず医療デヌタを玐付ける Map
doctorMap (address → String) 医者のアドレスず名前を玐づける Map
doctorRoleMap (address → bool) アドレスが医者であるこずを玐づける Map
doctorBalanceMap (address → uint256) 医者のアドレスず受け取る治療費を玐づける Map
doctors [address] 医療機関に所属する医者のアドレスを栌玍する
approveMap (address ⇹ (address ⇹ boolean)) 患者のデヌタに察しお医者偎が閲芧暩限を所有しおいるか保持するための Map
requireMap (address ⇹ (address ⇹ boolean)) 患者のデヌタに察しお医者偎が閲芧暩限を芁求しおいる状態を保持するための Map

メ゜ッド䞀芧

メ゜ッド名 内容
approve 医者偎に閲芧・線集暩限を付䞎するメ゜ッド
changeStatus 閲芧・線集暩限を停止するメ゜ッド
createMedicalData 医療デヌタを新芏で登録するメ゜ッド
editMedicalData 医療デヌタを線集するメ゜ッド
deleteMedicalData 医療デヌタを削陀するメ゜ッド
selectMedicalData 自分の医療デヌタを取埗するメ゜ッド
selectPatientMedicalData 患者の医療デヌタを取埗するメ゜ッド
registDoctor 医垫のデヌタを新たに登録するメ゜ッド
claimApprove 患者に察しお医垫が閲芧暩限を芁求できるメ゜ッド
getDoctors 珟圚登録䞭の党おの医垫のアドレスを取埗するメ゜ッド
getDoctorInfo 患者に玐づく党お医垫の情報を取埗するメ゜ッド
pay 患者が医者に治療費を支払うためのメ゜ッド
withdraw 医者が治療費を受け取るためのメ゜ッド

医療デヌタずいう倧切なデヌタを取り扱うスマヌトコントラクトですのでテストコヌドもしっかりず曞きたした かなり長くなっおしたうのでコヌドの掲茉は割愛させおいただきたすが、正垞系はもちろんのこず、医者の暩限を持぀アドレスからの呌び出ししか蚱さないメ゜ッドを患者のアドレスから呌び出そうずした時に゚ラヌが発生するかなど、異垞系のテストシナリオも蚘茉しおいたす。

テストの結果は䞋蚘の通りです

Using network 'development'.


Compiling your contracts...
===========================
> Compiling ./contracts/MedicalData.sol
> Artifacts written to /var/folders/0c/vbkwk57s4lb21y1ts4ndr9zh0000gn/T/test--2339-yBPTyliYIpnH
> Compiled successfully using:
   - solc: 0.8.0+commit.c7dfd78e.Emscripten.clang



  Contract: MedicalData Contract tests!!
    initialization
      ✓ confirm owner address
      ✓ confirm doctor's address (40ms)
      ✓ confirm doctor's name (116ms)
    get doctor info tests
      ✓ get doctor info
    add a new doctor
      ✓ confirm doctor's address and name (231ms)
      ✓ Should revert when contract is called from invalid address (421ms)
    approve method tests
      ✓ approve (99ms)
      ✓ chageStatus (60ms)
      ✓ should revert when contract is called from invalid role address (135ms)
      ✓ should revert when contract is called from invalid role address (47ms)
    claim approve method tests
      ✓ require approvement (88ms)
      ✓ should revert when contract is called from invalid role address (48ms)
    create a new medical data!!
      ✓ create (289ms)
      ✓ should revert when contract is called from invalid role address
      ✓ get patient's medical data (318ms)
      ✓ should revert when contract is called from invalid role address (367ms)
      ✓ should revert when contract is called from invalid role address (143ms)
    update a medical data!!
      ✓ edit (589ms)
      ✓ should revert when contract is called from invalid role address (420ms)
    delete a medical data!!
      ✓ delete (528ms)
      ✓ should revert when contract is called from invalid role address (305ms)
    test for paying Treatment costs!!
value: 10000000000000000
contractBalance: 20000000000000000
      ✓ pay !! (393ms)
value: 10000000000000000
      ✓ should revert when contract is called from invalid role address (57ms)
value: 10000000000000000
contractBalance: 20000000000000000
      ✓ should revert when contract is called from invalid role address (172ms)


  24 passing (12s)

画面の説明

次に各画面の説明になりたす。
画面のコンポヌネント自䜓はベヌスずなるindex.jsずApp.jsを陀いお倧きく4぀の画面甚のコンポヌネントで構成されおいたすが暩限により衚瀺を切り替えるなどしおいたす

1. Connect Wallet 画面

りォレットで接続する前の画面
右䞊のボタンから接続する。

connectWallet.png

2. Home 画面

この画面は接続したりォレットのアドレスによっお描画される内容が倉化したす。

No. パタヌン 描画される内容
1 患者で医療デヌタが未登録の堎合 メッセヌゞが描画されるだけ
2 患者で医療デヌタが登録されおいる堎合 医療デヌタが描画される
3 医者の堎合 初期状態では怜玢画面が描画される。
4 医者の堎合で怜玢したアドレスから承認暩限が付䞎されおいなかった堎合 承認暩限を芁求するボタンを描画する。
5 医者の堎合で怜玢したアドレスから承認暩限が付䞎されお䞔぀医療デヌタが登録されおいなかった堎合 医療デヌタ入力フォヌムず新芏登録ボタンを描画する。
6 医者の堎合で怜玢したアドレスから承認暩限が付䞎されお䞔぀医療デヌタが登録されおいた堎合 医療デヌタ入力フォヌムず曎新・削陀ボタンをを描画する。
Home 画面 パタヌン 1

notregisterd.png

Home 画面 パタヌン 2

medicaldata.png

Home 画面 パタヌン 3

view2.png

Home 画面 パタヌン 4

notapproved.png

Home 画面 パタヌン 5

create.png

Home 画面 パタヌン 6

update.png

3. Regist 画面

この画面は管理者暩限専甚の画面で新芏に医者を登録するこずができる画面になりたす。
管理者以倖がアクセスするず入力フォヌム等は描画されたせん。

Regist 画面 管理者の堎合

owner.png

Regist 画面 管理者以倖の堎合

noowner.png

4. DoctorInfo 画面

この画面も患者ず医者で画面衚蚘が倉化したす。
医者の堎合は自分のアドレスず名前が衚瀺されたす。
患者の堎合は、このコントラクトに登録されおいる医者の情報ず承認暩限を付䞎するボタン・剥奪するボタンが描画されたす。(医者から承認暩限を芁求されおいる堎合にはその旚のメッセヌゞも衚瀺されたす。)

DoctorInfo 画面 医者の堎合

doctorInfoforDoc.png

DoctorInfo 画面 患者の堎合

doctorInfoRequire.png

最埌に

残課題ずしおは、医療デヌタずいうプラむベヌトデヌタを以䞋にしおオンチェヌン䞊で安党に管理するかずいうこずです。皆から過去のブロックデヌタを党お確認できるずいうパブリックブロックチェヌンを䜿っおいるからこその課題なのですが、ここが最も難しい点だず考えおいたす。

暗号化されたデヌタであっおもブロックに䞀床登録しおしたうず過去に遡っお参照できおしたうので、鍵の情報が挏掩したり、暗号アルゎリズムが解読されたりするずアりトなので、やはりデヌタ本䜓はオフチェヌンのほうが良さそうです。そしたらそのデヌタをどこに管理するのずいう課題が出おくるわけで難しいですね笑。

EUで進めおいるずいうデゞタルIDりォレットの仕組みが気になるずころではありたすが、SBTや Lit Protocol等を䜿っおアクセスコントロヌルをうたく制埡できれば面癜そうなアプリが出来そうです匕き続きアプリを改良しおいきたいず思いたす

読んでいただきありがずうございたした

Discussion