So erstellen Sie Zertifikate in der Ethereum-Blockchain - Teil 1

In diesem Lernprogramm erstellen Sie eine dezentrale App, mit der Benutzer intelligente Zertifikate erstellen können.

Wenn Sie Ihre Worte in die Blockchain schreiben, ist sie unveränderlich. Sie sind nicht auf Regierungen oder Institutionen angewiesen, um Ihre Aufzeichnungen zu führen. Stattdessen verlassen wir uns auf über 16.000 Knoten auf der ganzen Welt, um das Netzwerk zu sichern, das Leuten wie Ihnen oder mir gehört.

Wir werden Heiratsurkunden als unser Arbeitsbeispiel verwenden. Wir werden diesen Zertifikatsverträgen auch einige besondere Fähigkeiten verleihen, d. H. Eine Heiratsurkunde, die Geschenke annehmen kann.

Abb: Ein funktionierendes Beispiel für eine Heiratsurkunde von Ethereum bei forevermore.io.

Hinweis: Sie können dieses Lernprogramm problemlos an andere Themen anpassen. Lassen Sie Ihre Benutzer beispielsweise Abschlusszertifikate erstellen oder sogar ihre eigenen Kunstwerke zertifizieren - der Himmel ist die Grenze!

Am Ende dieses Lernprogramms erfahren Sie, wie Sie einfache intelligente Verträge für die Ethereum-Blockchain erstellen, mit ihnen interagieren und sie bereitstellen.

Umgebungs-Setup

  1. Download Metamask: ein Online-Portemonnaie-Handler [5 min]. Machen Sie sich noch keine Gedanken über den Kauf von echten Ethern, da Sie diese zuerst auf Testnetzen bereitstellen können.
  2. Access Remix: um die Online Solidity IDE zu benutzen [1 min]

Allgemeine DApp-Architektur

Hier ist eine grafische Darstellung dessen, was wir tun werden. Wir verwenden ein Factory-Muster, um einen Factory-Vertrag zu erstellen, der wiederum unsere Zertifikatverträge generiert.

In Teil 1 dieses Tutorials konzentrieren wir uns nur auf den Zertifikatvertrag.

Kommt Ihnen diese Stack-Analogie bekannt vor?

  • Auf hohem Niveau kann man sich die Blockchain als Alternative zu herkömmlichen Backends und Servern vorstellen. Wenn wir also diese Verträge erstellen, entwerfen wir tatsächlich die Datenstrukturen und Datenbeziehungen unserer Anwendung.
  • Wir empfehlen das Werksmuster. Dies erleichtert Ihnen das Erstellen und Verfolgen einer bestimmten Vertragsklasse. Mehr dazu in Teil 2.

Teil 1 - Erstellen Sie den Ehevertrag

In diesem Tutorial müssen Ihre Eheverträge folgende Anforderungen erfüllen:

  • Speichern Sie die Details des Vertragsinhabers / Erstellers
  • Speichern Sie die Namen und Eheversprechen des Paares
  • Lassen Sie die öffentlichen Zuschauer „eine Hochzeitsglocke läuten“, die Ethers zum intelligenten Vertrag verschenkt
  • Lassen Sie den Vertragsinhaber die begabten Ether in seine eigene Brieftasche ziehen

Lass uns anfangen. Erstellen Sie in Remix eine Datei mit dem Namen Marriage.sol mit den folgenden Angaben:

// Dies gibt die Solidity-Compiler-Version an, die generiert wird
// Opcodes und ABI, die in der Blockchain gespeichert werden sollen
Pragma Solidität ^ 0,4,19;
Vertragsheirat {
    // Hier deklarieren Sie Ihre globalen Variablen
    Konstruktor () öffentlich {
        // Hier instanziieren Sie Ihren Vertrag
    }
}

Beachten:

  • "Public" ist ein Funktionsmodifikator, mit dem jeder eine neue Instanz Ihres Ehevertrags erstellen kann
  • Stellen Sie sicher, dass Sie die neueste stabile Compiler-Version verwenden.

Speichern Sie den Eigentümer des Ehevertrags

