Walkthrough zur Ethereum-Entwicklung (Teil 4: Token und ERCs)

Aus Entwicklersicht sind Token auf Ethereum einfach intelligente Verträge. In der Welt der Getränke könnten sie Kaffee sein und jeder könnte seine eigene Variante herstellen.

Sie haben wahrscheinlich von ERC20, ERC721 oder anderen Standards gehört. Dies sind lediglich eine Reihe grundlegender Funktionen, deren Übernahme die Entwicklergemeinschaft zugestimmt hat. Niemand wird Sie davon abhalten, Ihre eigenen Funktionen zu verwenden und ein Skript zu erstellen, mit dem virtuelle Münzen nach Belieben verwaltet werden.

Ein berühmtes Zitat von Fluch der Karibik trifft in diesem Fall sehr gut zu:

Das Befolgen eines Standards hat jedoch viele Vorteile, die Sie nicht übersehen sollten. Wenn Sie ein Token erstellen, das einem Standard entspricht, weiß jeder, was Ihr Token tut und wie er damit umgehen kann, und vertraut ihm daher ein bisschen mehr. DApps erkennen es wie Mist als Token und zeigen es mit einer speziellen Benutzeroberfläche an. Außerdem finden Sie eine generische Implementierung des bereits von der Community verfassten Token-Smart-Vertrags in einem Framework wie dem von OpenZeppelin, das von vielen Experten gut getestet wurde und Ihnen einen soliden Ausgangspunkt bietet.

In diesem Tutorial schreiben wir ein grundlegendes und unvollständiges ERC20-Token von Grund auf und verwandeln es dann in einen ERC721 (der sich grundlegend unterscheidet), damit wir die Unterschiede zwischen den beiden erkennen können.

Der Grund dafür ist, dass Sie verstehen werden, wie ein Token funktioniert, dass es sich nicht um eine geschlossene Black Box handelt und dass der ERC20, ein akzeptierter Standard, der seit zwei Jahren in Betrieb ist, Fehlerstellen aufweist, die diesbezüglich Fehler aufweisen Sie werden nicht sehen, ob Sie nur einige Befehle ausführen, um Ihr Token sofort aus einem Framework zu erstellen.

Machen wir unser Token

Der ERC20 wurde entwickelt, um fungible Token zu standardisieren, damit sie von anderen Anwendungen wiederverwendet werden können: von Brieftaschen bis zum dezentralen Austausch.

Fungible bedeutet, dass es gegen ein Token des gleichen Typs ausgetauscht werden kann. Mit anderen Worten, alle Token sind identisch (wie Geld ist ein Dollar der gleiche wie jeder andere Dollar). Ein nicht fungibler Token ist ein Token, der einen einzigartigen Vermögenswert darstellt (wie ein Haus, eine Immobilie, ein Kunstwerk usw.). Während ein fungibler Token den Wert an sich hält, ist ein nicht fungibler Token nur die Darstellung eines Vermögenswerts in einem intelligenten Vertrag.

Um ein ERC20-kompatibles Token zu erstellen, müssen die folgenden Funktionen und Ereignisse implementiert werden:

Der Standard bietet nicht den Hauptteil dieser Funktionen. Dies liegt daran, dass Sie sie nach Belieben schreiben können. Es liegt im Standard, Null- / Falschwerte zurückzugeben, wenn Sie einige Funktionen nicht unterstützen möchten.

Hinweis: In diesem Lernprogramm ist es nicht interessant, den Code zu kopieren. Sie profitieren mehr vom Verständnis der Vorgänge. Vollständige Beispiele werden ohnehin am Ende dieses Lernprogramms verlinkt.

Implementierung

Zuerst möchten wir unserem Token einen Namen geben, daher verwenden wir eine öffentliche Variable:

Dann geben Sie ihm ein Symbol:

Und natürlich die Anzahl der Dezimalstellen:

Da Solidity Festkommazahlen nicht vollständig unterstützt, müssen Sie alle Zahlen wie Ganzzahlen darstellen. Ein Wert von “123456” ist entweder “1234,56”, wenn Sie 2 Dezimalstellen verwenden, oder “12,3456”, wenn Sie beispielsweise 4 Dezimalstellen verwenden. Ein Wert von 0 Dezimalstellen ist, wenn Sie nicht möchten, dass Ihr Token “teilbar” ist. Ether, die Kryptowährung von Ethereum, verwendet 18 Dezimalstellen.

Im Allgemeinen würden Sie nicht mehr als 18 Dezimalstellen für Ihr Token verwenden, es sei denn, Sie möchten, dass ein Experte von der anderen Seite der Welt Ihnen sagt, wie dumm Sie sind, und Sie fragen, warum Sie mehr als 18 Dezimalstellen verwenden würden. und sag dir, wie 18 die heilige Zahl ist, weil Ether 18 Dezimalstellen verwendet.

Wir zählen den Gesamtvorrat unseres Tokens und verfolgen, wie viele Token jeder hat:

Natürlich beginnen Sie mit 0 Token, es sei denn, Sie generieren einige im Konstruktor Ihres Token-Smart-Vertrags, wie zum Beispiel:

Die Funktion “totalSupply ()” ist nur ein Getter für die Variable “totalSupply”:

Gleiches gilt für die Funktion „balanceOf ()“:

Nun geschieht die wahre Magie in der Funktion “transfer ()”. Hier kann eine Adresse Token an eine andere senden.

Das ist wirklich der Kern eines ERC20-Tokens.

Die Funktionen “genehmigen ()”, “transferFrom ()” und “zulassen ()” sind Teil dessen, was einen Token-ERC20-kompatibel macht, aber sie sind anfällig.

Wenn eine Adresse eine andere “genehmigen ()”, kann die genehmigte Adresse mithilfe der Funktion “transferFrom ()” einige Token aus dem Kontostand der genehmigenden Adresse in ihrem Namen ausgeben. “Allowance ()” ist nur eine Getter-Funktion, um zu sehen, wie viel eine Adresse aus dem Saldo einer anderen Adresse “transferFrom ()” könnte.

Diese Funktionen stellen tatsächlich Sicherheitsprobleme dar, da die genehmigte Adresse die X-Token des ersten schnell übertragen kann, wenn eine Adresse eine andere Adresse zum Ausgeben von X-Token genehmigt und aus irgendeinem Grund beschließt, diesen Betrag auf Y-Token zu erhöhen oder zu verringern Zulage, bevor die Transaktion zum Ändern der Zulage ausgeführt wird, und nachdem sie ausgeführt wurde, könnte die genehmigte Adresse die Y neu genehmigten Token erneut übertragen. Ich habe in den letzten Teilen gesagt, dass es keine Gewissheit gibt, wann eine Transaktion abgebaut wird, und dass Bergleute leicht manipulieren können, wenn einige Transaktionen ausgeführt werden.

Nun, während einige sicherere “transferFrom ()” – Implementierungen vorgeschlagen wurden, um die Funktion ausfallsicherer zu machen (wie oben beschrieben, besteht der Standard nur aus einer Reihe von Prototypen von Funktionen und erwartetem Verhalten, und es liegt an Ihnen, zu schreiben Die Gremien) Einige andere Vorschläge werden derzeit diskutiert, da der ERC20 andere Mängel aufweist. Zwei dieser Vorschläge sind ERC223 und ERC777.

Das Motiv des ERC223-Vorschlags besteht darin, das Senden von Token an falsche Adressen oder Verträge zu vermeiden, die die Verwendung dieser Token nicht unterstützen, da aufgrund der in der 223. Ethereum-Anfrage für Kommentare beschriebenen Millionen von Dollar verloren gegangen sind. Der ERC777 versucht unter anderem, die Empfangsadresse über das empfangene Token zu informieren. Der ERC777-Vorschlag scheint derzeit die größte Dynamik in der Community zu haben, um den ERC20 zu ersetzen.

