ブロックチェーン技術への没入:デジタル歯科の生態系

シリーズ「ブロックチェーン技術への没入」シリーズの2番目の記事を紹介します。 この記事では、Digital Dentistry Spaceと呼ばれるデジタル歯科エコシステムの一部であるDigital Dentistry Exchange医療プロジェクトについて学びます。



その技術的特徴について話し、スマートコントラクトに関する最も一般的な質問に答え、ブロックチェーンテクノロジーの将来に関するチームのビジョンを共有します。







一連の記事「ブロックチェーン技術への没入」



1. Emerテクノロジーに関する一連の資料:

1.1。 EmerCoinの秘密

1.2。 分散型の無修正ドメインネームシステム

1.3。 世界規模の公開鍵インフラストラクチャ

1.4。 分散パスワードレスセキュリティシステム

2. 高速で安全なトランザクション

3. デジタル歯科のエコシステム

4. 偽造品との戦い

5. 相互動物保険

6. ICOとは何か、そしてそれを行う方法

7.読み込み中...



歯科分野における責任の分配と統合サービスの質の向上の問題



現代のデジタル歯科には、CAD / CAM(コンピューター支援設計およびコンピューター支援製造)と呼ばれる方向があります。 クラウン、ベニヤまたはインレー(非常にクールな詰め物)などの歯科構造を作成するために使用されます。 コンピューターを使用した生産プロセスは、いくつかの段階で構成されています。



1.医師は、歯のデザインのインストールのために歯を準備し、印象を取り、服装を形成します。







2.医師は患者と価格に同意し、前払いが進行中です。



3.印刷物がスキャンされ、患者の歯のデジタル3次元モデルが取得されます。







4.このモデルに基づいた専門設計システム(CAD)を使用して、歯科設計の設計は、患者と医師の希望を考慮して設計されます。



5.確認後、歯科製品の3次元モデルがミリングセンターに送られ、そこで選択された材料(ジルコニウム、チタン、ポリマー、またはセラミック)から実体化されます。



6.製品は消毒され、患者に取り付けられます。







各ステージは個別に支払われますが、いずれかのステージでエラーが発生した場合、後続のすべてのステージは無駄に行われますが、すでに支払われています。 それを修正するのは簡単に思えます:各段階をテストし、問題を忘れます。 しかし、たとえば、患者の製品設置の段階で問題が特定され、以前の段階(スキャン、設計、およびミリング)はすでに支払われています。 これは、医者がお金、時間、神経を失っているということです。 最後の2点も患者に適用されます。



論理的な解決策は、CAD / CAMプロセスの参加者間で責任を分散できるようにする多国間協定を作成することです。 ここには、さまざまな支払い戦略の膨大な選択があります。たとえば:





その結果、複数のアクティブな当事者との取引が異なる方法で表示される場合があり、これに応じて、サービスの価格もランク付けされます。



このアプローチは、いくつかの理由で以前は実装されていませんでした。支払い規制機関が不足しているため、また、多数の予約を伴う契約の策定が非常に複雑であるため、このようなトランザクションを作成できませんでした。



アイデアの実装



注:ハッカソンの一部として書かれた実際のコードを以下に示します。



上記の問題は、スマート契約の助けを借りて解決できます。複雑な支払いスキームは、承認/拒否/支払いボタンにパッケージ化されています。 プロセス全体を調整するための最も信頼できるソリューションは、ブロックチェーンアーキテクチャを備えたシステムです。



そのため、チームには開発と設計に一定のバックグラウンドがあり、Ruby on Rails(RoR)フレームワークがバックエンドに、AngularJS JavaScriptフレームワークがフロントエンドに選ばれました。



スマートコントラクトの作成は、参加者が以前に同様のタスクに遭遇したことがなかったため、もう少し困難でした。 そのため、Azure Blockchain as a Serviceに基づいて、Ethereumプラットフォーム(ブロックチェーンに基づいた分散型オンラインサービスを作成するためのツール)が選択されました。 スマートコントラクトは、Solidityと呼ばれる特別な言語でプログラムされました。



参加者は、このツールを使用して作業中に生じた2つの質問とその回答を共有しました。



契約はどこに保存され、誰が正しい実行を保証しますか?

スマートコントラクトが作成およびデバッグされると、トランザクションブロックのチェーンに配置され、このスマートコントラクトが配置されているアドレスを知っている場合、システムのすべてのユーザーがチェックできます(ただし変更はできません)。 スマートコントラクト自体の正確さは、プログラマーがどの程度正確に書いたかに依存します。 スマートコントラクトが正しく記述されていなかった場合、修正することができず、別のアドレスに別のスマートコントラクトを配置する必要があります。



スマート契約を作成する価格はいくらですか?

スマートコントラクトを作成するには、一定量の国内通貨(Eth)を使用する必要があります。価格が高いほど、マイナーの間で優先順位が高くなります(これらは暗号ブロックが計算するマシンです)。 スマートコントラクトを処理してブロックチェーンに追加するには、マイナーが必要です。 頭金が最小限の場合、スマートコントラクトがグローバルブロックチェーンに配置されないという状況が発生する可能性があります。 契約の有効期間も設定できることに注意してください。



