TL;DR: Smart Contracts für Eilige (Teil 1) - Blockchain Tutorial


07.08.2018 von

https://www.iteratec.de/fileadmin/Bilder/News/iteratec_logo.png https://www.iteratec.de/fileadmin/Bilder/News/iteratec_logo.png iteratec GmbH

Wenn Blockchains eine Art von verteilten Datenbanken sind, dann sind Smart Contracts ihre Stored Procedures. Sie bieten Funktionen an, die man aufrufen kann und die Daten in der Blockchain ablegen können.

Und glaubt man den Expertinnen (oder meinem Kollegen), dann könnten Smart Contracts ganze Märkte verändern.

Es nützt also nix...

... wir müssen selber einen Smart Contract erstellen. Erst dann können wir auch mit den wirklich coolen Kids mitreden.

Zero Install

Aber da wir auch Besseres zu tun haben, wollen wir es uns so einfach wie möglich machen und nur Online-Tools verwenden.

Unsere eigene Währung...

... wollen wir aber nicht. Auf Ethereum - die älteste und größte der Blockchains, die Smart Contracts anbietet - gibt es jede Menge Contracts, die ihren eigenen Coin implementieren. Dafür gibt es auch extra Standards (ERC20 bzw. ERC223). Und so ein ERC20-Contract muss gar auch nicht mal so groß sein. Wir aber wollen es noch viel einfacher.

"Das habe ich doch schon vor zehn Jahren gesagt!"

Kennen Sie das? Sie sagen etwas richtig Kluges und keiner weiß das zu würdigen. Jahre später kommt irgendwer daher, sagt das Gleiche und wird umjubelt.
Wir wäre es, wenn Sie jetzt beweisen könnten, dass Sie das schon vor Jahren gesagt haben?

Aber wie?

Sie könnten natürlich alle Ihre schlauen Äußerungen schon mal vorsorglich im Web veröffentlich und dann später über archive.org beweisen, wie klug Sie schon vor Jahren waren.
Aber sind doch wir mal ehrlich. Finden unsere genialen Ideen keine Resonanz, sind doch meistens die Ideen schuld. Oder? Also vielleicht doch nicht alles schon mal prophylaktisch veröffentlichen.

Marmor, Stein und Eisen bricht, aber eine Blockchain nicht

Was liegt also näher, als alle klugen Gedanken einfach in der Blockchain abzulegen? Dann sind Zeitpunkt und Inhalt unwiderruflich festgehalten. Und da Speicher in der Blockchain Geld kostet, hashen (SHA512) wir vorher und legen nur den Hashwert ab.

Pacta sunt servanda

Unser Smart Contract soll so einfach wie nur möglich sein. Wir beschränken uns auf eine einzige Funktion:

logHashValue(string hashValue)

Diese Funktion veröffentlicht in der Blockchain einen Hashwert (Was wir mit veröffentlichen meinen, werden wir gleich sehen).

Das ist alles. Mehr brauchen wir nicht.

Jetzt nur noch ein Name für unseren Contract: Weisenheimer und hier ist er auch schon:

pragma solidity ^0.4.19;
contract Weisenheimer {

    event NewHashValue(string, address, uint);

    function logHashValue(string hashValue) public {    
      emit NewHashValue(hashValue, msg.sender, block.timestamp);
    }
}

(Die Programmiersprache nennt sich Solidity und ist speziell für Smart Contracts gedacht)

Zugegeben. So richtig smart sieht der nicht aus. Erfüllt aber seinen Zweck:

Die Funktion logHashValue erzeugt einen Logeintrag, mit dem Hashwert, der Adresse des Accounts, von dem die Funktion aufgerufen wurde und dem Zeitstempel, die ein für alle Mal in der Blockchain festgehalten werden (Jeder kann die Log-Einträge eines Contracts lesen, daher ist das auch eine Art von Veröffentlichen).

Die Funktion ist public ohne Einschränkung, d.h. sie darf von jedem Ethereum Account aufgerufen werden.

There is no free lunch

Um unseren Smart Contract Weisenheimer in der Ethereum Blockchain zu deployen, brauchen wir einen Account und Ether, die Währung bei Ethereum.

Jede Transaktion bei Ethereum - und das Deployen eines Contracts ist auch eine Transaktion - kostet Ether. Und Ether kosten normalerweise echtes Geld (aber seien Sie beruhigt, für unser kleines Beispiel brauchen Sie kein Geld auszugeben).

Wallets

Das Verwalten von Accounts und Starten von Transaktionen geht am Einfachsten über ein Wallet.

Wir verwenden dafür das Browser-Plug-in Metamask. Die Installation erfolgt über den Chrome Web Store oder über Firefox Add-ons.

Nach dem Starten (kleiner Fuchs neben der Address Bar) muss man zunächst mal ein Wallet erzeugen:

Danach sehen Sie 12 Worte, die sogenannten Mnenomics. Das ist der Schlüssel zum Königreich Ihres Wallets. Sollten Sie also vorhaben, echte Ether für echtes Geld zu kaufen (wie gesagt: Für unser kleines Beispiel brauchen Sie das nicht), dann sollten Sie diese 12 Worte seeeeeeehr sicher aufbewahren.

