Eintauchen in die Blockchain-Technologie: Das Ökosystem der digitalen Zahnheilkunde

    Präsentation des zweiten Artikels aus der Reihe „Immersion in Blockchain Technology“. In diesem Artikel erfahren Sie mehr über das medizinische Projekt Digital Dentistry Exchange, das Teil des digitalen Zahnheilkundesystems Digital Dentistry Space ist.

    Wir werden über seine technologischen Merkmale sprechen, die häufigsten Fragen zu intelligenten Verträgen beantworten und die Vision des Teams über die Zukunft der Blockchain-Technologie teilen.



    Artikelserie „Eintauchen in die Blockchain-Technologie“


    1. Eine Reihe von Materialien zur Emer-Technologie:
    1.1. Geheimnisse von EmerCoin .
    1.2. Ein dezentrales unzensiertes Domain Name System .
    1.3. Weltweite Public-Key-Infrastruktur .
    1.4. Dezentrales passwortloses Sicherheitssystem .
    2. Schnelle und sichere Transaktionen .
    3. Das Ökosystem der digitalen Zahnmedizin .
    4. Der Kampf gegen gefälschte Waren .
    5. Gegenseitige Tierversicherung .
    6. Was ist ein ICO und wie es zu verbringen .
    7. Laden ...

    Das Problem der Verteilung der Verantwortung und der Verbesserung der Qualität integrierter Dienstleistungen im Bereich der Zahnheilkunde


    In der modernen digitalen Zahnmedizin gibt es eine Richtung namens CAD / CAM (Computer Aided Design und Computer Aided Manufacturing). Es wird verwendet, um zahnärztliche Strukturen wie Kronen, Veneers oder Inlays (sehr kühle Form von Füllungen) herzustellen. Der Herstellungsprozess mit einem Computer besteht aus mehreren Schritten:

    1. Der Arzt bereitet den Zahn für die Installation eines Zahnersatzes vor, nimmt eine Abformung vor und stellt eine Auftragsbestätigung zusammen:



    2. Der Arzt vereinbart mit dem Patienten den Preis, die Vorauszahlung ist in Bearbeitung.

    3. Der Druck wird gescannt und ein digitales dreidimensionales Modell der Zähne des Patienten erstellt:



    4. Unter Verwendung eines speziellen Konstruktionssystems (CAD) wird die Zahnkonstruktion auf der Grundlage dieses Modells unter Berücksichtigung der Wünsche des Patienten und des Arztes erstellt.

    5. Nach der Bestätigung wird das dreidimensionale Modell des Dentalprodukts an das Fräszentrum gesendet, wo es aus dem ausgewählten Material (Zirkonium, Titan, Polymer oder Keramik) hergestellt wird.

    6. Das Produkt wird desinfiziert und am Patienten installiert.



    Jede Stufe wird separat bezahlt. Tritt jedoch in einer der Stufen ein Fehler auf, werden alle nachfolgenden Stufen vergeblich durchgeführt, obwohl sie bereits bezahlt wurden. Es scheint, dass es einfach ist, das Problem zu beheben: Jede Phase zu testen und das Problem zu vergessen. Es werden jedoch beispielsweise Schwierigkeiten bei der Produktinstallation für den Patienten festgestellt, und die vorherigen Schritte (Scannen, Entwerfen und Fräsen) wurden bereits bezahlt. Dies bedeutet, dass der Arzt Geld, Zeit und Nerven verliert. Die letzten beiden Punkte gelten auch für den Patienten.

    Die logische Lösung besteht darin, multilaterale Vereinbarungen zu treffen, die es Ihnen ermöglichen, die Verantwortung unter den Teilnehmern am CAD / CAM-Prozess zu verteilen. Hier kommt eine riesige Auswahl an verschiedenen Auszahlungsstrategien, zum Beispiel:

    • Der Arzt zahlt allen Teilnehmern nur, wenn das Produkt erfolgreich installiert wurde.
    • Der Arzt bezahlt die Teilnehmer nacheinander, wenn jeder Teilnehmer das vorherige Ergebnis bestätigt. Sie können Versicherung, Reputation usw. hinzufügen.

    Infolgedessen können Transaktionen mit mehreren aktiven Parteien unterschiedlich dargestellt werden, abhängig davon werden auch die Preise für Dienstleistungen eingestuft.

    Dieser Ansatz wurde aus mehreren Gründen nicht früher umgesetzt: Es war unmöglich, solche Formen von Transaktionen zu erstellen, da es keine Regulierungsbehörde für Zahlungen gab und die Formulierung von Vereinbarungen mit einer großen Anzahl von Vorbehalten sehr komplex war.

    Umsetzung der Idee


    Hinweis: Der echte Code, der als Teil des Hackathons geschrieben wurde, ist unten dargestellt.

    Das oben beschriebene Problem kann mit Hilfe von intelligenten Verträgen gelöst werden: Komplexe Zahlungsschemata sind in Schaltflächen zum Akzeptieren / Ablehnen / Bezahlen zusammengefasst. Die zuverlässigste Lösung für die Anpassung des gesamten Prozesses ist ein System mit Blockchain-Architektur.

    Das Team hatte einen gewissen Hintergrund in Entwicklung und Design, das Ruby-on-Rails-Framework (RoR) wurde für das Back-End und das AngularJS-JavaScript-Framework für das Front-End ausgewählt.

    Das Schreiben von intelligenten Verträgen war etwas schwieriger, da keiner der Teilnehmer zuvor auf eine ähnliche Aufgabe gestoßen war. Aus diesem Grund wurde die Ethereum-Plattform (ein Tool zum Erstellen dezentraler Onlinedienste auf der Basis der Blockchain) ausgewählt, die auf Azure Blockchain as a Service basiert. Smart-Verträge wurden in einer speziellen Sprache namens Solidity programmiert.

    Die Teilnehmer teilten zwei Fragen, die sich während ihrer Arbeit mit diesem Tool stellten, und beantworteten diese.

    Wo ist der Vertrag gespeichert und wer sorgt für die ordnungsgemäße Ausführung?
    Wenn ein Smart-Vertrag geschrieben und getestet wird, wird er in eine Kette von Transaktionsblöcken gestellt und kann von jedem Benutzer des Systems überprüft (aber nicht geändert!) Werden, ob er die Adresse kennt, an der sich dieser Smart-Vertrag befindet. Die Richtigkeit des Smart-Vertrags selbst hängt davon ab, wie korrekt der Programmierer ihn geschrieben hat. Wenn der Smart-Vertrag nicht korrekt beschrieben wurde, kann er nicht repariert werden, und Sie müssen einen anderen Smart-Vertrag an einer anderen Adresse platzieren.

    Was kostet es, einen intelligenten Vertrag zu erstellen?
    Um einen intelligenten Vertrag zu erstellen, müssen Sie einen bestimmten Betrag an Inlandswährung (Eth) ausgeben. Je höher der Preis, desto höher die Priorität der Minenarbeiter (dies sind die von Cryptoblocks berechneten Maschinen). Bergleute werden benötigt, um den Smart-Vertrag zu verarbeiten und der Blockchain hinzuzufügen. Wenn die Anzahlung minimal ist, kann es vorkommen, dass der Smart-Vertrag niemals in die globale Blockchain aufgenommen wird. Es ist erwähnenswert, dass Sie auch die Laufzeit des Vertrags festlegen können.

    Was Sie wissen müssen, um mit der Ethereum-Plattform für die Client-Seite zu arbeiten


    Zunächst müssen Sie verstehen, für welche Plattform Sie schreiben. Wie oben erwähnt, wurde in dieser Lösung das AngularJS-Framework verwendet, sodass die gesamte Logik im Controller platziert wurde und die gesamte Arbeit mit web3.js.

    Hinweis: Unter realen Bedingungen sollten solche Vorgänge am besten auf einem sicheren Server außerhalb des Clients ausgeführt werden.

    Als nächstes müssen Sie die Verbindung zum Programm für die Kommunikation mit der Blockchain initialisieren:

    var Web3 = require('web3');
    var web3 = new Web3();
    web3.setProvider(new web3.providers.HttpProvider("http://адрес_сервера:8545"));
    var accounts = web3.eth.accounts;
    

    accounts- Dies sind alle Konten, die am Blockchain-Verbindungsprogramm beteiligt sind (in unserem Fall ist es geth ).

    Jetzt brauchen wir eine Funktion, um das Gleichgewicht der verbundenen Token herauszufinden:

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

    Lassen Sie uns versuchen, etwas durch einen intelligenten Vertrag bei contractAddress zu bezahlen :

    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); 
    }
    

    Hinweis: Der Einfachheit halber wurde ein Passwort in Form von Klartext festgelegt, dies ist jedoch in einem realen System nicht möglich.

    Dies sind die grundlegenden Funktionen, die Sie zum Aufrufen von Smart Contracts benötigen. Details finden Sie auf der offiziellen Website von Ethereum .

    Was Sie wissen müssen, um einen intelligenten Vertrag in Solidity zu schreiben


    Es gibt sowohl Online-Compiler als auch Smart Contract Compiler von Etherium. In diesem Projekt haben wir uns für diesen Editor entschieden , da er sehr praktisch und schnell ist.



    Außerdem wurde in der Blockchain der Code verwendet, um einen intelligenten Vertrag zu schreiben:

    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);
        }
    }
    

    Wir werden es genauer analysieren:

    1. Zuerst geben wir die Version von Solidity an und erklären einen Vertrag:

    pragma solidity ^0.4.0;
    contract Dental {
    

    2. Legen Sie die Kosten für 3D-Scan-Services, Design und Fräsen fest:

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

    3. Wir erstellen Saldenreihen für die Zahlung der Teilnehmer im Prozess:

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

    4. Wir geben die Status an:

    	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. Erstellen Sie Arrays von Konten von Prozessteilnehmern (ohne Ärzte):

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

    6. Wir initialisieren den Arzt, der Absender wird als er betrachtet. Bitte beachten Sie, dass er neue Bestellungen nur annehmen kann, wenn er den Status "noch nicht gestartet" oder "Bestellung abgeschlossen" hat:

        function initDoctor() {  //Загрузка денег
           if (statuses[msg.sender] == 0 || statuses[msg.sender] == 7){
    doctor_balances[ msg.sender ] = msg.value;
    statuses[msg.sender] = 0;
            }
        }
    

    7. Wir initialisieren den Scanner, der beteiligt ist, wenn der Arzt den Status "noch nicht gestartet" hat:

        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. Wiederholen Sie dies ebenfalls mit dem Design:

        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. Ebenso mit dem Fräsmaschinenbediener wiederholen:

        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. Bestätigen Sie als Nächstes den Betrieb des Scanners:

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

    11. Bestätigen Sie die Arbeit des Designers:

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

    12. Wir bestätigen die Arbeit des Fräsmaschinenbedieners:

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

    13. Der Arzt kann den Job annehmen oder nicht. Im letzteren Fall wird das gesamte Geld auf sein Konto zurückerstattet. ) Ist das Werkstück noch nicht gefräst, passiert nichts. Wenn der Arzt die Arbeit annimmt, wird das Geld auf die Konten der Teilnehmer überwiesen:

        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);
        }
    }
    


    Nachricht an das Digital Dentistry Exchange Project Team


    Wir haben die Projektteilnehmer gefragt, welche Zukunft sie mit der Blockchain-Technologie sehen:

    „Die Blockchain-Technologie ist möglicherweise die am besten geeignete Technologie für die Durchführung von Transaktionen jeglicher Art, von Finanzdienstleistungen bis hin zum Kochen. Die einzige Ergänzung zur Blockchain sollte ein überarbeiteter Nachweismechanismus sein, der den Menschen oder der Wissenschaft zugute kommt (zum Beispiel die langjährige Aufgabe, ganzzahlige Werte der Parameter a, b, c im Ausdruck a ^ 3 + b ^ 3 + c ^ 3 = 33 zu finden )

    Derzeit kann das Blockchain-System ideal in ein System zur Erbringung von Dienstleistungen integriert werden, in dem die Ergebnisse gemessen werden können (umfassende Dienstleistungen in den Bereichen Medizin, Herstellung, Online-Verkauf oder das Erreichen bestimmter Messgrößen und möglicherweise ein gerichtliches Schiedsverfahren).

    Die Anzahl der möglichen Anwendungen kann sehr groß sein - es geht vor allem darum, Ideen und Umsetzungen zu testen und aktiv umzusetzen. Es wäre auch gut, gesetzliche Regelungen und den ISO-Standard für Systeme mit Blockchain-Architektur einzuführen. “

    Die Autoren des Materials sind: Konstantin Skobeltsyn, Vitaly Dementiev, Rinat Khatipov, Aidar Nigmatzhanov und Roman Varnava auf dem Foto unten.


    Jetzt auch beliebt: