Wie starte ich einen Smart Contract auf Ethereum? – Laama


Foto von Clifford Photography auf Unsplash

Auf Medium finden Sie zahlreiche Informationen, um mit der Codierung von verteilten Ethereum-Anwendungen zu beginnen.

Ich habe versucht, zu kompilieren, was meiner Meinung nach erforderlich ist, um mit dem Schreiben, Testen und Bereitstellen intelligenter Verträge auf dem EVM zu beginnen.

Wenn Sie dies jedoch noch nicht getan haben, müssen Sie sich zunächst mit den Konzepten von Distributed Ledger Technologies (DLT) und Ethereum vertraut machen. Ich werde diese Einführung hier nicht machen.

Beginnen wir also am Anfang und gehen wir davon aus, dass Sie ein neues Token für Ihr großartiges Projekt veröffentlichen möchten. Nennen wir es My Great Project Token (MGPT).

Unabhängig vom Zweck Ihres Tokens geht es bei Distributed Ledger Technologies (DLT) wie Ethereum um viel Geld! Daher können Fehler, Bugs usw. mehr als irgendwo sonst viel kosten, und alles sollte sehr sorgfältig durchgeführt werden.

Und mehr denn je sollten wir das Not Invented Here (NIH) -Syndrom vermeiden. Das heißt, wir sollten Bibliotheken verwenden, die existieren und getestet wurden. Das bedeutet natürlich auch Vertrauen, das auch immer ausgeglichen sein muss: Inwieweit können wir einigen Javascript-Bibliotheken vertrauen, um auf einen Smart Contract zuzugreifen und Ether oder Token zu übertragen? Testen, Testen und Testen ist die einzige Antwort, die ich kenne.

Für Ihr Token empfehle ich, mit Standards zu arbeiten. Dafür gibt es viele Gründe. Beispielsweise verwenden alle Token, die denselben Standard verwenden, dieselbe Schnittstelle und daher dieselben Methoden, die aufgerufen werden können.
Wenn Ihr Token fungibel ist, dh ein Token mit einem anderen des gleichen Typs austauschbar ist, sollten Sie ERC777 verwenden, die neueste Version von ERC20. ERC777 ist voll kompatibel mit ERC20, behebt jedoch viele seiner Mängel.

Sie könnten mit dem Schreiben Ihrer ERC777-Implementierung beginnen, aber auch hier das NIH-Syndrom vermeiden. Unabhängig von Ihren Programmierkenntnissen und Ihrem IQ ist das Schreiben und Testen einer ERC777-Implementierung eine Menge Arbeit. Verwenden Sie stattdessen eine Bibliothek (und vertrauen Sie ihr!).
Ich habe mich mit Bibliotheken befasst und die fortschrittlichste und qualitativ hochwertigste ist openzeppelin. Diese Jungs machen wirklich eine großartige Arbeit!
Wir werden also die openzeppelin-Implementierung von ERC777 verwenden, aber wie starten wir ein Ethereum-Smart-Vertragsprojekt?

Nun, Javascript, Nodejs, Npm sind deine ersten besten Freunde …
Stellen Sie sicher, dass Node und Npm auf Ihrem Computer installiert sind.

  Knoten - Version
npm - version

sollte die Version von beiden zurückgeben.

Für diesen Beitrag arbeite ich mit Node 10.15.3 und Npm 6.9.2.

Um ein Ethereum-Smart-Vertragsprojekt einzurichten, verwenden wir Truffle Suite, ein weiteres großartiges Produkt, das auch die lokale Test-Blockchain von Ganache bietet.

Truffle Suite bietet Ihnen zunächst eine Projektvorlage für Ihre intelligente Vertragsumsetzung. Es ist sehr nützlich. Es richtet Ihr Projekt zum Testen, Migrieren von Verträgen usw. ein.
Also zuerst Trüffel installieren (npm -g für allgemeines):

npm install truffle -g

dann erstelle ein Projektverzeichnis, gehe dorthin und initialisiere dein Trüffelprojekt:

mkdir 
CD
npx truffle init

