Bei Smart Contracts (intelligente Verträge) handelt es sich um Programme, die auf der Blockchain ausgeführt werden. Im Unterschied zu einem klassischen Programm auf dem Computer führen die Netzwerkknoten die Programme aus.
Nick Szabo hat den Begriff 1993 geprägt. Seine Absicht war es Verträge durch Computerprogramme darstellen zu lassen. Durch Kryptographie und Blockchain sind alle notwendigen Komponenten, nämlich Sicherheit und Transparenz, vorhanden um sinnvolle Verträge ohne Drittpartei zu definieren. Der Smart Contract beschreibt, wer mit ihm interagieren darf und welche Rechte bzw. Besitzrechte er hat. Dazu ein Beispiel später.
Was ist ein Computerprogramm?
Ein Computer besteht in der Regel aus drei Grundeinheiten: dem Rechenwerk, dem Steuerwerk und dem Speicher. Ein Computerprogramm beschreibt für die Computerhardware interpretierbare Befehle und die Variablen für eine sinnvolle Anwendung. Machen wir dazu als Beispiel, die Berechnung einer Fibonaccizahl aus der Fibonacci-Reihe. Diese unendliche mathematische Reihe startet mit den Zahlen 1,1. Jede der folgenden Zahlen ist die Summe der vorherigen Zahl und der Zahl vor der Vorherigen. Mathematisch ausgedrückt zn= z(n-1)+z(n-2) für n >= 3 n(1) =n (2)= 1. Als Ergebnis erhalten wir die Reihe 1,1,2,3,5,8,13,21,34,55…. unendlich.
Nun schreiben wir ein Programm für den Computer, das die Fibonaccizahl an der n-ten Position berechnet. Wir brauchen für unser Programm vier Variablen: “a” und “b” für die letzte und vorletzte Zahl und “c” für das Ergebnis. “i” enthält die gesuchte Position. Alle Variablen sind natürliche Zahlen, also keine Nachkommastellen. Sie werden vom Computer auf Adressen im Speicher abgebildet. Jeder Befehl wird vom Steuerwerk interpretiert und ausgeführt. Wie folgt, schaut der Pseudocode für unser Programm aus:
Befehl 1: Hole einen Wert vom Benutzer und weise ihn der Variable i zu (unsere gewünschte Position in der Fibonacci Reihe)
Befehl 2: Weise der Variable a den Wert 1 zu (schreibe 1 in den Speicher der a zugeteilt ist)
Befehl 3: Weise der Variable b den Wert 1 zu
Befehl 4: Weise der Variable c den Wert 1 zu
Befehl 5: Ziehe von der Variable i den Wert 2 ab (die ersten beiden Zahlen der Reihe haben wir schon in a (Zahl 1) und b (Zahl 2))
Befehl 6: Wenn i kleiner oder gleich 0 ist, springe zu Befehl 12 (sonst folge der Befehlsreihenfolge)
Befehl 7: Weise der Variable a den Wert der Variable b zu
Befehl 8: Weise der Variable b den Wert der Variable c zu
Befehl 9: Addiere Wert von Variable a mit Wert von Variable b und weise das Ergebnis Variable c zu
Befehl 10: Subtrahiere vom Wert von Adresse i die Zahl 1
Befehl 11: Springe zu Befehl 6
Befehl 12: Gib den Wert von Variable c auf dem Bildschirm aus
Für eine Ausführung auf dem Computer muss unser Pseudocode natürlich im Maschinencode vorliegen. Dabei hat jeder Befehl eine entsprechende Nummer, die vom Steuerwerk interpretiert wird. Diese Befehlskennzeichnungen sind an die Hardware geknüpft. Hier findet man z.B. die Befehlssätze des verbreiteten x86-Prozessors.
In unserem Beispiel sehen wir, dass zwischen Befehl 5 und Befehl 11 eine Schleife ist. Schauen wir uns den Zustand der Variablen an, wenn das Steuerwerk am Befehl 5 ist. Dazu führen wir das Programm mit der Eingabe 6 aus, wir wollen also die 6te Fibonacci Zahl berechnen:
Start: a= 1, b= 1, c= 1, i= 4
Durchgang 1: a= 1, b= 1, c= 2, i= 3
Durchgang 2: a= 1, b= 2, c= 3, i= 2
Durchgang 3: a= 2, b= 3, c= 5, i= 1
Durchgang 4: a= 3, b= 5, c= 8, i= 0
Bildschirmausgabe ist 8, also wurde die gewünschte Zahl richtig berechnet. Man nennt solche Rechenvorschriften auch Algorithmen.
Die Technik der Smart Contracts
Smart Contracts funktionieren im Prinzip gleich. Im Unterschied zu den meisten Computerprogrammen wird der Code von Smart Contracts auf virtuellen Maschinen (VM) ausgeführt. Das heißt, nicht eine verdrahtete Schaltlogik interpretiert die Befehle, wie in unserem Beispiel das Steuerwerk, sondern ein Programm. Damit ist die Ausführung von Smart Contracts plattformunabhängig und wird meistens von der Nodesoftware bewerkstelligt. Die Variablen werden nicht im Speicher abgelegt, sondern auf die Blockchain geschrieben.
Wir haben jedoch ein Problem. Schauen wir unser Beispiel des Computerprogramms an. Was passiert, wenn ein Programmierer aus Versehen Befehl 9 vergisst? Richtig, es kommt zu einer Endlosschleife, das Programm terminiert nicht. Dies würde eine Fehlfunktion in der ausführenden Nodesoftware verursachen und die Blockchain lahmlegen. Deshalb hat man sich bei Bitcoin für eine VM entschieden, die keine Sprungbefehle kennt.
Wir sehen, dass wir damit an Macht verlieren, da wir jeden einzelnen Schleifendurchlauf explizit programmieren müssen und an Flexibilität einbüßen. Unser Programm wäre ziemlich beschränkt und würde, je nachdem wie lange die Reihe berechenbar sein soll, viel mehr Speicher verbrauchen. Auf der anderen Seite sind solche “nicht Turing-Vollständigen” Programme gegen Endlosschleifen abgesichert. Jedoch kann dieses Modell nicht den Ansprüchen von Smart Contracts gerecht werden.
Ein weiteres wichtiges Kriterium ist der zwingende Determinismus. Alle Programme müssen zum exakt selben Ergebnis kommen. So müssen auch Zufallsgeneratoren auf jeder Maschine dasselbe Ergebnis liefern, was Zufälligkeit an sich äußerst schwierig macht. Wenn der Zufallsgenerator so konzipiert ist, dass er überall dasselbe Ergebnis liefert, ist dies ein Widerspruch von Zufälligkeit an sich.
Die ersten praktischen Smart Contracts
Ethereum ermöglichte als erstes Projekt Programme auf der Blockchain auszuführen, die allen Ansprüchen von Smart Contracts gerecht werden und demnach so bezeichnet werden können. Ein Programmierer programmiert zuerst einen Smart Contract, wandelt ihn mithilfe eines Compilers in für die Virtuelle Maschine verständlichen Bytecode um und sendet diesen an die Ethereum Blockchain. Er bekommt eine Kontoadresse als Rückgabewert, auf welcher sich der Smart Contract befindet und jeder kann mit ihm interagieren. Ein Smart Contract auf Ethereum kann mehrere Funktionen beinhalten, über die der Benutzer mittels Transaktionen zugreift.
In unserem Beispiel würde der Benutzer den Wert der Stelle, an der er die Fibonaccizahl gerne berechnet haben möchte über eine Transaktion übergeben. Sobald der Miner die Transaktion in seinen Block einbindet, führt er den Code auf der VM aus und ändert den Status der Variablen. Hat ein Miner einen Block gefunden (Proof of Work Konsensmechanismus), strahlt er ihn ins Netzwerk aus. Die andern Miner validieren die Zustände des Blocks durch Ausführen des Programms und fügen ihn nur an die Blockkette, wenn sie zu dem selben Ergebnis kommen.
Das Problem mit den Endlosschleifen löst Ethereum damit, dass für jeden Befehl, den die VM ausführt, eine Gebühr (Gas) entrichtet werden muss. Diese Gebühr bekommt der Miner, der den Block gefunden hat.
Beispiel Token Smart Contract
Machen wir zum Verständnis ein einfaches Beispiel, wie ein Token Smart Contract, wie der bekannte ERC-20, ungefähr aussehen könnte. Wir bauen die wichtige Transferfunktion, eine ICO Funktion und eine Zerstörungsfunktion, die den ihn unbrauchbar macht. Unser Smart Contract soll es erlauben zuerst ein ICO abzuhalten, bei dem mit Ether Token gekauft werden. Sobald das ICO beendet ist und alle Token verkauft sind, kann man die sie transferieren. Ein Token kostet beim ICO 0,01 ETH.
Als Variablen haben wir den Besitzer des Smart Contracts “o”, die Anzahl der Token “t”. Zusätzlich führen wir eine erweiterbare Liste “l”, die pro Eintrag die Kontoadresse und eine dazugehörige Zahl (Anzahl Token) enthält. In dieser Liste stehen also die Ethereumadressen der Besitzer und ihre Anzahl an Token. Den Sender der Transaktion “sender” wird bei jeder Transaktion mitgegeben.
Der Besitzer bzw. Ersteller des Smart Contracts “o” ist unsere Ethereumadresse 0x1Fjxk… Die Tokenanzahl “t” beträgt eine Mio.
Funktion ICO (ETH)
Start
Ist t = 0 ? Falls ja, springe zu Ende
Ist der Sender in der Liste l schon vorhanden? Falls nicht erzeuge Eintrag und setze Tokenzahl l[sender].token auf 0
Subtrahiere von der Tokenzahl t ETH/0,01
Addiere zu l[sender].token ETH/0,01
Ist Tokenzahl t < 0? Falls ja, dann addiere zu l[sender].token t, setze t auf 0 und gib ETH-l[sender].token *0,01 an Ether zurück
Ende
Funktion Tokentransfer (empfänger, tokenanzahl):
Start
Sind alle Token verkauft? (t = 0 ?) Falls nicht springe zu Ende
Ist der sender in der Liste l enthalten? Falls nicht springe zu Ende
Hat der Sender die nötige Anzahl an Token? Falls nicht springe zu Ende.
Ist der Empfänger in der Liste l enthalten? Falls nicht erzeuge Eintrag mit seiner Adresse und dazugehöriger Variable für die Tokenanzahl und setze l[empfänger].token auf 0
Subtrahiere von der l[sender] die tokenanzahl
Addiere zur l[empfänger] die tokenanzahl
Ende
Funktion Zerstörekontrakt
Start
Ist sender.Adresse = o = 0x1Fjxk… ? Falls ja zerstöre den Smart Contract
Ende
Wenn man jetzt zum Beispiel Token an jemanden anderes Senden möchte, erstellt man eine Transaktion mit den Parametern, “wie viele”, “an wen” und der Schnittstelle in dem Fall Tokentransfer. Zusätzlich fügt man hinzu, wie viel Gas man maximal bezahlen möchte, wie das Konto (Ethereumadresse) lautet, wo sich der Smart Contracts befindet und sendet diese Transaktion ans Netzwerk. Jede Transaktion muss wie bei Bitcoin mit dem privaten Schlüssel signiert werden. Somit ist garantiert, dass “sender” auch wirklich der rechtmäßige Sender ist.
Vorteile von Smart Contracts
Wir erahnen aus unserem Beispiel, dass die Möglichkeiten von Interaktionen zwischen verschiedenen Parteien schier unendlich sind. Von Multisignaturwallets, wo mehrere Parteien ein Vermögen verwalten bis hin zu komplizierten automatisierten Bezahl bzw. Geschäftsabwicklungen ist alles möglich. Wahlen auf der Blockchain, tokenisierte Vermögenswerte, tokenisierte Immobilien, verwalten von Gegenständen aus Computerspielen oder Lieferkettenverfolgung sind gänzlich ohne Mittelsmann machbar.
Der Grad an Automatisierung ist enorm. So könnten z.B. die Steuern in Zukunft über einen Smart Contract in Echtzeit automatisch bezahlt werden und nicht wie heute durch Vorleistung und jeder Bürger durch die Transparenz sehen, wo genau sein Geld hinfließt. Smart Contracts sind, sofern sie richtig programmiert wurden zuverlässig und unveränderbar. Sie sind einfach zu implementieren und kostengünstig.
Nachteile von Smart Contracts
Die Techologie ist recht jung und muss noch reifen. Bei Ethereum z.B. herrscht das “Code is Law” Gesetz. Ein Fehler führt zu unumkehrbaren Situationen, eventuell Schäden. So geschehen bei der Parity Multisignaturwallet. Dort ist es einem Interakteur gelungen die Besitzeradresse einer Bibliothek mit seiner eigenen zu ersetzen. Dadurch hatte er Zugriff auf die Zerstörungsfunktion (siehe unser Beispiel) und führte sie aus, knapp 514.000 Ether klemmen bis heute in diesem Smart Contract fest.
In unserem Beispiel ist der Smart Contract durch die Zerstörungsfunktion, auf die der Erzeuger zugreifen kann ziemlich zentralisiert und verwundbar. Ein weiterer großer Nachteil ist die Unvermeidbarkeit von Programmierfehlern. Auch müssen die Interakteure selbst den Code lesen können oder eben Dritten vertrauen. Bösartige Programmierer könnten bewusst Hintertürchen einbauen. Diese Probleme will die Blockchainplattform EOS z.B. mit Ricardian Contracts lösen.
Fazit
Smart Contracts sind eine äußerst vielversprechende Technologie. Noch muss an den Problemen der zugrunde liegenden Blockchaintechnologie, Skalierung und Benutzerfreundlichkeit, gearbeitet werden. Wegen ihrer Vorteile in Sachen Automatisierung, Transparenz und Kosten werden Smart Contracts schon bald unseren Alltag beherrschen.
Kryptowährungen kannst du auf Binance*, Coinbase* oder eToro* kaufen. Hier geht es zu unserem ->Starterkit.
Folge uns auf Twitter, Instagram, Facebook, Steemit und tritt unserem Telegram News Kanal oder Newsletter bei.
Du würdest diesen Artikel gerne kommentieren? Dann tritt einfach unserer Telegram Diskussions-Gruppe bei.
*Die mit Sternchen (*) gekennzeichneten Links sind sogenannte Affiliate-Links. Wenn du über diesen Link etwas kaufst, bekommen wir eine kleine Provision vom Händler. Der Preis verändert sich dabei für dich nicht.