Block Orakel basiertes zufälliges Orakel basierend auf digitaler Signatur

Von der Idee bis zur Implementierung: Wir modifizieren das vorhandene digitale Signaturschema auf einer elliptischen Kurve so, dass es deterministisch ist, und stellen auf seiner Grundlage die Funktionen zum Erhalten von Pseudozufallszahlen bereit, die innerhalb der Blockchain verifiziert wurden.



Idee


Im Herbst 2018 wurden die ersten intelligenten Verträge in der Waves-Blockchain aktiviert. Sofort stellte sich die Frage nach der Möglichkeit, Pseudozufallszahlen zu erhalten , denen Sie vertrauen können.


Ich brach den Kopf über dieses Problem und kam schließlich zu dem Schluss: Jede Blockchain ist eine Zelle, es ist unmöglich, eine vertrauenswürdige Entropiequelle in einem geschlossenen System zu erhalten.


Trotzdem gefiel mir eine Idee: Wenn ein zufälliges Orakel die Signatur von Benutzerdaten zu einem deterministischen Algorithmus macht, kann der Benutzer eine solche Signatur immer mit dem öffentlichen Schlüssel überprüfen und sicher sein, dass der empfangene Wert eindeutig ist. Das Orakel hat bei allem Wunsch keine Macht, etwas zu ändern, der Algorithmus liefert ein klares Ergebnis. Tatsächlich erfasst der Benutzer das Ergebnis, weiß es jedoch erst, wenn das Orakel es veröffentlicht. Es stellt sich heraus, dass Sie dem Orakel überhaupt nicht vertrauen können, sondern das Ergebnis seiner Arbeit überprüfen können. Im Falle einer erfolgreichen Verifizierung kann eine solche Signatur als Entropiequelle für eine Pseudozufallszahl angesehen werden.


Die Waves-Blockchain-Plattform verwendet das EdDSA- Signaturschema , eine Variante von Ed25519 . In diesem Schema besteht die Signatur aus den Werten von R und S, wobei R von einem Zufallswert abhängt und S auf der Grundlage der zu signierenden Nachricht, des privaten Schlüssels und derselben Zufallszahl wie R berechnet wird. Es stellt sich heraus, dass es keine Eins-zu-Eins-Abhängigkeit für dieselbe gibt Eine benutzerdefinierte Nachricht hat viele gültige Signaturen.


Offensichtlich kann eine solche Signatur in ihrer reinen Form nicht als Quelle für Pseudozufallszahlen verwendet werden, da sie nicht deterministisch ist und daher leicht von dem Orakel manipuliert werden kann.


Aber wie sich herausstellte, ist es tatsächlich möglich, es zu bestimmen.


Ich hatte große Hoffnungen auf eine getestete Zufallsfunktion (VRF) , aber nachdem ich das Material studiert hatte, musste ich diese Option ablehnen. Obwohl VRF eine deterministische Version der Signatur und ihres Beweises bietet, hat der Algorithmus eine seltsame Stelle, die ein Schwarzes Loch für die Manipulation des Orakels öffnet (dies ist eine falsche Aussage, siehe Update ). Bei der Berechnung des Wertes von k ( Abschnitt 5.1 ) wird nämlich ein privater Schlüssel verwendet, der dem Benutzer unbekannt bleibt. Dies bedeutet, dass der Benutzer die Richtigkeit der Berechnung von k nicht überprüfen kann, so dass das Orakel einen beliebigen Wert von k verwenden kann und gleichzeitig eine Datenbank mit Entsprechungen k und signierten Daten unterhält immer in der Lage sein, das richtige Ergebnis aus Sicht von VRF neu zu berechnen. Sie werden eine VRF-basierte Zeichnung sehen, ohne den privaten Schlüssel offenzulegen. Sie können sich das vorstellen: Zeigen Sie die Notwendigkeit auf oder öffnen Sie den Schlüssel oder schließen Sie ihn von der Berechnung von k aus. Der private Schlüssel öffnet sich dann automatisch, wenn die erste Signatur erscheint. Im Allgemeinen, wie bereits erwähnt, ein seltsames Schema für ein zufälliges Orakel.