Sie sind bereit zu gehen, Sie haben ein intelligentes Vertragsprojekt!

wenn du dich fragst was npx ist, es ist eine Version von npm (ein Teil der neuesten npm), die die Abhängigkeitsauflösung auf eine neue Art und Weise löst.

Ihr intelligentes Vertragsprojekt sieht also wie eine Art JavaScript-Knotenprojekt aus, und das ist es auch. Die Verbindung zur Blockchain und zum Solidity-Code erfolgt über web3js.

Sie sollten eine Version von web3js in truffle eingebettet haben, aber Sie können es auch mit installieren

npm installiere web3

Wenn Sie kein Javascript mögen, können Sie alles auch in Java oder Scala mit web3j und web3j-scala tun.

Obwohl ich eher ein Scala-Ingenieur bin – ich liebe Scala mehr als jede andere Programmiersprache -, habe ich die Scala-Version nicht getestet.

Ihr Truffle-Projekt bietet bereits einige interessante Funktionen.
Im truffle-config.js Sie können die Informationen zu dem verteilten Ledger angeben, auf das Sie zugreifen möchten.

Sie sollten mit einem lokalen Entwicklungsbuch beginnen und Ganache ist sehr mächtig.

Sobald alles auf Ganache funktioniert, können Sie sich vorstellen, zu einem Testnetzwerk wie zu wechseln ropsten.

Eine typische Konfiguration für den Zugriff auf Ganache wäre:



Entwicklung: {
Host: "127.0.0.1", // Localhost (Standard: keine)
Port: 7545, // Standard-Ethereum-Port (Standard: keiner)
network_id: "*", // Beliebiges Netzwerk (Standard: keine)
gas: 6000000, // Mit jeder Transaktion gesendetes Gas (Standard: ~ 6700000)
gasPreis: 20000000000, // 20 gwei (in wei) (Standard: 100 gwei)
},

Trüffel init Außerdem wurden einige nützliche Verzeichnisse erstellt.

Verträge sollte Ihren Solidity-Code enthalten. Ich werde hier nichts über Solidity-Code schreiben.

bauen wird die Build-Artefakte enthalten.

Migrationen Enthält den Javascript-Code zum Migrieren der Smart-Verträge. Es erinnert mich an Datenbankmigrationsskripte wie in Ruby on Rails oder an Tools wie mybatis.

Und in der Tat ist ein verteiltes Hauptbuch eine Datenbank, die Migrationen benötigt!

Prüfung enthält Ihren Testcode, unabhängig davon, ob er in Javascript oder Solidity geschrieben ist. Der Trüffeltest versucht, alle Dateien auszuführen, die mit enden .js oder .Sol

Ich habe openzeppelin erwähnt, also fügen wir es unserem Projekt hinzu:

  npm install @ openzeppelin / verträge

Jetzt können Sie das Openzeppelin direkt in Ihren Code importieren.

Müssen Sie ein fließender Solidity-Programmierer sein, um intelligente Verträge zu schreiben? Es hängt davon ab, ob.

Wenn Sie komplexe Dinge erledigen möchten, sollten Sie ein Experte sein, aber Sie können ganz einfach Ihren ersten MGPT ERC777-Smart-Vertrag schreiben.

Wechseln Sie in den Vertragsordner und erstellen Sie eine neue Soldatendatei, beispielsweise mit dem Namen mgpt.sol

"` Solidität

Pragma Solidität ^ 0,5,0;
importieren "@ openzeppelin / verträge/token/ERC777/ERC777.sol ”;
importieren "@ openzeppelin / verträge/token/ERC20/IERC20.sol ”;

Auch hier lehren wir keine Solidität. Interessanterweise können wir sehen, wie wir das Openzeppelin Smart Contract Token importieren, das wir mit npm installiert haben, einer interessanten Verbindung zwischen Javascript und Solidity.

Da es sich bei der Blockchain um eine unveränderliche Datenstruktur handelt, muss der Speicherplatz mit Bedacht verwendet werden uint256.