ERC721

Nun unterscheidet sich der ERC721 grundlegend vom ERC20 und seiner Familie.

In ERC721 sind Token eindeutig. Der ERC721 wurde vor einigen Monaten vorgeschlagen, und die Implementierung, die ihn berühmt gemacht hat, ist CryptoKitties , ein Spiel, bei dem Menschen virtuelle Katzen sammeln, und diese Katzen werden mit nicht fungiblen Token innerhalb des Smart-Vertrags dargestellt führt das Spiel aus.

Wenn wir nun einen ERC20-Vertrag in einen ERC721-Vertrag umwandeln möchten, müssen wir sehen, wie der zweite die Token verfolgt.

In ERC20 verfügt jede Adresse über ein Token-Gleichgewicht. In einem ERC721-Vertrag enthält jede Adresse eine Liste ihrer Token:

Da Solidity seine Grenzen hat und es keine “indexOf ()” – Methode für Arrays gibt, müssen wir ein Token im Eigentümer-Array manuell verfolgen:

Wir könnten natürlich eine eigene Bibliothek implementieren, die den Index eines Elements findet. Unter Berücksichtigung möglicherweise lang laufender Schleifen ist es jedoch besser, eine Zuordnung zu verwenden.

Und um Token einfach zu verfolgen, können wir natürlich eine Zuordnung hinzufügen, die den Besitzer jedes Tokens anzeigt:

Das ist der Unterschied zwischen der Verwaltung der Token durch die beiden Vorschläge.

Die Funktionen “transfer ()” in einem ERC721-Vertrag legen einen neuen Eigentümer für das Token fest:

Der Code ist länger, aber es sind einfach die notwendigen Schritte, um ein Token zu verschieben.

Ein Punkt, den Sie nicht vergessen sollten, ist, dass der ERC721 auch über die Methoden “genehmigen ()” und “transferFrom ()” verfügt. Daher müssten wir innerhalb unserer Übertragungsfunktion eine weitere Anweisung in unsere Methode “transfer ()” einfügen Daher kann eine genehmigte Adresse für ein Token das Token nicht mehr verschieben, sobald es einen neuen Eigentümer hat, z. B. die folgende:

Prägen

Eine Sache, die sowohl für ERC20- als auch für ERC721-Token gelten kann, ist, dass wir wahrscheinlich mehr fungible Token generieren oder ein neues nicht fungibles Token erstellen möchten. Wir würden dies mit einer Funktion tun, die allgemein als „Mint ()“ bezeichnet wird.

Ein Beispiel für eine solche Funktion ist der folgende Code:

Wir erstellen ein neues Token mit einer beliebigen Nummer. Abhängig von Ihrem Anwendungsfall möchten Sie wahrscheinlich nur bestimmte Adressen autorisieren, um neue Token in Ihrem Vertrag zu prägen.

Eine wichtige Sache, die hier zu beachten ist, ist, dass die Funktion „mint ()“ zwar nicht auf der Schnittstelle der Standards vorhanden ist, wir sie jedoch hinzugefügt haben, genauso wie wir andere Funktionen hinzufügen können, um unser Token zu erweitern und mehr Funktionen hinzuzufügen. Zum Beispiel könnten wir ein System zum Kaufen und Verkaufen von Token für eine Menge Äther oder eine Funktion zum Entfernen von Token hinzufügen, die wir nicht mehr möchten.

Metadaten

Nun haben wir gesagt, dass nicht fungible Token einen Vermögenswert darstellen, daher möchten wir diesen Vermögenswert in den meisten Fällen tatsächlich beschreiben. Wir könnten eine Zeichenfolge wie die folgende verwenden:

Sehen Sie, der Smart-Vertrag ist eher eine Zertifizierung als etwas, das ein Objekt enthält. Sie können ein Auto beispielsweise nicht in einem intelligenten Vertrag aufbewahren, aber Sie können auch das Nummernschild oder einen anderen gesetzlichen Ausweis aufbewahren.