クライアント側でEthereumプラットフォームを使用するために知っておくべきこと



まず第一に、あなたが書いているプラ​​ットフォームを理解する必要があります。 前述のように、このソリューションではAngularJSフレームワークが使用されたため、すべてのロジックがコントローラーに配置され、すべてがweb3.jsで動作しました。



注:実際の状況では、このような操作は、クライアントから離れた安全なサーバーに保存するのが最適です。



次に、ブロックチェーンとの通信のためにプログラムへの接続を初期化する必要があります。



var Web3 = require('web3'); var web3 = new Web3(); web3.setProvider(new web3.providers.HttpProvider("http://_:8545")); var accounts = web3.eth.accounts;
      
      





accounts



はすべて、ブロックチェーン接続プログラムに関与するアカウントです(この場合はgethです )。



次に、接続されたトークンのバランスを調べるための関数が必要です。



  function getBalance(address){ var funds = web3.eth.getBalance(address); return funds; }
      
      





contractAddressのスマートコントラクトを介して何かを支払いましょう:



 function pay (amount, myToken, password, token, contractAddress){ web3.personal.unlockAccount(myToken,password); var contract = web3.eth.contract(abi).at(contractAddress); var res = contract.initDoctor.sendTransaction(token, {from:myToken, value:web3.toWei(amount,'ether')}); alert("you dropped to system with token "+token); }
      
      





注:簡単にするために、パスワードはプレーンテキストの形式で設定されましたが、これは実際のシステムでは実行できません。



これらは、スマートコントラクトを呼び出すために知っておく必要がある基本的な機能です。 詳細はイーサリアムの公式ウェブサイトで見つけることができます。



Solidityでスマートコントラクトを作成するために知っておくべきこと



Etheriumが提供するオンラインコンパイラとスマートコントラクトコンパイラがあります。 このプロジェクトでは、非常に便利で高速なので、 このエディターを使用することにしました。