Unser MGPT-ERC777-Code sieht sehr einfach aus. Er erbt im Grunde alle Funktionen des übergeordneten Klassencodes in Openzeppelin mit dem Klassenerweiterungskonstrukt in Solidity ist ERC777. Solidity ist eine objektorientierte Sprache, die Mehrfachvererbung implementiert.

Der vorherige Code gibt lediglich unseren MGPT-Smart-Vertrag an, instanziiert jedoch kein Objekt im verteilten Hauptbuch. Truffle migrate wird es tun.

Der Zugriff auf das verteilte Hauptbuch erfolgt asynchron über Javascript. Daher können Sie Ihren Code entweder verketten .dann() Code oder mit der asynchron und erwarten Code-Stil.
Im Folgenden werde ich die neueste verwenden, aber das ist Geschmackssache, bis Sie das verwenden, was Sie besser mögen.

Bei der Migration müssen Sie also eine Methode bereitstellen, die drei Argumente erhält (Bereitsteller, Netzwerk, Konten) und das kann man gebrauchen Bereitsteller intelligente Verträge bereitstellen.

Aber zuerst müssen Sie installieren openzeppelin-test-helfer Das gibt Ihnen Helfer wie ein Einheimischer ERC1820Registry die Sie während der Entwicklung von ERC777-Verträgen benötigen.

Führen Sie npm install erneut aus:

npm install - save-dev openzeppelin-test-helpers chai

Also, um unser MGPT zu deponieren,
hier ist, wie 2_deploy_contracts.js wird aussehen wie:

require (‘openzeppelin-test-helpers / configure’) ({web3});
const {singletons, BN} = require (‘openzeppelin-test-helpers’);

Auf Projektebene können Sie Ihre Migration jetzt ausführen mit:

Trüffel wandern 

Damit sollte Ihr Smart Contract für Ihre lokale Ganache bereitgestellt werden, Sie müssen jedoch sicherstellen, dass Ganache ausgeführt wird.

Ist dies nicht der Fall, vergewissern Sie sich, dass Sie es ebenfalls installiert haben, andernfalls führen Sie es aus

npm install -g ganache-cli

Sie können die UI-Version verwenden und sehen die Transaktionen, die Vertragserstellung, die Ausgaben usw.

Das Ganache-Entwicklungsnetzwerk startet automatisch mit 10 Accounts mit jeweils 100 ETH. Die Konten finden Sie im Konten Array.
Wenn Sie es nicht anders angeben, Konto[0] wird verwendet als Absender Konto. Stellen Sie immer sicher, dass es das ist, was Sie wollen.

Eine funktionierende Migration sollte irgendwann Folgendes hervorbringen:

2_deploy_contracts.js
====================
Netzwerkname: Entwicklung

Sie können die Truffle-Konsole verwenden, um mit Ihren Verträgen zu interagieren.
Lauf

Trüffelkonsole

Und dann versuchen Sie etwas wie:


MyGreatProductToken.deployed (). Then (Instanz => {Token = Instanz;})

Hier verwenden wir die .dann() Syntax … Es sollte zurückkehren nicht definiert.
Aber irgendwann wird die Token-Variable gesetzt, die Sie folgendermaßen testen können:

token.symbol ()

was jetzt zurückkehren sollte MGPT

Wenn Sie etwas anderes oder eine Ausnahme bemerken, vergewissern Sie sich zunächst, dass der Name Ihres Smart-Vertrags richtig ist.

Natürlich muss Ganache oder ein anderes Netzwerk laufen, um mit Truffle interagieren zu können.

Denken Sie daran, dass Sie Ihr Zielnetzwerk immer angeben können, wenn Sie Trüffelbefehle mit verwenden – Netzwerk Standard ist Entwicklung.

Testen ist der wichtigste Schritt bei der Entwicklung von DLT-Dapps. Wir machen wahrscheinlich nie genug Tests.

Truffle erstellt einen Ordner, in dem Sie Ihre Tests ablegen können. Sie können dann entscheiden, ob Sie Ihre Tests in Javascript oder Solidity oder in beiden Versionen durchführen.
Im Moment habe ich Javascript gewählt.