And there is a free lunch!!!

Als nächstes müssen wir uns entscheiden, auf welchem Ethereum Network wir unseren Contract deployen wollen.

Da gibt es einmal das Main Net. Da spielen die Big Girls'n'Boys. Da kosten Ether echtes Geld, und zwar gar nicht mal so wenig. Das wollen wir nicht.

Zum Glück gibt es noch einige Test-Networks. Da gibt es Ether für lau (free lunch). Das wollen wir!

Für unser kleines Beispiel nehmen wir das Rinkeby Test-Network. Dazu wählen wir in Metamask das Rinkeby-Network aus:

Metamask hat uns auch schon freundlicherweise einen Account angelegt.
(Solange wir aber keine Transaktion mit diesem Account durchgeführt haben, ist der Account in dem Network jedoch noch nicht bekannt)

Wenn ich einmal reich wär

Mit 0 Ether (ETH) ist unser Account leider ziemlich arm :(

Aber im Gegensatz zum Main Net bekommen wir auf Rinkeby die Ether geschenkt. Bzw. fast. Ein klein wenig müssen wir schon tun.

Geld zapfen

Wir gehen zur offiziellen Faucet von Rinkeby. Dort werden Ether verschenkt.

Dafür müssen wir die Adresse unseres Accounts auf Twitter, Google+ oder Facebook posten und die URL dieses Posts in das Eingabefeld kopieren.

Dann können wir uns entscheiden, wieviel Ether wir wollen. Je nachdem können wir dann aber erst in acht Stunden (3 ETH), einem (7,5 ETH) oder drei Tagen (18,75 ETH) wieder um Ether betteln.

Die Adresse unseres Accounts können wir uns aus unserem Metamask-Wallet kopieren (Klick auf die drei Punkte neben dem Account-Namen Account 1).

(Übrigens: Den Namen Ihres Accounts können Sie auch ändern. Klicken Sie dafür einfach auf edit direkt über dem Namen.)

Jetzt müssen Sie sich entscheiden, auf welchem Social Network Sie die Adresse posten wollen. Sie können dafür auch einen eigenen Account in dem Social Network anlegen. Nicht, dass Sie reihenweise Follower verlieren.

Ich nehme dafür in der Regel meinen Google+ Account. Den nutze ich sonst kaum. Die paar Follower wundern sich zwar jedes Mal ("Steuerst Du ein Botnet?"), aber damit muss man leben.

Es ist übrigens egal, was außer der Adresse Ihres Rinkeby-Accounts noch in dem Post steht. Da können Sie dann noch in ein oder zwei Worten erklären, warum Sie gerade eine 160-Bit Hex-Zahl posten.

Jetzt kopieren Sie den Link des Posts in das Eingabefeld des Faucets. Und heute lassen wir es mal so richtig krachen und nehmen gleich die vollen 18,75 Ether.

Und siehe da. Wir sind reich.

Freuen Sie sich aber nicht zu früh. Die 8273,06 Dollar gelten nur für das Main-Net. Für das Rinkeby Test-Network müssen Sie davon 8273,06 Dollar abziehen.

Submission accomplished

So jetzt kann es losgehen. Wir können jetzt unseren Contract in der Blockchain deployen. Dazu gehen wir zu der Online-Ethereum-IDE remix.

Mit dem kleinen Plus-Zeichen oben links können wir eine neue Datei anlegen. Wir nennen sie Weisenheimer.

Jetzt öffnet sich ein neuer Tab, in den wir den Code des Contracts kopieren können.

Im Compile-Tab auf der rechten Seite können wir den Code schon einmal compilieren.

Bei den zwei Warnings wenden wir einen alten Developer-Trick an: Wir ignorieren sie.

Im Run-Tab daneben, wählen wir nun Injected Web3 als Environment aus.

Das bedeutet, dass ein Objekt namens Web3, das von außen (in unserem Fall von Metamask) in die Web-Seite injiziert wurde, verwendet wird. (Web3 ist eine sehr populäre JavaScript-Library zum Aufrufen von Ethereum-Contracts.)

Damit können wir die Transaktion zum Deployment des Contracts über Metamask ausführen lassen.

Wenn Sie bei Metamask angemeldet sind (ansonsten sollten Sie das jetzt tun), sollten Sie nun den in Metamask ausgewählten Account sehen.

3, 2, 1, ...

Jetzt wird's ernst. Über den Deploy-Button können Sie nun das Deployment des Contracts starten.

Jetzt kommt es darauf an, welchen Browser Sie verwenden:

  • Im Chrome öffnet sich auf der linken Seite ein Metamask-Fenster, in dem Sie die Transaktion bestätigen können.
  • Im Firefox kann es sein (so war es bei mir), dass sich auf der linken Seite ein leeres Fenster öffnet. Das können Sie wieder schließen. Durch einen Klick auf das Fuchs-Icon (dort sollte nun eine kleine 1 erscheinen) sollten Sie das Fenster zum Bestätigen der Transaktion sehen können.

Jetzt nur noch Submit und das war's.

New contract is born

In der Konsole (Mitte, unten) sehen Sie nach ein paar Sekunden (sobald die Transaktion es in die Blockchain geschafft hat) einen Link zu der Transaktion.

Der Link führt zu Etherscan, eine Art Ethereum-Browser für Transaktionen, Contracts, etc. (Main-Net und Test-Networks). Dort sehen wir die Transaktion unseres Deployments.


Dort finden wir auch den Link zu unserem Contract:

Er führt uns zu der Etherscan-Seite des Contracts.

Jetzt können wir uns kurz ausruhen und auf die Schulter klopfen. Wir sind aber noch nicht durch!

Denn es sollen ja auch andere unseren Contract aufrufen. Aber woher sollen Sie wissen, was der Contract tut? Wir können ja viel erzählen.

Show me the code

Dafür kann man in Etherscan den Code zu einem Contract hinterlegen. Etherscan verifiziert, dass dies wirklich der korrekte Code ist.

Im Code-Tab gibt es den Link Verify And Publish.

Dort müssen wir folgendes eintragen:

  • Adresse des Contract: Ist schon vorausgefüllt
  • Name des Contract: Wiesenheimer
  • Compiler-Version: Kann man in remix im Settings-Tab auf der rechten Seite sehen
  • Außerdem müssen wir noch angeben, ob der Compiler mit Optimierung lief oder nicht. Auch das sieht man im Settings-Tab. War ausgeschaltet (hätten wir vielleicht mal einschalten sollen - naja, nächstes Mal)
  • In das große Feld kopieren wir nun den Code unseres Weisenheimer-Contracts

Jetzt nur noch ganz runter scrollen, versichern dass man kein Roboter ist (aber wer kann das schon mit Sicherheit von sich sagen?) und den großen blauen Knopf drücken.

Nun kann das ein klein wenig dauern, aber dann gibt es eine Bestätigung.

Und wenn man jetzt wieder neu auf die Seite des Contracts geht, sieht man einen schönen grünen Haken im Titel des Code-Tab.

Und im Code-Tab können wir nun unseren Code bewundern.

Heureka

So, jetzt brauchen wir nur noch einen klugen Gedanken, den wir hashen und in der Blockchain veröffentlichen können, sodass wir in einigen Jahren beweisen können, dass wir das schon lange wussten (damit kann man sich übrigens sehr beliebt machen).

Falls Sie gerade keinen guten Gedanken zur Hand haben, kann ich Ihnen einen leihen (aber nicht stehlen, der ist schon längst in der Blockchain). Wir gehen erst einmal zu einem Online-Hash-Calculator.

Dort geben Sie Ihren klugen Gedanken, ein drücken auf den großen Calculate-Knopf. Den Hashwert kopieren Sie sich mit Strg-C.

a2f47805482ecb4267a9d5688973df5e0955f53f63b8c60b9b8a93ef17c7cdc46e86e7e53fcc778ec4efdf478f55ee71f3038b713ac5f8cf856dd2d04033255f

Mit dem Hashwert in der Zwischenablage gehen Sie dann wieder zu der Contract-Seite zurück in den Write-Contract-Tab.

Dort klicken Sie auf den Connect with Metamask. Sollten Sie nicht mehr bei Metamask angemeldet sein, dann erscheint sowas:

Jetzt müssen Sich erst einmal bei Metamask anmelden (Achtung: Sie haben noch den Hashwert in der Zwischenablage).

Wenn Sie nun angemeldet sind, dann erscheint nach Connect with Metamask noch eine Warnung, dass alles noch ziemlich beta ist.

Auch die ignorieren wir (den Trick kennt jeder, nicht nur Developer). Jetzt erkennen wir durch den grünen Punkt, dass wir mit Metamask verbunden sind.

Jetzt pasten wir den Hashwert in das Eingabefeld der Funktion logHashValue.

Wenn Sie jetzt den Write-Button klicken, müssen Sie die Transaktion wieder in Metamask bestätigen.

Danach sehen Sie den neuen Button View your transaction, über den Sie sich die neue Transaktion ansehen können.

Ist sie nicht schön?

Über den Button Decode Input Data bekommen Sie auch die Eingabedaten im Klartext angezeigt.

Im Tab Event Logs können Sie auch den Log-Eintrag sehen, der durch den Contract mit der Code-Zeile

emit NewHashValue(hashValue, msg.sender, block.timestamp);

erzeugt wurde.

Leider gibt es keine Möglichkeit, die Daten im Klartext zu sehen (zumindest kenne ich keine, falls Sie eine kennen, bin ich sehr interessiert: oliver.widder@Do not spamiteratec.de).

Aber den nächsten Teilen dieser kleinen Serie werden wir eine kleine distributed App (DApp) entwickeln, mit der wir dies auslesen können. Mit dieser DApp wird auch das Ablegen von klugen Gedanken deutlich einfacher (ohne Online-Hash-Calculator).

Sie brauchen also nur noch kluge Gedanken. Aber davon habe Sie doch mehr als genug, oder?

Diesen Artikel bewerten
 
 
 
 
 
 
 
9 Bewertungen (96 %)
Bewerten
 
 
 
 
 
 
1
5
4.8