iteratec Blog

Wie funktioniert eigentlich die Blockchain? Teil 2 Smart Contracts

Geschrieben von Dr. Zoltan Fazekas | 11.10.2020 22:00:00
In dieser Blogserie gehen wir näher auf Blockchain ein und widmen uns dabei verschiedenen Fragestellungen:

Im ersten Teil der Blogserie über Blockchain haben wir uns mit der verteilten Datenhaltung, der Transaktionsverarbeitung und dem Consensus-Mechanismus gewidmet. In diesem Beitrag geht es um Smart Contracts, die unter den Blockchain-Konzepten wohl am häufigsten missverstanden werden. Die Verwirrung beginnt schon beim Namen. Smart Contracts sind nämlich weder smart, zumindest nicht smarter als andere Software, noch sind sie Verträge, jedenfalls nicht im juristischen Sinne. Anstatt einer allumfassenden allgemeingültigen Definition werde ich das Konzept der Smart Contracts, wie sie in der Ethereum Blockchain implementiert sind, erklären.

Inhalt

 

Was sind Smart Contracts?

Smart Contracts in Ethereum sind Programme, die samt Code und Daten (sog. State) in der Blockchain gespeichert sind. In der Blockchain gespeicherte Smart Contracts werden auf allen Nodes des jeweiligen P2P-Netzwerks gespeichert und auf allen Nodes, die am Consensus teilnehmen, simultan ausgeführt. Eine Besonderheit dieser Programme ist, dass sie neben Daten auch ein Konto besitzen und Kryptogeld halten, genauso wie es Benutzer tun. Benutzer können den Smart Contracts Geld überweisen und auch die Smart Contracts können den Benutzern und anderen Smart Contracts Geld schicken.

Eine weitere Besonderheit vom Smart Contracts ist, wie sie ausgeführt werden. User können sich über ihre Frontends - das sind klassische Softwareprogramme wie beispielsweise eine Webseite oder mobile App - mit einer Node im Netzwerk verbinden und über diese Node mit Smart Contracts interagieren. Wenn diese Interaktion darin besteht, den Kontostand oder andere Daten der Smart Contracts abzufragen, dann kann die verbundene Node diese Anfrage anhand ihrer lokalen Kopie der Smart Contracts beantworten. Will der Benutzer über das Frontend jedoch einem Smart Contract Geld senden oder die Daten eines Smart Contracts aktualisieren, muss dies auf allen Nodes passieren und die verbundene Node dient dabei lediglich als Eintrittstor ins Netzwerk.

Diese Node übergibt die gewünschte Transaktion - so heißen Interaktionen zwischen Benutzern und Smart Contracts in Ethereum - an ihre Nachbarn und diese geben sie weiter bis die Transaktion auf allen Nodes des Netzwerks ankommt. Die Nodes sammeln diese Transaktionen in einem Pool. Daraus wählen sie die Transaktionen aus, die sie in den Block inkludieren wollen, den, falls sie im Rahmen des Consensus ausgewählt werden, sie an die Kette anhängen. Das bedeutet nichts anderes, als dass sie die ausgewählten Transaktionen in den Block schreiben, der Reihe nach ausführen und die Ergebnisse der Ausführung ebenfalls im Block vermerken. Die Ausführung einer Transaktion, die eine Interaktion mit einem Smart Contract involviert, kann einerseits dessen Kontostand erhöhen, falls der Benutzer auch Geld mitgeschickt hat. Andererseits kann sie die Ausführung einer in der Transaktion definierten Funktion des Smart Contracts auslösen. Diese Funktion ändert dann die Daten im Smart Contract in Abhängigkeit von den Parametern, die in der Transaktion mitgeschickt wurden. Das Ergebnis der Transaktion sind die durchgeführten Änderungen an den Daten und ggf. dem Saldo des Smart Contracts. Sie werden in einem sog. Transaction Receipt aufgezeichnet. Weil die Transaktion immer verzögert ausgeführt wird - zuerst muss sie im gesamten Netzwerk verteilt und dann von den Nodes für ihren nächsten Block ausgewählt werden - ist eine sofortige synchrone Rückgabe von Ergebniswerten ans Frontend nicht möglich. Hier kommt wieder die mit dem Frontend verbundene Node ins Spiel. Sie kann das Frontend nämlich, sobald sie über die Ausführung der Transaktion im Rahmen des neuen Blocks erfährt, benachrichtigen und das Ergebnis mitliefern.

 

Pogrammierung von Smart Contracts