Eine der derzeit am häufigsten verwendeten Techniken für virtuelle Assets ist die Verwendung eines IPFS-Hash als Metadaten. Ein IPFS-Hash ist die Adresse einer in IPFS gespeicherten Datei. Kurz gesagt, IPFS ist wie eine Torrent-Version von HTTP. Wenn eine Datei zu IPFS hinzugefügt wird, ist sie praktisch immer auf mindestens einem der Computer verfügbar, die mit dem IPFS-Netzwerk verbunden sind.

Während auf die Datei über IPFS oder einen HTTP-Link zugegriffen werden kann, ist die „Eigentumsbescheinigung“ in einem intelligenten Vertrag registriert. Dies ist wirklich keine Programmierung, sondern eine neue Anwendung von nicht fungiblen Token. Es hat den Namen “Crypto-Collectibles” und ist momentan heiß.

Nun zurück zu unseren Codes: Die ursprüngliche Diskussion des ERC721-Vorschlags ist ab sofort etwas tot, und das ursprüngliche Poster hat den Thread seit einiger Zeit nicht mehr aktualisiert. Daher gibt es hier eine neue Fortsetzung dieser Diskussion. Es heißt ERC841 und sie haben den Namen nicht fungibler Token in “Taten” geändert.

Es gibt auch einen anderen Vorschlag, ERC821, der neuere und bessere Entwurfsmuster implementieren möchte, die vom ERC223 & amp; ERC777-Vorschläge. ERC821 und ERC841 versuchen, dasselbe Ziel zu erreichen, aber mit einem etwas anderen Ansatz sind beide noch nicht perfektioniert, und Sie können sich der Diskussion um diese beiden potenziellen Standards anschließen, wenn Sie einen wertvollen Beitrag leisten.

Im Github-Repository für diesen Teil finden Sie Beispielimplementierungen von ERC20 und ERC721 (die Sie nicht in der Produktion verwenden sollten):

Alternativ ist es eine gute Idee, sich das OpenZepplin-Framework anzusehen. Es verfügt über ausgezeichnete, (meistens) geprüfte und modulare Smart-Verträge (Natürlich sollten Sie den Inhalt jedes Vertrags lesen, bevor Sie sich für einen entscheiden verwenden).

Damit ist dieser vierte Teil der Serie abgeschlossen. Im nächsten werden wir sehen, wie man eine DApp erstellt.

Wenn Ihnen dieses Tutorial gefallen hat, finden Sie mich unter @dev_zl.

Bonus: ICOs & amp; Crowdsales

Initial Coin Offerings (ICOs) liegen etwas außerhalb des Entwicklungsteils eines Ethereum-Projekts, sind jedoch im Wesentlichen nur Crowdfunding.

Wenn ein Startup Geld benötigt, erstellt es ein eigenes Token und verkauft es während eines bestimmten Zeitraums, der als Crowdsale oder ICO bezeichnet wird.

Vor intelligenten Verträgen und der Blockchain-Technologie nutzten Startups eine Crowdfunding-Website, um Geld zu sammeln. Diese Websites erheben jedoch im Allgemeinen eine ansehnliche Gebühr. Jetzt schneiden Sie mit einem ICO den Mittelsmann und sammeln das Geld direkt.

Im Moment gibt es mehr Betrug als echte Projekte, bei denen Geld gesammelt wird. Aus Investorensicht sollten Sie also vorsichtig sein, wo Sie Ihr Geld anlegen sollen. Aus Entwicklersicht ist ein Crowdsale nur ein intelligenter Vertrag, bei dem einige Token von Anfang bis Ende im Austausch gegen Äther verkauft werden. Es gibt keinen Standardweg, um dies zu erreichen, aber Sie werden zum Beispiel eine gute Implementierung auf OpenZepplins Repo finden. Alternativ finden Sie auf der Website von Ethereum ein einfaches Tutorial.