Testen ist ein gutes Thema für domänenspezifische Sprachen (DSL)
Es ist aber auch Geschmackssache, welche Syntax jeder bevorzugt:
foo.should.be.a („Zeichenfolge“); oder
expect (foo) .to.be.a ("string"); oder
assert.typeOf (foo, "string");

Sollte, Erwarten von oder Behaupten, was gefällt dir besser?

Chai, die wir zuvor installiert haben, können alle drei machen.

Wieder haben Sie entweder die Methodenverkettung .dann(..) Option oder die asynchron und erwarten Kombination.

Um konsequent zu sein, werde ich bei bleiben erwarten.

Hier ist der Code zum Testen des Tokens in Javascript:

Javascript
const MGPT = artifacts.require ("MyGreatProductToken");
Vertrag ("MyGreatProductToken", Funktion (Konten) {
let mgpt;
let tokenAddress;
const delay = ms => new Promise (res => setTimeout (res, ms));
Vorher (‘Einrichtungsvertrag für jeden Test’, asynchrone Funktion () {
mgpt = warte auf MGPT.deployed ();
tokenAddress = warte auf mgpt.address;
Warte auf Verzögerung (3000);
});

Debuggen einer fehlgeschlagenen Transaktion

Angenommen, Sie haben Ihren Smart-Vertrag in einem Testnetzwerk wie ropsten.

Sie beginnen mit Ihrem Testcode damit zu interagieren, und plötzlich erhalten Sie auf etherscan etwas wie das Folgende

Nun, aber was ist wirklich passiert?

Es gibt wahrscheinlich viele Möglichkeiten, dies herauszufinden, aber hier ein Ansatz, den ich mag.

Klonen Sie das Eth-Enthüllungsprojekt von Github.

Installieren Sie das Projekt

npm install

Ja, noch ein Knoten, Javascript-Projekt!

Jetzt lauf

npx eth-disclose -n ropsten -h <Transaktions-Hash

mögen:

npx eth-disclose -n ropsten -h 0x90b2e796690a60897534532d9d9fb7724fbf1402ca67aea5680250b07c584aa5

es wird die Fehlermeldung im Detail zurückgeben, in unserem Fall:


Status: Fehler
ES-Fehler: Zurückgesetzt
Grund umkehren: Pause: Pause

Ja, unser Vertrag wurde pausiert, daher wurde die Transaktion zurückgenommen!

Wenn Sie programmgesteuert mit einem Vertrag interagieren möchten, benötigen Sie dessen ABI.

Der Grund dafür ist, dass Ihr Code die Methodensignaturen kennen muss, um sie aufrufen zu können.

Um die ABI Ihrer Verträge zu generieren, klonen Sie das Projekt truffle-export-abi und führen Sie dann Folgendes aus:

Trüffel-Export-abi-d  -v

Dadurch wird eine vollständige ABI generiert, die Sie später in Ihren Code importieren können.

Das Mischen von Sprachen, Bibliotheken und Plattformen kann sehr leistungsfähig und unterhaltsam sein, aber auch schnell zum Albtraum werden.

Ein Beispiel sind Big Numbers und Bibliotheken, mit denen Sie von Javascript bis Solidity arbeiten können.

In einigen Fällen wissenschaftliche Notation (wie "10000e18") wird funktionieren, in anderen Fällen wird es nicht funktionieren. Und die Fehlermeldung wird Ihnen nicht viel helfen. Ich bin immer noch nicht zufrieden mit den Optionen, die angeboten werden, um mit BNs umzugehen. Wenn Sie Vorschläge haben, sind sie willkommen.

Dieser Beitrag ist schon lang genug, ich werde hier aufhören.

Lassen Sie mich wissen, wenn etwas nicht klar ist oder wenn ich einen Fehler gemacht habe.

Ich habe diesen Artikel ursprünglich hier gepostet.



Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining

Werbung: Immobilienmakler HeidelbergMakler Heidelberg

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close