Alle Brieftaschen und Smart-Verträge in Ethereum haben Adressen, die als Hauptkennzeichen dienen.

In Ihrer DApp möchten Sie den Eigentümer jedes Heiratsvertrags speichern können, der erstellt wird. Auf diese Weise können Sie den Besitzern besondere Fähigkeiten verleihen - dazu später mehr.

  1. Innerhalb des Vertrags Marriage {definieren Sie eine globale Variable, in der die Adresse des Eigentümers gespeichert wird.
// Setze den Eigentümer public var, damit jeder sehen kann, wem der Vertrag gehört
Adresse öffentlicher Eigentümer;

Hinweis: "Adresse" ist ein Datentyp in Solidity. Adressen können entweder einen intelligenten Vertrag oder eine persönliche Brieftasche identifizieren.

2. Speichern Sie als Nächstes die Adresse jedes Mal, wenn ein neuer Zertifikatvertrag instanziiert wird. Ändern Sie Ihre Konstruktorfunktion wie folgt:

Konstruktor (Adresse _Besitzer) public {
    owner = _owner;
}

Beachten:

  • Wir verlassen uns auf den zukünftigen Factory-Vertrag, um diese Konstruktorfunktion aufzurufen und die Adresse des Eigentümers weiterzugeben.
  • Wenn wir nicht mit Werksverträgen arbeiten, haben Sie den Eigentümer auf "msg.sender" festgelegt. Dies ist die Adresse, an der dieser Vertrag erstellt werden soll.

Speichern Sie die Namen und Eheversprechen des Paares

Hier können Sie kreativ werden und Ihren Smart-Vertrag ändern, um eine andere Art von legalem Vertrag oder Zertifikat darzustellen!

  1. Fügen Sie die folgenden globalen Variablen hinzu:
Vertragsheirat {
// Besitzeradresse
    Adresse öffentlicher Eigentümer;
// Details zum Ehevertrag
    string public leftName;
    string public leftVows;
    string public rightName;
    string public rightVows;
    nicht öffentliche Ehe.
    Konstruktor (Adresse _owner, Zeichenfolge _leftName, Zeichenfolge _leftVows, Zeichenfolge _rightName, Zeichenfolge _rightVows, uint _date) public {
        owner = _owner;
        leftName = _leftName;
        leftVows = _leftVows;
        rightName = _rightName;
        rightVows = _rightVows;
        MarriageDate = _date;
    }
}

Hinweis: Solidity bietet neben "address" auch andere statische Datentypen wie "string" und "uint". Hier erfahren Sie, wie Ethereum Daten speichert.

Glückwunsch! Sie haben ein Eheklassenobjekt erstellt. Dieser intelligente Vertrag wird die Vorlage für die Instanziierung zukünftiger Eheverträge in der Blockchain sein.

Ein statischer Ehevertrag, bei dem nur Text angezeigt wird, macht keinen Spaß. Codieren wir etwas Logik und Automatisierung.

Wäre es nicht cool, wenn Ihr Ehevertrag auch ein Hochzeitsregister sein kann?

Lassen Sie die Leute Ether zum Vertrag schenken

Wir haben bereits erwähnt, dass Smart Contracts Geld speichern und Transaktionen abwickeln können. Lassen Sie uns dies sinnvoll nutzen. Sie möchten jedem, der Ihren Ehevertrag öffentlich ansieht, die Möglichkeit geben, ihn zu verschenken. Nennen wir diese Funktion "Läuten einer Hochzeitsglocke".

  1. Erstellen Sie eine Funktion namens ringBell (). Ethereum bietet eine spezielle Bezahlfunktion, um solche Geldtransaktionen abzuwickeln:
// ringBell ist eine kostenpflichtige Funktion, mit der Personen die Ehe des Paares feiern können, indem sie Ethers an den Ehevertrag senden
Funktion ringBell () public zahlbar {...}

Hinter den Kulissen erhalten Solidity-Funktionen wichtige Variablen:

  • msg.value: Enthält den vom Absender festgelegten Betrag. Eine Funktion vom Typ "Bezahlbar" speichert diesen Nachrichtenwert automatisch in einem eigenen Hauptbuch.
  • msg.sender: ist die Adresse desjenigen, der Ihnen Geld geschickt hat.

2. Seien wir gierig und nutzen Sie unser Wissen über msg.value, um einen minimalen Geschenkwert festzulegen. Wie wäre es mit einem minimalen Geschenk von .0001 Äther (~ 5 Cent)?

// ringBell ist eine kostenpflichtige Funktion, mit der Personen die Ehe des Paares feiern können, indem sie Ethers an den Ehevertrag senden
Funktion ringBell () public zahlbar {
    require (msg.value> .0001 ether);
}

Beachten:

  • require () wird verwendet, um Benutzereingaben und andere bedingte Prüfungen zu validieren, die häufig fehlschlagen.
  • Wenn die Bedingungen nicht erfüllt sind, wird die Transaktion des Benutzers sofort angehalten.
  • Dies ist schön, da alle verbleibenden Gasmengen (d. H. Transaktionsgebühren) dem Absender sofort erstattet werden, wenn seine Anfrage fehlschlägt.

Lassen Sie Vertragsinhaber ihr Geld abheben

  1. Deklarieren Sie eine collect () -Funktion, mit der die Ether aus einem intelligenten Vertrag in die Brieftasche eines Benutzers übertragen werden.
Funktion collect () {
    owner.transfer (Adresse (diese) .balance);
}

Beachten:

  • "Dies" bezieht sich auf den Vertrag selbst. Mit "owner.transfer (…)" wird der gesamte Kontostand des Vertrags in die Brieftasche des Eigentümers verschoben.

Nehmen wir uns hier einen Moment Zeit, um über Sicherheit nachzudenken. Sie möchten sicherstellen, dass nur der Eigentümer des Vertrags zurücktreten kann.

Eine Möglichkeit, dies zu handhaben, ist "require (owner == msg.sender)". Möglicherweise müssen Sie diese Überprüfung "Eigentümer erforderlich" jedoch häufig durchführen, da Sie weitere Funktionen für Eigentümer hinzufügen möchten. Die Lösung?

Refactor-Bedingungsprüfungen in Funktionsmodifikatoren

Es wird als bewährte Methode angesehen, require () - Checks in ihre eigenen Modifikatorfunktionen umzugestalten.

  1. Erstellen Sie einen Funktionsmodifikator namens "onlyOwner":
// Wiederverwendbare Modifikatorfunktion
modifier onlyOwner () {
    require (msg.sender == owner);
    _;
}
// Um ​​einen Modifikator zu verwenden, hängen Sie ihn an das Ende des Funktionsnamens an
Funktion collect () nur externBesitzer {
    owner.transfer (Adresse (diese) .balance);
}

Beachten:

  • "_" Ist ein Platzhalter für den Inhalt der Feature-Funktion, die Sie mit onlyOwner () ändern.
  • Wir verwenden den externen Funktionsmodifikator, um dem Eigentümer einige Transaktionsgebühren zu ersparen.

Erstellen Sie zum Schluss eine Hilfsfunktion für unser Frontend:

  1. Erstellen Sie eine Funktion, mit der nur die Eigentümer des Vertrags überprüfen können, wie viel Ether in seinem Vertrag enthalten ist:
// Nur den Eigentümern erlauben, den Kontraktsaldo zu überprüfen
Funktion getBalance () nur öffentliche AnsichtBesitzer gibt zurück (uint) {
    Rücksendeadresse (diese) .balance;
}

Das ist es! Sie haben Ihre erste intelligente Vertragsklasse erstellt.

Sie können Remix jetzt verwenden, um intelligente Eheverträge in der Blockchain zu instanziieren. Jetzt müssen Sie nur noch den Fabrikvertrag und eine einfache Benutzeroberfläche erstellen.

Nächste Schritte

  • Fahren Sie mit Teil II fort - wir werden als nächstes an den Factory-Verträgen arbeiten und aus Ihrem Smart-Vertrag eine echte dezentrale App machen.
  • Möchten Sie weiterspringen? Schauen Sie sich hier die endgültige App und hier das komplette Open-Source-Projekt an.
  • Credits: Daniel (Paarkodierer), Stephen (Tutorials)