Eines der Hauptziele, die Blockchain-basierte Projekte erreichen wollen, ist die Verifizierung von Daten. Live-Beispiele finden Sie unter der digitalen Identität sowie der Online-Dokumentenspeicherung und -Prüfung. Tatsächlich ist in jedem dieser Fälle eine Überprüfung des Aktions-/Transaktionsinitiators erforderlich, um die Person oder das Unternehmen zu bestätigen. Wenn die Person beispielsweise über ein digitales Ausweisdokument verfügt, ist es von entscheidender Bedeutung, den Besitz sicherzustellen. Somit ist es ein hervorragendes Beispiel für ein Problem der Datenüberprüfbarkeit. Sehen wir uns die einfachste Form der Lösung an – eine digitale Signatur, deren Prüfung einer der entscheidenden Punkte bei der Entwicklung intelligenter Verträge ist.
Der Ansatz ist einfach:
1) Das System generiert eine Nachricht nach für alle bekannten Regeln
2) Der Unterzeichner erhält die Nachricht und fügt einen bestimmten Satz von Symbolen hinzu – digitale Signatur, Code, der aus der Nachricht durch einen privaten Schlüssel erstellt wird
3) Die generierte Signatur wird nun an den Vertrag gesendet, wo sie zerlegt wird, um die Adresse des Unterzeichners abzurufen.
Solidity bietet Ihnen den ECDSA-Algorithmus zur Signaturgenerierung und weiteren Zerlegung. Wir müssen nicht tief in den Algorithmus selbst eintauchen (die notwendigen Informationen finden Sie hier). in den entsprechenden Quellen). Wir müssen lediglich wissen, dass ECDSA ein Beispiel für asymmetrische Kryptographie ist, bei der der erste Benutzer eine Signatur mit seinem privaten Schlüssel erstellt und der zweite Benutzer einen Standardalgorithmus anwendet, um den öffentlichen Schlüssel des Unterzeichners abzurufen. Dadurch kann die Quelle der Signatur überprüft werden. Konzentrieren wir uns stattdessen auf den praktischen Teil – die Verwendung und Prüfung von Signaturen.
Zunächst müssen wir ein Problem erkennen. Der Vertrag muss beispielsweise eine Aktion ausführen, beispielsweise die Adresse des Anrufers speichern. Obwohl der Vertrag die Speicherung nur dann vorsieht, wenn der Anrufer verifiziert ist, müssen wir sicherstellen, dass niemand seine Adresse ohne Erlaubnis verwenden kann. Um den authentischen Anrufer abzurufen, müssen wir eine Nachricht generieren, sie signieren und sie innerhalb des Vertrags zerlegen.
Sie finden die Standardlösung in der Solidity-Dokumentation (zum Beispiel, im 0.8.4 — die aktuellste stabile Version zum Zeitpunkt des Artikels). Die Dokumente bieten uns den Vertrag, der die folgenden integrierten Funktionen benötigt: Nachrichtengenerierung, Signaturaufteilung und Assemblercode zum Abrufen des Unterzeichners. Das Beispiel zeigt alle notwendigen Methoden und ist ziemlich einfach, hat aber zwei Nachteile: Es mangelt an Universalität und es gibt kein gutes Beispiel für Lösungstests. Deshalb stelle ich meine Version des Codes und (das eigentliche Ziel) – die Teststrategie des Vertrags – zur Verfügung.
Sicher können Sie verwenden die Standard-OpenZeppelin-Bibliothek für den ECDSA-Betrieb, aber Sie werden wieder mit den gleichen Problemen konfrontiert sein – mangelnde Flexibilität und Testansätze. Schauen wir uns also mein Beispiel einer signaturbasierten Logik an. Das komplette finden Sie hier Arbeitsbeispiel in meinem GitHub, aber es gibt wenige Orte, die ich vollständig zeigen möchte.
Zunächst bereiten wir die Nachricht vor. Wie Sie sehen können, besteht es aus zwei gepackten und gehashten Wallet-Adressen:
Der zweite wichtige Codeteil besteht darin, die Nachricht zusammen mit der Standard-Ethereum-Nachricht zu hashen:
Es zeigt, dass die Nachricht innerhalb des Ethereum-Netzwerks gesendet wurde und eine Länge von 32 Byte hat, was keine Zufallszahl ist. Nach vorherigen Operationen haben wir den Hash, der eine Länge von 32 Byte hat. Es ist wichtig, die zusätzliche Hashing-Funktion in dieser Form zu haben, und wir werden die Begründung etwas später besprechen.
Andere Codeteile sind ziemlich Standard. Die Funktion zum Teilen der Signatur ist wie folgt:
und hier ist die Funktion zum Abrufen des Unterzeichners:
Für die externe Schnittstelle verwenden wir die benutzerdefinierte Funktion, die die Signatur und die erforderlichen Argumente empfängt, prüft, ob der Benutzer bereits registriert ist, die Nachricht erstellt und die Signatur überprüft:
Zuerst imitieren wir die Nachricht, die signiert werden muss. Wir werden verwenden ethers.js Bibliothek, die (zusammen mit web3) die am häufigsten genutzte und praktischste Bibliothek. Da es sich um eine Open-Source-Bibliothek handelt, können Sie sie frei erkunden sein Code und seine Dokumente. Außerdem bietet uns diese Bibliothek die perfekte Schnittstelle zum Erstellen der folgenden Nachricht:
Einer der Nachteile von beidem web3 und Ether Der Nachteil der Bibliotheken besteht darin, dass sie nicht über alle Funktionen für die lokale Ganache-Umgebung verfügen, da beide Bibliotheken darauf ausgelegt sind, mit vollständigen Ethererum-Knoten zu arbeiten. Dennoch gibt es einen Ansatz für lokale Tests web3-Kontofunktionalität. Allerdings müssen Sie ein zusätzliches Konto erstellen, das die Singer-Funktionalität implementiert und eine Verbindung zum aktuellen Web3-Anbieter herstellt:
Jetzt haben wir die Nachricht generiert und signiert. Aber das ist nicht alles; Es gibt noch ein paar Dinge, über die man reden kann. Beide Bibliotheken (web3 und ethers) bieten unter der Haube zusätzliches Hashing der Nachricht vor der Signaturerstellung. Außerdem wird die Nachricht nicht nur gehasht, sondern mit der Standard-Ethereum-Nachricht kombiniert, die wir zuvor gesehen haben:
Und deshalb haben wir die zusätzliche Methode zum Vertrag hinzugefügt. Wenn Sie also benutzerdefinierte Nachrichten verwenden, zusätzliches Hashing überspringen usw. möchten, müssen Sie eine benutzerdefinierte Version der Signaturfunktion erstellen. Wir haben den Grund oben besprochen – beide Standardbibliotheken implementieren den typischen Ansatz zum Signieren der Nachricht, der nur durch Überschreiben der Funktionalität geändert werden kann.
Als letzten Schritt führen wir den Test durch und prüfen, ob er ordnungsgemäß funktioniert:
Wir haben die Signaturgenerierung, die generierte Nachricht, die Signaturgenehmigung und -ablehnung getestet. Es handelt sich also um einen ziemlich vollständigen Testsatz für die Verifizierungsfunktionalität.
- Konto
- Action
- Zusätzliche
- Algorithmus
- Alle
- Argumente
- Artikel
- Authentic
- Bit
- Fälle
- Schecks
- Code
- Vertrag
- Geheimschrift
- Strom
- technische Daten
- Entwicklung
- digital
- digitale Identität
- Unterlagen
- Arbeitsumfeld
- Astraleum
- Ethereum Netzwerk
- Gesicht
- Vorname
- Flexibilität
- Setzen Sie mit Achtsamkeit
- unten stehende Formular
- Frei
- voller
- Funktion
- gut
- Hash-
- Hashing
- HTTPS
- ia
- Identitätsschutz
- Information
- IP
- IT
- Wesentliche
- neueste
- Bibliothek
- aus einer regionalen
- mittlere
- Netzwerk
- Fiber Node
- bieten
- Angebote
- Online
- XNUMXh geöffnet
- Open-Source-
- Einkauf & Prozesse
- privat
- Private Key
- Projekte
- Öffentlichkeit
- public Key
- Überprüfen
- Führen Sie
- kompensieren
- Einfacher
- So
- solide
- gespalten
- Lagerung
- speichern
- Strategie
- System
- Test
- Testen
- Tests
- Die Quelle
- us
- Verification
- Wallet
- Wikipedia
- .
- Arbeiten
- Werk