Mit ein wenig Nachdenken und der Unterstützung lokaler Analysten wurde der VECRO-Workflow geboren.


VECRO ist eine Abkürzung für Verifizierbare elliptische Kurve Zufälliges Orakel, was auf Russisch ein geprüftes zufälliges Orakel auf elliptischen Kurven bedeutet.


Alles stellte sich als recht einfach heraus. Um Determinismus zu erreichen, ist es notwendig, den Wert von R vor dem Erscheinen einer signierten Nachricht festzulegen. Wenn R fest ist und Teil einer signierten Nachricht ist, die zusätzlich garantiert, dass R in der signierten Nachricht selbst festgelegt ist, wird der Wert von S durch die Benutzernachricht eindeutig bestimmt und kann daher als Quelle für Pseudozufallszahlen verwendet werden.


In einem solchen Schema spielt es keine Rolle, wie R festgelegt ist, es bleibt im Verantwortungsbereich des Orakels. Es ist wichtig, dass S vom Benutzer eindeutig bestimmt wird, aber sein Wert ist unbekannt, bis das Orakel es veröffentlicht. Alles wie wir wollten!


Wenn Sie von festem R sprechen, beachten Sie, dass wiederverwendetes R beim Signieren verschiedener Nachrichten den privaten Schlüssel im EdDSA-Schema eindeutig anzeigt. Für den Besitzer des Orakels ist es äußerst wichtig, die Möglichkeit auszuschließen, R zum Signieren verschiedener Benutzernachrichten wiederzuverwenden. Das heißt, während einer Manipulation oder Verschwörung riskiert das Orakel immer, seinen privaten Schlüssel zu verlieren.


Insgesamt muss das Orakel Benutzern zwei Funktionen bereitstellen: eine Initialisierung, die den Wert von R festlegt, und eine Signatur, die den Wert von S zurückgibt. Darüber hinaus ist das Paar R, S eine regelmäßig verifizierte Signatur einer Benutzernachricht, die einen festen Wert von R und beliebige Benutzerdaten enthält.


Es kann argumentiert werden, dass dieses Schema für die Blockchain nichts anderes als ein normales Commit-Disclosure-Schema ist . In der Tat, ja, das ist sie. Aber es gibt ein paar Nuancen. Erstens arbeitet das Orakel bei allen Vorgängen immer mit demselben Schlüssel, zum Beispiel ist es bequem, es in Verträgen zu verwenden. Zweitens besteht die Gefahr, dass der private Schlüssel durch das Orakel aufgrund eines falschen Verhaltens verloren geht. Das Orakel ermöglicht es Ihnen beispielsweise, Proben des Ergebnisses zu erstellen. Dann reicht es aus, nur zwei Tests durchzuführen, um den privaten Schlüssel herauszufinden und vollen Zugriff auf die Brieftasche zu erhalten. Drittens ist die Signatur, die in der Blockchain, die eine Quelle der Zufälligkeit ist, nativ verifiziert ist, wunderschön.


Ein halbes Jahr lang war die Idee der Implementierung in meinem Kopf, bis es schließlich eine Motivation in Form eines Stipendiums von Waves Labs gab . Mit einem großen Zuschuss geht eine große Verantwortung einher, dann muss das Projekt sein!


Implementierung


In diesem Projekt wurde VECRO in der Waves-Blockchain im Request-Response-Modus mithilfe von Übertragungstransaktionen zwischen dem Benutzer und dem Orakel implementiert . Gleichzeitig wird auf dem Oracle-Konto ein Skript installiert, das den Vorgang streng nach der oben beschriebenen Logik überwacht. Oracle-Transaktionen werden überprüft, um die gesamte Benutzerinteraktionskette wiederherzustellen. Alle vier Transaktionen sind an der Überprüfung des Endwerts beteiligt. Der Smart-Vertrag hat sie an einen strengen Überprüfungsthread gebunden, Schritt für Schritt alle Werte überprüft und keinen Raum für Manipulationen gelassen.