さらにブロックチェーンでは、コードを使用してスマートコントラクトを記述しました。



 pragma solidity ^0.4.0; contract Dental { uint cadPrice = 10; uint millPrice = 10; uint digitizePrice = 10; mapping (address => uint) doctor_balances; mapping (address => uint) digitizer_balances; mapping (address => uint) cad_balances; mapping (address => uint) mill_balances; mapping (address => uint) statuses; //0 -start, //1 - digitizer initialized, //2 - cad initialized, //3 - mill initialized, //4 - digitizer ready, //5 - cad_ready, //6 - mill ready, //7 -payed mapping (address => address) digitizer_addresses; mapping (address => address) cad_addresses; mapping (address => address) mill_addresses; function initDoctor() { //  doctor_balances[ msg.sender ] += msg.value; statuses[msg.sender] = 0; } function initDigitizer(address digitizerAddr) { digitizer_addresses[msg.sender] = digitizerAddr; digitizer_balances[msg.sender] += msg.value; if (statuses[msg.sender] == 0) statuses[msg.sender] = 1; } function initCad(address cadAddr) { cad_addresses[msg.sender] = cadAddr; doctor_balances[ msg.sender ] -= cadPrice; cad_balances[msg.sender] += msg.value; if (statuses[msg.sender] == 1) statuses[msg.sender] = 1; } function initMill(address millAddr) { mill_addresses[msg.sender] = millAddr; mill_balances[msg.sender] += msg.value; if (statuses[msg.sender] == 2) statuses[msg.sender] = 3; } function digitizerDone() { if (statuses[msg.sender]==3) statuses[msg.sender] = 4; } function cadDone() { if (statuses[msg.sender]==4) statuses[msg.sender] = 5; } function millDone() { if (statuses[msg.sender]==5) statuses[msg.sender] = 6; } function doctorDone(bool happy) payable returns (bool) { if (statuses[msg.sender]!=6) return false; if (!happy){ doctor_balances[msg.sender] += digitizer_balances[msg.sender]; doctor_balances[msg.sender] += cad_balances[msg.sender]; doctor_balances[msg.sender] += mill_balances[msg.sender]; digitizer_balances[msg.sender] = 0; cad_balances[msg.sender] = 0; mill_balances[msg.sender] = 0; return false; } bool digitizerOk = digitizer_addresses[msg.sender].send(digitizer_balances[msg.sender]); digitizer_balances[msg.sender] = 0; bool cadOk = cad_addresses[msg.sender].send(cad_balances[msg.sender]); cad_balances[msg.sender] = 0; bool millOk = mill_addresses[msg.sender].send(mill_balances[msg.sender]); mill_balances[msg.sender] = 0; return (digitizerOk && cadOk && millOk); } }
      
      





さらに詳しく分析してみましょう。



1.最初に、Solidityのバージョンを示し、契約を宣言します。



 pragma solidity ^0.4.0; contract Dental {
      
      





2. 3Dスキャンサービス、設計、およびフライス加工のコストを設定します。



  uint cadPrice = 10; uint millPrice = 10; uint digitizePrice = 10;
      
      





3.プロセスの参加者への支払い用に残高の配列を作成します。



  mapping (address => uint) doctor_balances; mapping (address => uint) digitizer_balances; mapping (address => uint) cad_balances; mapping (address => uint) mill_balances;
      
      





4.ステータスを示します。



  mapping (address => uint) statuses; //0 - start, //1 - digitizer initialized, //2 - cad initialized, //3 - mill initialized, //4 - digitizer ready, //5 - cad_ready, //6 - mill ready, //7 -payed
      
      





5.プロセス参加者のアカウントの配列を作成します(医師なし):



  mapping (address => address) digitizer_addresses; mapping (address => address) cad_addresses; mapping (address => address) mill_addresses;
      
      





6.医師を初期化します。送信者は彼と見なされます。 彼は、ステータスが「未開始」または「注文完了」の場合にのみ、新しい注文を受け取ることができます。



  function initDoctor() { //  if (statuses[msg.sender] == 0 || statuses[msg.sender] == 7){ doctor_balances[ msg.sender ] = msg.value; statuses[msg.sender] = 0; } }
      
      





7.スキャナーを初期化します。これは、医師のステータスが「まだ開始されていない」場合に関係します。



  function initDigitizer(address digitizerAddr) { digitizer_addresses[msg.sender] = digitizerAddr; digitizer_balances[msg.sender] = msg.value; if (statuses[msg.sender] == 0) statuses[msg.sender] = 1; }
      
      





8.同様にデザインで繰り返します:



  function initCad(address cadAddr) { cad_addresses[msg.sender] = cadAddr; doctor_balances[ msg.sender ] -= cadPrice; cad_balances[msg.sender] = msg.value; if (statuses[msg.sender] == 1) statuses[msg.sender] = 2; }
      
      





9.同様に、フライス盤のオペレーターで繰り返します。



  function initMill(address millAddr) { mill_addresses[msg.sender] = millAddr; mill_balances[msg.sender] += msg.value; if (statuses[msg.sender] == 2) statuses[msg.sender] = 3; }
      
      





10.次に、スキャナーの動作を確認します。



  function digitizerDone() { if (statuses[msg.sender]==3) statuses[msg.sender] = 4; }
      
      





11.デザイナーの作業を確認します。



  function cadDone() { if (statuses[msg.sender]==4) statuses[msg.sender] = 5; }
      
      





12.フライス盤のオペレーターの作業を確認します。



  function millDone() { if (statuses[msg.sender]==5) statuses[msg.sender] = 6; }
      
      





13.医師は仕事を受け入れるかもしれません。 後者の場合、すべてのお金は彼の口座に戻されます。 ) 作品がまだミリングされていない場合、何も起こりません。 医師が仕事を受け入れた場合、お金は参加者の口座に送られます。



  function doctorDone(bool happy) payable returns (bool) { if (!happy){ doctor_balances[msg.sender] += digitizer_balances[msg.sender]; doctor_balances[msg.sender] += cad_balances[msg.sender]; doctor_balances[msg.sender] += mill_balances[msg.sender]; digitizer_balances[msg.sender] = 0; cad_balances[msg.sender] = 0; mill_balances[msg.sender] = 0; return true; } if (statuses[msg.sender]!=6) return false; bool digitizerOk = digitizer_addresses[msg.sender].send(digitizer_balances[msg.sender]); digitizer_balances[msg.sender] = 0; bool cadOk = cad_addresses[msg.sender].send(cad_balances[msg.sender]); cad_balances[msg.sender] = 0; bool millOk = mill_addresses[msg.sender].send(mill_balances[msg.sender]); mill_balances[msg.sender] = 0; if (digitizerOk && cadOk && millOk) statuses[msg.sender]=7; return (digitizerOk && cadOk && millOk); } }
      
      







Digital Dentistry Exchangeプロジェクトチームへのメッセージ



プロジェクト参加者に、ブロックチェーンテクノロジーの今後の展望を尋ねました。



「ブロックチェーン技術は、金融サービスから料理まで、あらゆるタイプの取引を行うのに最適な技術である可能性があります。 ブロックチェーンへの唯一の追加は、人や科学に役立つ修正された作業証明メカニズムである必要があります(たとえば、式a ^ 3 + b ^ 3 + c ^ 3 = 33でパラメーターa、b、cの整数値を見つけるという長年の仕事)



現時点では、ブロックチェーンシステムは、結果を測定できるサービス配信システムに理想的に統合できます(医療、製造、オンライン販売、特定のメトリックの達成、および場合によっては司法仲裁システムの包括的なサービス)。



可能なアプリケーションの数は膨大になる可能性があります-主なことは、アイデア、実装をテストし、それらを積極的に実装することです。 「法規制とブロックチェーンアーキテクチャを備えたシステムのISO標準を導入することも良いでしょう。」



以下の写真では、素材の作者:コンスタンチン・スコベルトシン、ヴィタリー・ディメンティエフ、リナ・ハティポフ、アイダル・ニグマチャノフ、ローマ・ヴァルナバ。










All Articles