Erstellen und Bereitstellen intelligenter Verträge mit Solidität

Erstellen und Bereitstellen intelligenter Verträge mit Solidität

1. Überblick

Die Fähigkeit,smart contracts auszuführen, hat die Ethereum-Blockchain so beliebt und störend gemacht.

Bevor wir erklären, was ein intelligenter Vertrag ist, beginnen wir mit einer Definition vonblockchain:

Blockchain ist eine öffentliche Datenbank, die digitale Transaktionen permanent aufzeichnet. Es fungiert als vertrauensloses Transaktionssystem, in dem Einzelpersonen Peer-to-Peer-Transaktionen durchführen können, ohne einem Dritten oder anderen vertrauen zu müssen.

Mal sehen, wie wir mitsolidity: intelligente Verträge auf Ethereum erstellen können

2. Äther

Ethereum ist eine Plattform, mit der Menschen dezentrale Anwendungen mithilfe der Blockchain-Technologie effizient schreiben können.

Eine dezentrale Anwendung (Dapp) ist ein Tool für Personen und Organisationen auf verschiedenen Seiten einer Interaktion, die ohne zentralen Vermittler zusammengeführt wurde. Erste Beispiele für Dapps sind BitTorrent (Filesharing) und Bitcoin (Währung).

Wir können Ethereum als Blockchain mit einer eingebauten Programmiersprache beschreiben.

2.1. Virtuelle Maschine von Ethereum (EVM)

Aus praktischer Sicht kann das EVM als ein großes, dezentrales System betrachtet werden, das Millionen von Objekten enthält, die alsaccounts bezeichnet werden und eine interne Datenbank verwalten, Code ausführen und miteinander kommunizieren können.

Der erste Kontotyp ist wahrscheinlich der bekannteste für den durchschnittlichen Benutzer, der das Netzwerk verwendet. Sein Name istEOA (externes Konto); Es wird zur Übertragung von Werten (z. B.Ether) verwendet und von einem privaten Schlüssel gesteuert.

Auf der anderen Seite gibt es einen anderen Kontotyp:contract.. Lassen Sie uns fortfahren und sehen, worum es geht:

3. Was ist ein intelligenter Vertrag?

Asmart contract ist ein eigenständiges Skript, normalerweisewritten in Solidity and compiled into binary or JSON and deployed to a specific address on the blockchain. Auf die gleiche Weise, wie wir einen bestimmten URL-Endpunkt einer RESTful-API aufrufen können, um eine Logik überHttpRequest auszuführen, können wir die bereitgestelltensmart contract auf ähnlicheaddress ausführen, indem wir die senden Korrigieren Sie die Daten zusammen mit dem erforderlichen Ethereum, um die bereitgestellten und kompilierten Solidityfunction aufzurufen.

Aus geschäftlicher Sichtit means that smart contract functions can be inherently monetized (ähnlich einer AWS Lambda-Funktion, mit der Benutzerper compute cycle anstelle vonper instance bezahlen können). Wichtig ist, dasssmart contract functionsEthereum nicht kosten müssen, um ausgeführt zu werden.

In einfachen Worten, wir können einsmart contract als eine Sammlung von Code sehen, die im Blockchain-Netzwerk gespeichert ist und Bedingungen definiert, auf die sich alle Vertragsparteien einigen.

Auf diese Weise können Entwickler Dinge erstellen, die noch nicht erfunden wurden. Denken Sie eine Sekunde darüber nach - es wird kein Mittelsmann benötigt und es besteht auch kein Gegenparteirisiko. Wir können neue Märkte schaffen, Register von Schulden oder Versprechungen speichern und versichern, dass wir die Konsensmöglichkeiten des Netzwerks haben, das die Transaktionen validiert.

Jeder kann einen intelligenten Vertrag für eine Gebühr in der dezentralen Datenbank bereitstellen, die proportional zur Speichergröße des enthaltenen Codes ist. Knoten, die den Smart-Vertrag nutzen möchten, müssen dem Rest des Netzwerks das Ergebnis ihrer Teilnahme mitteilen.

3.1. Solidität

Die in Ethereum verwendete Hauptsprache istSolidity - eine Javascript-ähnliche Sprache, die speziell für das Schreiben intelligenter Verträge entwickelt wurde. Solidity ist statisch typisiert und unterstützt unter anderem Vererbung, Bibliotheken und komplexe benutzerdefinierte Typen.

Der Solidity Compiler wandelt Code in EVM-Bytecode um, der dann als Bereitstellungstransaktion an das Ethereum-Netzwerk gesendet werden kann. Solche Bereitstellungen haben höhere Transaktionsgebühren als intelligente Vertragsinteraktionen und müssen vom Eigentümer des Vertrags bezahlt werden.

