
Das Ethereum-Netzwerk, das in einem engen Kreis von Blockchain-Entwicklern weithin bekannt ist, hat sich bereits als bequeme und stabile Plattform für die Entwicklung intelligenter Verträge etabliert. Wir versuchen, unvorbereiteten Benutzern intelligente Verträge zur Verfügung zu stellen, indem wir einfache, aber praktisch nützliche Verträge anbieten. Wir haben kürzlich einen Bet Me Disput Smart-Vertrag entwickelt. Der Vertrag basiert auf einer Wette (Streit) zwischen zwei Gegnern. Sie stärken die Selbstgerechtigkeit mit einem Geldsatz. Der Verlierer verliert Geld und der Gewinner nimmt alles. Ich werde Ihnen in diesem Artikel mehr darüber erzählen.
Warum ist Blockchain hier?
Die Frage, die Autoren von Artikeln über die Blockchain selten gestellt werden, lautet zunächst: Wird Blockchain in dieser Situation benötigt? Welche Aufgaben sind mit einer mündlichen Vereinbarung oder einem Rechtsvertrag schwer zu lösen, aber einfach mit einer Blockchain?
Wenn zwei Personen mündlich argumentierten, führt dies häufig zu einem neuen Prozess. "Ich habe es nicht so gemeint", "Äußere Umstände haben das Ergebnis beeinflusst, sonst hätte ich recht gehabt", "Ja, ich habe nicht ernsthaft mit Ihnen gestritten, aber Sie haben es sich selbst überlegt" und andere mögliche Ausreden machen eine mündliche Auseinandersetzung mit vielen bekannten Personen ziemlich niedrige Preise. Bei ernsthaften Wetten und einer relativ weit entfernten Bekanntschaft ist es vielversprechender, eine schriftliche Vereinbarung zu schließen und das Wesentliche des Streits, der Wetten, der Entscheidungskriterien und aller anderen Bedingungen, die die Parteien für wichtig halten, detailliert aufzuschreiben.
Dieser Ansatz hat mehrere Nachteile.
- Meistens ist es notwendig, einen Anwalt oder sogar zwei auf jeder Seite zu gewinnen, sonst können Sie einen wichtigen Punkt vergessen, und dies führt zu finanziellen Verlusten.
- Oft sind im Vertrag nur Verpflichtungen der Parteien vorgeschrieben, eine Haftung für Verstöße gegen diese Verpflichtungen jedoch nicht. Infolgedessen stellt sich heraus, dass es für eine Seite zu einfach ist, nicht zu zahlen, und für die andere Seite ist es äußerst schwierig und teuer, Ihr Geld vor Gericht zu bringen.
- Oder es kann sein, dass beide Parteien auf ihrer Unschuld bestehen und selbst ein Gerichtsverfahren nicht garantiert, dass der Gewinner das Geld erhält.
- Es kann sich herausstellen, dass die Verliererseite einfach kein Geld hat, und selbst eine Gerichtsentscheidung wird sie trotz aller Verpflichtungen nicht zwingen, ihre Schulden zu bezahlen.
Die Blockchain (und insbesondere das Ethereum-Netzwerk) ermöglicht es Ihnen, mit Geld zu arbeiten (wir werden Äthergeld nennen; dies ist nicht ganz richtig, aber es ist praktisch und spiegelt den wahren Stand der Dinge ausreichend wider, da Äther recht einfach gegen Fiat-Geld einzutauschen ist und umgekehrt). Gleichzeitig können Sie in Ethereum die Vereinbarungen auf eine Reihe spezifischer Regeln reduzieren. Es ist einfach nicht möglich, diese nicht zu erfüllen. Unser intelligenter Vertrag akzeptiert also Geld von jeder Seite und blockiert es, bis bestimmte Ereignisse eintreten. Eine Reihe vordefinierter Programmregeln ermöglicht es dem Gewinner, Geld abzuheben. Dies ist genau das, was Sie brauchen.
Implementierung
Eine Reihe von Regeln für Streitigkeiten kann auf verschiedene Arten umgesetzt werden. Im Folgenden werden wir darüber sprechen, was wir für Benutzer der Smartz-Plattform getan haben.
Der Streit betrifft zwei Parteien. Derjenige, der die Kopie des Vertrags im Ethereum-Netzwerk erstellt, wird als Eigentümer des Vertrags (Eigentümer) bezeichnet, und sein Gegner wird als Gegner (Gegner) bezeichnet. Der Vertragsinhaber erstellt eine Texterklärung, die er für wahr hält. Der Gegner setzt darauf, dass die Aussage falsch ist. Die Entscheidung über den Ausgang des Rechtsstreits trifft ein unabhängiger Schiedsrichter (Arbiter), dessen Kandidatur sowohl vom Eigentümer als auch vom Widersprechenden genehmigt wird. Der Schiedsrichter erhält eine Provision in Form eines Prozentsatzes des Streitbetrags.
Die Arbeit des Vertrags ist in mehrere aufeinanderfolgende Phasen unterteilt.
- Die Verhandlungen . Der Eigentümer und der Widersprechende können bereits vor Vertragsabschluss auf bequeme Weise verhandeln. Nachdem sie gemeinsam entschieden haben, wer der Schiedsrichter sein wird, senden sie dem Kandidaten eine Einladung, ihren Streit zu beurteilen. Nach Erhalt der Einladung sieht der Schiedsrichter alle Bedingungen und den entsprechenden Staat. Mehr dazu weiter unten, aber im Moment ist es wichtig zu verstehen, dass der zukünftige Schiedsrichter diese Nummer in den Vertrag übertragen muss, um zu zeigen, unter welchen Bedingungen er bereit ist, die Debattierer zu beurteilen. Wenn der Eigentümer einen Betrag ungleich Null für die Kaution festgelegt hat (ArbiterPenaltyAmount), muss der Schiedsrichter gemäß den Bestimmungen die angegebene Sendezeit auf den Vertrag übertragen. Danach wird sie gesperrt, bis der Schiedsrichter die Debattierer entscheidet oder bis zur Frist für die Beilegung des Streits. Im letzteren Fall verliert der Schiedsrichter die Möglichkeit, die Kaution abzuheben, und dieser Betrag wird gleichmäßig auf die Streitparteien verteilt.
- Initialisierung . Der Vertragsinhaber erstellt eine Instanz des Vertrags und legt seine Parameter fest: Streitgegenstand; das Datum, bis zu dem der Schiedsrichter entscheiden muss (Frist); Prozentsatz der Schiedskommission (Bruchzahl ≥ 0 und <100); die Höhe der Kaution (kann Null sein), die der Schiedsrichter als Garantie dafür leisten muss, dass er sich verpflichtet, den Streit in der bestehenden Formulierung zum richtigen Zeitpunkt zu entscheiden. Der Eigentümer legt auch die Ethereum-Adresse des Schiedsrichters fest, dem er vertraut. Nur der Inhaber dieser Adresse kann später Schiedsrichter werden.
- Eigentümerrate Nach dem Setzen macht der Vertragsinhaber eine Wette. Zu diesem Zweck sendet er eine beliebige Menge Äther an den Vertrag. Dieser Betrag ist der Tarif, er ist an der Adresse des Vertrages gesperrt.
- Die Zustimmung des Schiedsrichters . Das Angebot des Eigentümers legt die Streitbedingungen fest. Jetzt sieht der Schiedsrichter die vollständigen Bedingungen der Transaktion: den Wortlaut des Streits, den Zeitpunkt, vor dem eine Entscheidung getroffen werden muss, und vor allem kann er verstehen, wie viel Äther er als Belohnung erhalten wird. Wenn der Schiedsrichter mit allem zufrieden ist, bestätigt er seine Teilnahme und überweist gleichzeitig die Versicherungskaution.
- Suche nach einem Gegner . Nach Zustimmung des Schiedsrichters beginnt die Suche nach dem Gegner. Der Eigentümer legt die Adresse des Gegners im Voraus fest, wenn er bereit ist, nur mit einer bestimmten Person zu streiten, oder die Adresse leer lässt, und dann kann der Eigentümer einer beliebigen Adresse im Netzwerk (mit Ausnahme des Schiedsrichters und des Eigentümers) der Gegner werden. Der Widersprechende bestätigt die Teilnahme am Streit, indem er eine gesonderte Vertragsmethode aufruft, an die er die aktuelle Versionsnummer der Daten überträgt und sendet - so viel der Eigentümer festgelegt hat. Ab diesem Moment gilt die Wette als abgeschlossen. Jetzt wartet der Vertrag entweder auf die Entscheidung des Schiedsrichters oder auf den Stichtag.
- Der Ausgang des Streits . Der Schiedsrichter kann den Streit auf drei Arten beurteilen.
- Erkennen Sie die Aussage als wahr. In diesem Fall kann der Vertragsinhaber den gesamten Ätherbetrag mit Ausnahme der Provision des Schiedsrichters und der Kaution (falls vorhanden) abheben: Das Geld wird vom Schiedsrichter abgehoben, und der Widersprechende erhält nichts.
- Erkennen Sie die Aussage als falsch. In diesem Fall kann der Schiedsrichter den Äther in Höhe der ihm zustehenden Provision und der Höhe der Verpfändung zurückziehen. Der Gegner übernimmt den Rest, aber der Besitzer bekommt nichts.
- Erklären Sie den Streit für unlösbar. Zum Beispiel hat der Eigentümer einen Streit mit der Aussage „Das für nächsten Sonntag geplante Fußballspiel zwischen den Teams A und B endet mit einem Ergebnis von 2: 1 zugunsten von A“ geführt. Wenn das Spiel abgesagt wird, wird der Schiedsrichter den Streit nicht lösen, aber er sollte in der Lage sein, sein Versprechen einzuholen, da das Problem nicht durch sein Verschulden entstanden ist. In diesem Fall kann jede der Parteien die Übertragung von Luft in Höhe ihres eigenen Angebots von der Vertragsadresse in ihre Brieftasche beantragen. - Geld abheben . Wenn der Schiedsrichter eine Entscheidung getroffen hat oder der Stichtag erreicht ist, kann jede der Parteien eine Schlussfolgerung in der Luft beantragen. Wie viel Äther ausgegeben werden soll, berechnet der Vertrag selbst und konzentriert sich dabei auf die Ergebnisse des Streits.
- Zerstörung des Vertrages . Der Eigentümer kann einen Selbstzerstörungsbefehl an den Vertrag senden. Dies kann entweder vor Abschluss der Transaktion (wenn der Schiedsrichter nicht gefunden wurde) oder nach dessen Abschluss (wenn alle Parteien die ihnen geschuldeten Mittel abgehoben haben) erfolgen. Eine solche Gelegenheit ist nützlich, wenn auf magische Weise mehr Luft als empfangen an der Adresse des Vertrags empfangen wurde. Die Wahrscheinlichkeit eines solchen Ereignisses ist sehr gering, aber in Ethereum ist es immer noch unmöglich, die Übertragung von Sendungen an die Adresse eines beliebigen Vertrags vollständig zu blockieren, und das Werfen von eingefrorenem Geld ist dumm.
Nun ein wenig darüber, warum die staatliche Versionsnummer benötigt wird. Dies ist die Zahl, die sich mit jeder Änderung der wesentlichen Bedingungen des Rechtsstreits erhöht, z. B. des Wortlauts des Rechtsstreits, der Höhe der Kommissionen oder der Geldbußen des Schiedsrichters. Wenn jemand den Streitbedingungen zustimmt, sieht er 1) den aktuellen Stand der Daten; 2) sendet einen Anruf an die Vertragsmethode, die die Annahme der Bedingungen registriert. Wenn zwischen diesen beiden Ereignissen eine der Parteien (höchstwahrscheinlich der Eigentümer) den Parameter des Vertrags ändert, stimmen Sie der anderen Version der Daten zu. Zum Beispiel betritt ein Schiedsrichterkandidat die Vertragsschnittstelle auf smartz.io und sieht, dass ihm angeboten wird, einen Streit über 10 Ether (heute sind es ungefähr 3.000 USD) für eine Provision von 1% (ungefähr 30 USD) zu beurteilen. Der Kandidat stimmt dem gerne zu und sendet die Bestätigungstransaktion an das Netzwerk. Der unehrliche Eigentümer sieht im Mining-Pool die Rohtransaktion des Schiedsrichters und sendet seine eigene: Ändert die Vergütung des Schiedsrichters um 0%. Ein Betrüger stellt den Gaspreis über den Durchschnitt und mit einiger Wahrscheinlichkeit können Bergleute seine Transaktion früher abwickeln. Ein solcher Angriff wird Front Running Attack genannt. Die Statusversionsnummer schützt davor. Wenn die Eigentümer-Schädlings-Transaktion früher verarbeitet wird, ändert sich die Versionsnummer der Daten im Vertrag. Der Schiedsrichter in seiner Transaktion hat die Versionsnummer der Daten um eins weniger gesendet. Daher wird der Vertrag den Abschluss der Transaktion verweigern, es wird ein Rollback durchgeführt. Der Schiedsrichter überprüft die neuen Bedingungen und verweigert entweder die Teilnahme oder stimmt zu, indem er die aktuelle Versionsnummer der Daten sendet.
Bei der Entwicklung eines Äthervertrags muss man viel über schlechte Szenarien nachdenken. Was passiert, wenn der Vertragsinhaber beschließt, den Schiedsrichter zu berauben? Und was ist, wenn sich der Schiedsrichter als unehrlich herausstellt? Was ist, wenn der Gegner tatsächlich ein Hacker ist? Oder sind alle drei bestrebt, sich gegenseitig zu täuschen, weil die Einsätze im Streit hoch genug sind? Darüber hinaus müssen mögliche Verstöße gegen den normalen Streitverlauf berücksichtigt werden, wenn die Sendung im Vertrag gesperrt wird und selbst der Eigentümer keinen Zugang dazu erhält. Beispielsweise ergab sich bereits während der Umsetzung die Möglichkeit, den Streit für unlösbar zu erklären. Aus dem gleichen Grund ist die Reihenfolge der Streitphasen wie folgt: Eigentümerrate -> Wahl des Schiedsrichters -> Rate des Gegners. Es kann vorkommen, dass der Gegner seine Teilnahme nicht bestätigt hat und die Frist weit in der Zukunft liegt. Um kein langfristiger Investor zu werden, kann der Schiedsrichter die Teilnahme verweigern, jedoch nur, bis der Gegner eine Wette abgeschlossen hat. Und es gibt viele solche Nuancen im Vertrag. Die gute Nachricht ist, dass dies einmal programmiert und verwendet werden muss. Wenn der Streit als Papiervertrag formalisiert würde, müssten in solchen Grenzsituationen viele Menschen immer wieder auf jeden Punkt eingehen und sich untereinander darauf einigen, wie er zu interpretieren ist. Mit der Blockchain können Sie die Bedingungen wie im Vertrag festlegen, aber die Interpretation der Bedingungen der virtuellen Maschine zuweisen und immer nur ein Ergebnis ihrer Ausführung haben.
Man kann das Problem eines interessierten Schiedsrichters nicht ignorieren. In unserem Vertrag trifft der Schiedsrichter die Entscheidung allein. Für einfache Situationen ist dies ausreichend, aber manchmal ist das Risiko des persönlichen Interesses des Schiedsrichters nicht akzeptabel. Ein Ausweg besteht darin, in die Vertragslogik die Möglichkeit aufzunehmen, mehrere Schiedsrichter hinzuzufügen und durch Abstimmung eine Entscheidung zu treffen. Dies ist eine ziemlich komplizierte Logik, insbesondere wenn Sie sie für alle möglichen Streitigkeiten und ihre Teilnehmer universell machen möchten. Die gute Nachricht ist jedoch, dass die gesamte Logik komplexer kollektiver Schiedsgerichtsbarkeit in einen separaten intelligenten Vertrag verschoben werden kann. Die Adresse des Vertrages, den der Inhaber des Rechtsstreits als Schiedsrichter registriert. Aus Sicht der Schnittstelle sollte ein solcher Vertrag in der Lage sein, mehrere Methoden aus dem Streitvertrag aufzurufen: Zustimmung zur Beurteilung des Streits, Verweigerung einer solchen Zustimmung, drei Versionen der Entscheidung und eine Sendemethode. Innerhalb des Schiedsvertrags kann die Entscheidungslogik der meisten Schiedsrichter verwendet werden, ähnlich wie im Multisignature Wallet-Vertrag, der auch auf Smartz.io als Konstruktor verfügbar ist.
Für einen Teil der Streitigkeiten ist es möglich, die Gruppe der Schiedsrichter durch einen Vertrag mit einem oder mehreren Orakeln zu ersetzen. Oder überlegen Sie sich einen anderen Weg, um beispielsweise das Argument mit einer zufälligen Lösung in Roulette umzuwandeln. Und das alles - ohne den Code des Vertrags des Streits zu ändern und ohne die Logik seiner Arbeit zu komplizieren.
Testen
Ich möchte ein paar Worte zum Testen sagen. Jeder weiß, dass Testautomatisierung gut ist. Viele schreiben tatsächlich Tests für ihren Code. Einige Leute verwenden den TDD-Ansatz in der Entwicklung - die lange und bekannte testgetriebene Entwicklung. Der Hauptunterschied zwischen TDD und einfachen Tests besteht darin, dass Tests früher als Code geschrieben werden. Auf diese Weise können Sie den Vertragscode von außen betrachten, mögliche Probleme erkennen und im Voraus lösen. Darüber hinaus können Sie mit TDD bei korrekter Verwendung die Arbeitslogik erheblich ändern, wenn sie plötzlich benötigt wird. Die richtige Verwendung ist mit Erfahrung verbunden. TDD ist keine Wunderwaffe, wie Sie vielleicht denken, wenn Sie zahlreiche Materialien zu diesem Thema lesen. Gleichzeitig ist es besorgniserregend, dass die Entwicklungshandbücher in Truffle und Node.js die Verwendung von TDD für die Solidity-Entwicklung überhaupt nicht demonstrieren. Anfänger erwerben schlechte Gewohnheiten und leiden am Ende sehr.
TDD impliziert, dass das Projekt viele Tests enthält. Beispielsweise ist der Streitvertragscode 325 Zeilen lang und der Testcode für diesen Vertrag 2144 Zeilen lang. Irgendwann wurden die Tests groß genug, damit der Trüffeltest mehr als eine Minute dauerte. Der Entwicklungszyklus in TDD umfasst häufige Testläufe nach geringfügigen Codeänderungen. Damit die Entwicklung nicht zu einer Qual wurde, musste ich Truffle beibringen, nur einen Teil der Tests durchzuführen, die dem übertragenen regulären Ausdruck entsprechen.
Unter der Haube verwendet Truffle das Mokka-Framework zum Testen. Mocha kann den Start von Tests in regelmäßigen Abständen filtern, aber Truffle kann den entsprechenden Parameter --grep nicht sofort über die Befehlszeile übergeben. Unter Ausnutzung der Tatsache, dass die Truffle-Konfiguration normaler JavaScript-Code ist, habe ich eine Analyse der Befehlszeilenargumente und die Bildung von Parametern für Mocha eingegeben. Die Konfiguration, die ich als Ergebnis erhalten habe, ist im GitHub-Projekt verfügbar. Die Implementierung ist nicht allzu hübsch, funktioniert aber und spart viel Zeit.
Zusammenfassung
Der Streitvertrag wurde als sehr einfach in seiner Funktionalität konzipiert, aber dank TDD und Analyse möglicher Angriffsmethoden entwickelte er sich zu einer etwas umfassenderen Implementierung von Beschränkungen. Die offensichtlichen Mängel des Vertrags hängen mit der alleinigen Entscheidung des Schiedsrichters zusammen. Sie können jedoch ohne Änderung des Kodex des Streitvertrags beseitigt werden, wenn das Abstimmungssystem mehrerer Schiedsrichter in einem separaten intelligenten Vertrag implementiert ist. Die Verwendung von Orakeln für Streitigkeiten, bei denen dies möglich ist, wird auf die gleiche Weise realisiert.
Der BetMe-Streitvertrag kann mithilfe einer vordefinierten Vorlage auf der Smartz- Plattform getestet und ausgeführt werden. Dies erfordert eine Metamask-Erweiterung für den Desktop-Browser oder Trust Wallet für mobile Geräte. Außerdem wird der Quellcode des Vertrags selbst auf GitHub veröffentlicht.
Es ist erwähnenswert, dass der Einsatz von Blockchain-Technologien heutzutage hauptsächlich auf Kryptowährungen und die Ausgabe von Token für ICOs zurückzuführen ist. Dezentrale autonome Organisationen (DAOs) sind noch nicht Realität geworden. Wenn Sie sich jedoch vorstellen, wie sich die Streitvertragssysteme weiterentwickeln werden, können Sie sich eine Liste von Schiedsrichtern vorstellen, deren Bewertung beispielsweise auf dem Token Curated Registry basiert. Nach Abschluss der Streitigkeiten könnten ihre Teilnehmer für oder gegen die Schiedsrichter stimmen, mit denen sie sich befasst haben, und ihre Position in der Rangliste ändern.
Einerseits ist der BetMe-Streitvertrag ein praktisch anwendbares autarkes Element. Andererseits kann es durchaus zu einem der Bausteine werden, aus denen sich im Laufe der Zeit das Ökosystem dezentraler Organisationen bilden wird.
Links