Die meist verbreitete Programmiersprache für die Erstellung von Ethereum Smart Contracts ist Solidity. Die Syntax ähnelt JavaScript, die primitiven Datentypen sind die gleichen wie in C/C++ und die Mehrfachvererbung funktioniert wie in Python. Für alle, die mit objektorientierter Programmierung etwas anfangen können, wird folgende Erklärung nützlich sein: Smart Contracts in Ethereum sind im Grunde genommen Objekte, d. h. Instanzen von Klassen. Die Klasse definiert, welche Attribute (Eigenschaften) und Methoden (Funktionen bzw. Verhalten) die Objekte dieser Klasse besitzen. In jedem Objekt haben die Attribute individuelle Werte, die sich verändern können, z. B. bei der Ausführung von Methoden, die durch andere Objekte oder externe Akteure aufgerufen werden. Die Definition eines Smart Contracts in Solidity ist eine Klasse, die mehrfach auf die Blockchain deployed und somit instanziiert werden kann. Dadurch entstehen unabhängige Objekte mit unterschiedlichen Adressen. Eine Transaktion ist nichts anderes als der Aufruf einer Methode eines Smart Contracts. Die Methoden haben Parameter und Zugriff auf die Attribute und können andere Methoden von demselben oder anderen Smart Contracts aufrufen. Wie schon erwähnt, werden Konzepte wie Vererbung, aber auch Interfaces und abstrakte Klassen, wie man sie aus Java kennt, unterstützt. Im Folgenden ist ein Smart Contract zur Abbildung eines einfachen Telefonbuchs dargestellt:

contract PhoneBook {
/* Store a single phone number for each address */
mapping(address => string) phoneNumbers;

/* Update the phone number of the message sender */
function updateMyPhoneNumber(string myPhoneNumber) public {
phoneNumbers[msg.sender] = myPhoneNumber;
}

/* Look up the phone number of the message sender */
function findMyPhoneNumber() constant returns (string) {
return phoneNumbers[msg.sender];
}
}

 

Sparsamkeit beim Code und Speicherplatz

Die Entwicklung von Smart Contracts ist trotzdem speziell, insbesondere was zukunftsfähiges Design und die gebotene Sparsamkeit beim Code und Speicherplatz anbelangt. Der Grund für Letzteres ist, dass die Methodenaufrufe im Rahmen von Transaktionen auf allen Nodes im Netzwerk ausgeführt werden müssen und die Attribute der Smart Contracts ebenso auf allen Nodes gespeichert werden müssen. Dies dient zwar der Manipulationssicherheit des Netzwerks, verursacht aber um ein Vielfaches mehr Kosten, als es bei einem klassischen System der Fall wäre. Diese Kosten werden während der Ausführung der Transaktionen von den Nodes mitgezählt - die Einheit wird in Ethereum als Gas bezeichnet - und vom Konto des Aufrufers, d.h. des Benutzers, der über sein Frontend die Transaktion gestartet hat, bezahlt. In punkto zukunftssicheres Design ist noch zu erwähnen, dass der Code von Smart Contracts auch in der Blockchain gespeichert wird und somit unveränderbar ist. Um notwendige Fehlerbehebungen und Erweiterungen durchzuführen oder nicht mehr benötigte Smart Contracts unerreichbar zu machen, gibt es eine Reihe von Best Practices und Design Patterns. Es ist empfehlenswert sich mit ihnen vertraut zu machen, bevor man mit der Entwicklung von Smart Contracts beginnt.

 

Kommunikation nach außen

Wichtig ist noch anzumerken, dass Smart Contracts zwar miteinander kommunizieren aber sonst keine Kommunikation nach außen durchführen können, d. h. sie haben weder Zugriff auf Internetdienste noch auf das Filesystem. Falls benötigt, müssen sie durch vertrauenswürdige externe Datenquellen, sog. Oracles, mit Daten versorgt werden. Sogar auf die eigene Blockchain haben sie nur eingeschränkte Sicht. Nichtsdestotrotz sind sie ein mächtiges Instrument, um komplexe Blockchain-Anwendungen zu entwickeln. Neben den Frontends, die Benutzer zur Interaktion benötigen, bilden sie das Rückgrat von Blockchain-Anwendungen, der sog. ĐApps.

Im nächsten Teil schauen wir uns ein Beispiel für ĐApps näher an.

 

Noch Fragen?

Wie können Sie Chancen und mögliche Einsatzfelder von Blockchain-Lösungen identifizieren und diese in Ihrer Organisation umsetzen? Erfahren Sie, wie wir Sie beim Thema Blockchain unterstützen können:

 

Dr. Zoltan Fazekas - arbeitete seit 1997 in verschiedenen IT-Positionen als Software Engineer und Architekt, Projektmanager, Berater und zuletzt als Mitglied der iteratec Geschäftsleitung. Er beschäftigte sich mit Entrepreneurship, Customer Centric Innovation und disruptiven Technologien.  Wir schätzen seinen Beitrag und informieren, dass er nicht mehr bei iteratec tätig ist.