Noch einmal verschoben und klarer gemacht werden. Das Orakel funktioniert nicht nur nach dem vorgeschlagenen Schema. Seine Arbeit wird auf Blockchain-Ebene durch einen fest etablierten Smart-Vertrag vollständig kontrolliert. Ein Schritt nach links, und die Transaktion wird einfach nicht funktionieren. Wenn die Transaktion in die Blockchain fällt, muss der Benutzer nicht einmal etwas überprüfen. Hunderte von Netzwerkknoten haben bereits alles für ihn überprüft.


Momentan läuft ein VECRO im Hauptnetzwerk von Waves (Sie können Ihr eigenes ausführen, es ist nicht schwierig, sehen Sie sich nur das Konfigurationsbeispiel an ). Der aktuelle Code funktioniert in PHP (in WavesKit , über das ich zuvor gesprochen habe ).


Um den Orakelservice nutzen zu können, müssen Sie:


  • Fix R;
    • Senden Sie mindestens 0,005 Wellen an den Orakel-Alias ​​init @ vecr.
    • Holen Sie sich den R-Code im Anhangsfeld bei der Übertragung von 1 R-vecr-Token vom Orakel an den Benutzer.
  • Holen Sie sich eine Unterschrift
    • Senden Sie mindestens 0,005 Wellen an den Oracle-Alias ​​random @ vecr, und geben Sie IMMER den zuvor empfangenen R-Code und zusätzliche Benutzerdaten im Anhangsfeld an.
    • Holen Sie sich den S-Code im Anhangsfeld bei der Übertragung von 1 S-vecr-Token vom Orakel an den Benutzer.
  • Verwenden Sie S-Code als Pseudozufallszahlenquelle.

Die Nuancen der aktuellen Implementierung:


  • An das Orakel gesendete Wellen werden als Provision für eine umgekehrte Transaktion an den Benutzer verwendet, bis zu maximal 1 Welle.
  • R-Code ist die Verkettung des Bytes des Zeichens 'R' und des 32-Byte-Werts von R in der Base58-Codierung;
  • R-Code im Anhang sollte der erste sein, Benutzerdaten kommen nach R-Code;
  • S-Code ist die Verkettung des Bytes des S-Zeichens und des 32-Bytes des S-Werts in der Base58-Codierung.
  • S ist das Ergebnis der Modulo-Division, daher kann S nicht als vollwertige 256-Bit-Pseudozufallszahl verwendet werden (diese Zahl kann als maximal 252-Bit-Pseudozufallszahl betrachtet werden);
  • Die einfachste Möglichkeit besteht darin, den Hash aus dem S-Code als Pseudozufallszahl zu verwenden.

Ein Beispiel für den Erhalt von S-Code:



Aus technischer Sicht ist das Orakel vollständig einsatzbereit, Sie können es sicher verwenden. Aus Sicht der Nutzung durch einen normalen Benutzer reicht eine bequeme grafische Oberfläche nicht aus, dies muss warten.


Gerne beantworte ich Fragen und nehme Kommentare entgegen, danke.


Update 8. Mai 2019


War falsch über VRF. Ja, die ECVRF-Signatur kann zwar nicht als Quelle für eine Pseudozufallszahl verwendet werden, wird jedoch nicht für diesen Zweck verwendet. Eine Signatur ist erforderlich, um einen Beweis für die Eindeutigkeit des Gamma-Werts zu erstellen ( Abschnitt 5.3 , Schritt 6). Der mit der Signatur verifizierte Gamma-Wert ist jedoch bereits als Quelle einer Pseudozufallszahl beteiligt ( Abschnitt 5.2 , Schritt 5). Dank an Oleg Taraskin Crittografo für den Hinweis an dieser Stelle gebe ich meinen Fehler zu. ECVRF hat jedes Recht auf Leben.


Leider gibt es immer noch keine Möglichkeit, ECVRF auf der Ebene der Waves-Blockchain zu verwenden, da in intelligenten Verträgen nicht die erforderlichen mathematischen Geräte vorhanden sind.


Wenn diese Funktionalität oder RSA-Unterstützung verfügbar wird, können Sie neue Orakel schreiben. Das VECRO-Schema nimmt in jedem Fall eine eigene Nische ein und ermöglicht es Ihnen, ohne zusätzliche Funktionen zu arbeiten.

Source: https://habr.com/ru/post/de449340/


All Articles