4. Erstellen eines intelligenten Vertrags mit Solidität

Die erste Zeile in einem Solidity-Vertrag legt die Quellcode-Version fest. Dies soll sicherstellen, dass sich der Vertrag bei einer neuen Compilerversion nicht plötzlich anders verhält.

pragma solidity ^0.4.0;

In unserem Beispiel lautet der Name des VertragsGreeting, und wie wir sehen können, ähnelt die Erstellung einer Klasse in Java oder einer anderen objektorientierten Programmiersprache:

contract Greeting {
    address creator;
    string message;

    // functions that interact with state variables
}

In diesem Beispiel haben wir zwei Zustandsvariablen deklariert:creator undmessage. In Solidity verwenden wir den Datentypaddress, um Adressen von Konten zu speichern.

Als nächstes müssen wir beide Variablen im Konstruktor initialisieren.

4.1. Konstrukteur

Wir deklarieren einen Konstruktor, indem wir das Schlüsselwortfunctiongefolgt vom Namen des Vertrags verwenden (genau wie in Java).

Der Konstruktor ist eine spezielle Funktion, die nur einmal aufgerufen wird, wenn ein Vertrag zum ersten Mal in der Ethereum-Blockchain bereitgestellt wird. Wir können nur einen einzigen Konstruktor für einen Vertrag deklarieren:

function Greeting(string _message) {
    message = _message;
    creator = msg.sender;
}

Wir fügen auch den anfänglichen String_message als Parameter in den Konstruktor ein und setzen ihn auf die Zustandsvariablemessage.

In der zweiten Zeile des Konstruktors initialisieren wir die Variablecreator mit einem Wert namensmsg.sender. Der Grund, warummsg nicht in den Konstruktor eingefügt werden muss, liegt darin, dassmsg eine globale Variable ist, die spezifische Informationen über die Nachricht bereitstellt, z. B. die Adresse des Kontos, das sie sendet.

Wir könnten diese Informationen möglicherweise verwenden, um die Zugriffskontrolle für bestimmte Funktionen zu implementieren.

4.2. Setter- und Getter-Methoden

Schließlich implementieren wir die Setter- und Getter-Methoden fürmessage:

function greet() constant returns (string) {
    return message;
}

function setGreeting(string _message) {
    message = _message;
}

Durch Aufrufen der Funktiongreet wird einfach das aktuell gespeichertemessage. zurückgegeben. Mit dem Schlüsselwortconstant geben wir an, dass diese Funktion den Vertragsstatus nicht ändert und keine Schreibvorgänge in die Blockchain auslöst .

Wir können jetzt den Wert des Zustands im Vertrag ändern, indem wir die FunktionsetGreeting aufrufen. Jeder kann den Wert ändern, indem er diese Funktion aufruft. Diese Methode hat keinen Rückgabetyp, verwendet jedoch einenString-Typ als Parameter.

Nachdem wir unseren ersten intelligenten Vertrag erstellt haben, besteht der nächste Schritt darin, ihn in der Ethereum-Blockchain bereitzustellen, damit jeder ihn verwenden kann. Wir könnenRemix verwenden, die derzeit die beste Online-IDE ist und deren Verwendung mühelos ist.

5. Interaktion mit einem intelligenten Vertrag

Um mit einem intelligenten Vertrag im dezentralen Netzwerk (Blockchain) interagieren zu können, müssen wir Zugriff auf einen der Clients haben.

Es gibt zwei Möglichkeiten, dies zu tun:

Infura ist die einfachste Option, daher fordern wirfree access tokenan. Sobald wir uns angemeldet haben, müssen wir die URL des Rinkeby-Testnetzwerks auswählen:“https://rinkeby.infura.io/<token>”.

Um mit dem Smart Contract von Java aus Transaktionen durchführen zu können, müssen wir eine Bibliothek namensWeb3j verwenden. Hier ist die Maven-Abhängigkeit:


    org.web3j
    core
    3.3.1

Und in Gradle:

compile ('org.web3j:core:3.3.1')

Bevor wir anfangen, Code zu schreiben, müssen wir einige Dinge zuerst tun.

5.1. Brieftasche erstellen

Mit Web3j können wir einige seiner Funktionen über die Befehlszeile verwenden:

  • Brieftaschenerstellung

  • Wallet-Passwortverwaltung

  • Geldtransfer von einem Portemonnaie zum anderen

  • Generieren Sie Solidity Smart Contract Function Wrapper

Befehlszeilentools können als Zip-Datei / Tarball auf der Seitereleasesdes Projekt-Repositorys, im Download-Bereich oder für OS X-Benutzer über Homebrew abgerufen werden:

brew tap web3j/web3j
brew install web3j

Um eine neue Ethereum-Brieftasche zu erstellen, geben Sie einfach Folgendes in die Befehlszeile ein:

$ web3j wallet create

Sie werden nach einem Passwort und einem Ort gefragt, an dem wir unsere Brieftasche aufbewahren können. Die Datei ist im Json-Format und die Hauptsache, die Sie beachten sollten, ist die Ethereum-Adresse.

Wir werden es im nächsten Schritt verwenden, um einen Ether anzufordern.

5.2. Ether im Rinkeby Testnet anfordern

Wir können kostenlose Etherhere anfordern. Um zu verhindern, dass böswillige Akteure alle verfügbaren Mittel ausschöpfen, bitten sie uns, einen öffentlichen Link zu einem Social-Media-Beitrag mit unserer Ethereum-Adresse bereitzustellen.

Dies ist ein sehr einfacher Schritt, fast sofort stellen sie den Äther bereit, damit wir die Tests durchführen können.

5.3. Generieren des Smart Contract Wrapper

Web3j kann automatisch Smart Contract Wrapper-Code generieren, um Smart Contracts bereitzustellen und mit ihnen zu interagieren, ohne die JVM zu verlassen.

Um den Wrapper-Code zu generieren, müssen wir unseren Smart-Vertrag kompilieren. Wir finden die Anweisung zum Installieren des Compilershere. Von dort aus geben wir Folgendes in die Befehlszeile ein:

$ solc Greeting.sol --bin --abi --optimize -o /

Letzteres erstellt zwei Dateien:Greeting.bin undGreeting.abi. Jetzt können wir den Wrapper-Code mit den Befehlszeilentools von web3j generieren:

$ web3j solidity generate /path/to/Greeting.bin
  /path/to/Greeting.abi -o /path/to/src/main/java -p com.your.organisation.name

Damit haben wir jetzt die Java-Klasse, um mit dem Vertrag in unserem Hauptcode zu interagieren.

6. Interaktion mit dem Smart Contract

In unserer Hauptklasse erstellen wir zunächst eine neue web3j-Instanz, um eine Verbindung zu Remote-Knoten im Netzwerk herzustellen:

Web3j web3j = Web3j.build(
  new HttpService("https://rinkeby.infura.io/"));

Wir müssen dann unsere Ethereum-Wallet-Datei laden:

Credentials credentials = WalletUtils.loadCredentials(
  "",
 "/path/to/");

Lassen Sie uns nun unseren intelligenten Vertrag bereitstellen:

Greeting contract = Greeting.deploy(
  web3j, credentials,
  ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT,
  "Hello blockchain world!").send();

Die Bereitstellung des Vertrags kann abhängig von der Arbeit im Netzwerk eine Weile dauern. Nach der Bereitstellung möchten wir möglicherweise die Adresse speichern, an der der Vertrag bereitgestellt wurde. Wir können die Adresse auf diese Weise erhalten:

String contractAddress = contract.getContractAddress();

Alle mit dem Vertrag getätigten Transaktionen sind in der URL zu sehen: „https://rinkeby.etherscan.io/address/<contract_address>”.

Auf der anderen Seite können wir den Wert des Smart Contract ändern, der eine Transaktion ausführt:

TransactionReceipt transactionReceipt = contract.setGreeting("Hello again").send();

Wenn wir den neuen gespeicherten Wert anzeigen möchten, können wir einfach schreiben:

String newValue = contract.greet().send();

7. Fazit

In diesem Tutorial haben wir gesehen, dassSolidity eine statisch typisierte Programmiersprache ist, die für die Entwicklung intelligenter Verträge entwickelt wurde, die auf dem EVM ausgeführt werden.

Wir haben auch einen einfachen Vertrag mit dieser Sprache geschlossen und festgestellt, dass sie anderen Programmiersprachen sehr ähnlich ist.

smart contract ist nur eine Phrase, die zur Beschreibung von Computercode verwendet wird, der den Werteaustausch erleichtern kann. Wenn ein Smart Contract in der Blockchain ausgeführt wird, wird er zu einem sich selbst ausführenden Computerprogramm, das automatisch ausgeführt wird, wenn bestimmte Bedingungen erfüllt sind.

In diesem Artikel haben wir gesehen, dass die Fähigkeit, Code in der Blockchain auszuführen, die Hauptunterscheidung in Ethereum ist, da Entwickler damit einen neuen Anwendungstyp erstellen können, der weit über alles hinausgeht, was wir bisher gesehen haben.

Wie immer finden sich Codebeispiele inover on GitHub.