Anzeige
Anzeige
Ratgeber
Artikel merken

Ethereum und Webassembly: So programmierst du Smart Contracts

Ethereum steht hinter einer der populärsten Kryptowährungen – und doch ist es noch sehr viel mehr. Damit kann kryptografisches Geld dank Algorithmen nämlich völlig ­autonom verwaltet werden. Aber wie funktionieren die sogenannten Smart Contracts und wo geht die Reise hin?

Von Lars Hupel
7 Min. Lesezeit
Anzeige
Anzeige
Wie funktionieren die sogenannten Smart Contracts und wo geht die Reise hin? (Abbildung: Shutterstock)

Wie funktionieren Smart Contracts in Ethereum?

Um das Prinzip der Smart Contracts in Ethereum zu verstehen, ist es notwendig, zunächst einen kurzen Exkurs in die Welt der Programmiersprachen zu unternehmen. Die gängigen Programmiersprachen teilen sich grundsätzlich in zwei Gruppen: interpretierte und kompilierte Sprachen. Bei der ersten Gruppe schreibt man Programme in einer Hochsprache, die dann von einem Interpreter ausgeführt werden. Zwei populäre Beispiele dafür sind Python und JavaScript. Interpretierte Sprachen sind in vielen Anwendungsdomänen (wie zum Beispiel im Web) verbreitet, denn man kann sofort loslegen. Außerdem sind sie sehr universell und auf verschiedenen Plattformen einsetzbar, ohne dass man weiteres Tooling braucht.

Anzeige
Anzeige

Demgegenüber stehen kompilierte Sprachen, bei denen zunächst ein Compiler den Programmtext in eine andere Sprache – oft binärer Maschinencode – überführt. Dieser Binärcode ist plattformabhängig und wird direkt auf einem Prozessor ausgeführt. Der ­Compiler kann (und muss) maßgeschneiderten Code für den Befehlssatz des Prozessors ausgeben, zum Beispiel für ARM- oder Intel-kompatible CPU. Bekannte Vertreterinnen dieses Typus sind C und Rust.

Die Realität ist jedoch wie immer komplexer, als diese ein­fachen Kategorien suggerieren. Seit längerer Zeit gibt es ­Mischformen, wie zum Beispiel Java. Der Java-Compiler übersetzt ­nämlich Java-Code nicht direkt in „echten“ Maschinencode, sondern in ein spezielles ­Zwischenformat. Dieses Zwischenformat wiederum wird dann von einem Interpreter – der Java Virtual Machine – auf der konkreten ­Prozessorarchitektur ausgeführt.

Anzeige
Anzeige

(Abbildung: Lars Hupel)

Auf ähnliche Weise funktionieren auch die Smart Contracts in Ethereum. Sämtliche Knoten, die in Ethereum Transaktionen validieren und neue Währung schürfen, beinhalten eine Instanz der ­Ethereum Virtual Machine (EVM). Im Yellow Paper, der technischen Spezifikation von Ethereum, ist haarklein definiert, ­welche Instruktionen die EVM unterstützen – und wie sie auszuführen sind.

Anzeige
Anzeige

Es handelt sich dabei um eine Eigenentwicklung, die zahlreiche Besonderheiten aufweist:

  • Interaktion mit der äußeren Welt ist nicht möglich: ­Sämtliche algorithmischen Entscheidungen müssen sich aus der ­Blockchain und ihren Transaktionen ergeben.
  • Arithmetik basiert auf 256-Bit-Werten, um das Hantieren mit ­Adressen und größeren Geldbeträgen zu erleichtern.
  • Spezialoperationen wie die Hash-Funktionen sind zur Performance-­Steigerung direkt eingebaut.
  • Sämtlichen Instruktionen ist eine Kostenfunktion (engl. Fuel) zugeordnet, die grob der nötigen Ausführungszeit und dem Speicher­aufwand entspricht. Im Englischen ist der Begriff ­Metering üblich.
  • Programmieren auf der EVM

Ähnlich wie im Java-Ökosystem gibt es mehrere Programmiersprachen, für die EVM-Compiler zur Verfügung stehen. Die verbreitetste Sprache ist Solidity, die oberflächlich (syntaktisch) an JavaScript erinnert. Stand Ende 2020 listet die Ethereum-­Dokumentation noch zwei weitere Sprachen: Vyper, die sich an Python orientiert, und Yul Plus, eine komplett eigenständige ­Entwicklung.

Anzeige
Anzeige

Auch interessant: „Ethereum-Gründer Vitalik Buterin: Philosoph im Regenbogen-Shirt“

Gemein ist all diesen Sprachen, dass sie domänenspezifisch sind, denn im Gegensatz zu den General-Purpose-Languages besetzen sie eine Nische mit speziellen Features und insbesondere einer speziellen Runtime: der EVM. Natürlich sind solche domänen­spezifischen Sprachen (DSL) grundsätzlich eine gute Idee, um die Komplexität von Anwendungen zu reduzieren.

Doch im Falle der EVM erscheint das wenig sinnvoll. Schließlich kann sie – ungeachtet der fehlenden Interaktionsmöglich­keiten mit der Blockchain-externen Welt – beliebige Algorithmen ausführen, ist also (vereinfacht ausgedrückt) Turing-vollständig.

Warum nutzt man nicht eine existierende Sprache und Laufzeitumgebung?

Gegebenenfalls müsste man dann zwar Features entfernen, könnte aber auf eine längere Erfahrung, stabileres Tooling und – viel wichtiger – eine breitere Basis von Programmierern zurückgreifen. Denn es ist ein alter Hut, dass heutzutage für die Popularität einer Programmiersprache nicht nur ausschlaggebend ist, ob man in ihr besonders konzis, typsicher oder dynamisch programmieren kann, sondern auch, wie einfach man auf wie viele existierende Bibliotheken und Pakete zugreifen kann. Besonders wird dieser Zeitenwandel von JavaScript illustriert, das oft für seine krude Semantik kritisiert wird, aber spätestens seit dem Millionsten NPM-Paket als ­populärste Programmiersprache gelten muss.

Anzeige
Anzeige

Webassembly, eine universelle ­Zwischensprache

Die Menschen hinter der Ethereum-Spezifikation sind zu dem Schluss gekommen, dass sich einige Probleme durch eine Migration weg von einer Eigenentwicklung hin zu einer Universal­sprache lösen lassen. Wie praktisch, dass im Web gerade die Entwicklung im Gange ist, eine Alternative zum Platzhirschen JavaScript zu etablieren: Webassembly (WASM). Dabei handelt es sich zugleich um eine universelle Zwischensprache und ein Binärformat, ­gepaart mit einer Spezifikation für Interpreter. Der offene ­Standard war – wie der Name bereits nahelegt – ­ursprünglich für das Web ersonnen worden; mittlerweile werden aber auch weitere ­Anwendungsgebiete (zum Beispiel Smartphone-Apps) diskutiert.

Vorangetrieben wird die Entwicklung von WASM von Branchen­größen wie Microsoft, Google und Apple. Die Sprache zeichnet aus, dass sie von Anfang an für Portabilität ausgelegt ist. Erkennbar ist das daran, dass zahlreiche existierende Programmiersprachen wie Rust, C++ oder Go bereits für Webassembly kompilieren können.

(Abbildung: Lars Hupel)

Eine perfekte Grundlage also auch für Smart Contracts? Tatsächlich scheint Webassembly wie geschaffen für diesen Einsatzzweck. Auch im Browser – die ursprüngliche Domäne für WASM – ist es nötig, den laufenden Code stark zu reglementieren, um Sicherheitslücken zu verhindern. Ferner sorgt die Tatsache, dass WASM keine Garbage-­Collection aufweist, man sich also als Programmierer selbst um die Speicherverwaltung kümmern muss, für die deterministische Ausführung von Algorithmen. Als Dreingabe gibt es solide und effiziente Interpreter, die für verschiedene Plattformen verfügbar sind.

Anzeige
Anzeige

Ethereum ­flavored Webassembly

All das sind auch Kriterien, die für die Gestaltung einer ­Blockchain äußerst wichtig sind. Daher wird die Verwendung von Ethereum ­flavored Webassembly (EWASM) folgerichtig in der Langzeitplanung von Ethereum 2 angestrebt. EWASM ist vollständig kompatibel zu WASM, führt allerdings eine zusätzliche Schnittstelle zu der Blockchain ein, um typische Ethereum-­Operationen steuern zu können (zum Beispiel den Transfer von Tokens). Für Ethereum-Nutzer ist die Interaktion mit EWASM-Smart-Contracts transparent und funktioniert genau wie EVM-Verträge.

Smart Contracts in Webassembly

Wie aber geht man vor, wenn man einen Smart Contract in EWASM programmieren will? Zum einen benötigt man ein passendes Ethereum-Netzwerk. Denn so schön die Vision von ­Ethereum 2.0 ist, so ist sie eben nur eine Vision. Unglücklicherweise existiert kein offizielles ­Testnetzwerk, aber man kann auf Oasis Ethereum ausweichen, das mit ­Ethereum kompatibel ist und gewissermaßen eine Vorschau auf das zukünftige ­Ethereum 2.0 bietet.

Außerdem benötigt man noch eine Programmiersprache, um keinen Assembly-Code von Hand schreiben zu müssen. ­Viele Vorzüge bietet hier Rust. Dank Unterstützung von WASM im Rust-Compiler lassen sich direkt kompatible Smart Contracts aus einem Rust-Programm erzeugen. Allerdings ist Rust derzeit keine vernünftige Wahl für Ethereum, denn die Toolchain ist noch zu fragil. Die meisten Beispiele, die man dafür im Netz findet, sind kurz nach Veröffentlichung schon wieder veraltet.

Anzeige
Anzeige

Solidity

Deswegen lohnt sich hier stattdessen ein Blick auf Solidity. Das klassische Beispiel für einen Smart Contract in Solidity ist ein ERC-20-­Token, eine standardisierte Schnittstelle, um ­beliebige Token auf der Ethereum-Chain zu verwalten. Standardmäßig verwendet Ethereum die Währung Ether. Mit ERC-20-Token kann man weitere Währungen definieren, beispielsweise einen Token, der eins zu eins gegen Euro eingetauscht werden kann. Ein solcher Vertrag hat eine feste Struktur. Grundsätzlich gibt es in dem Vertrag Speicherfelder für:

  • Umlaufmenge der Token (es kann also eine Obergrenze ­festgelegt werden)
  • Derzeitige Kontostände

In Solidity lässt sich das wie folgt definieren:

uint256 private totalSupply;
mapping(address => uint256) private balances;
Schließlich gibt es noch Methoden, um Token von einem Konto zu einem anderen zu transferieren. Dazu muss man ­sicherstellen, dass es nicht zu einem Under- oder Overflow kommt:
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, „SafeMath: addition overflow“);

return c;
}

function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, „SafeMath: subtraction overflow“);
uint256 c = a - b;

return c;
}

Diese beiden Methoden dienen der sicheren Addition beziehungsweise Subtraktion von zwei Zahlen. Wenn zum Beispiel auf dem Quellkonto nicht genügend Token vorhanden sind, wird die Transaktion mit einer Fehlermeldung („Subtraction Overflow“) abgebrochen. Die eigentliche Transferfunktion ist dann schnell implementiert:

Anzeige
Anzeige
function transfer(
address recipient,
uint256 amount
) {
balances[msg.sender] = sub(balances[msg.sender], amount);
balances[recipient] = add(balances[recipient], amount);
}

Zunächst wird der Kontostand beim Sender verringert, anschließend bei der Empfängerin erhöht. Ein Aufruf dieser Methode ist immer transaktional: Wenn entweder der Empfänger bereits zu viele oder die Absenderin nicht genug Token hat, wird keine der beiden Operationen durchgeführt. Mittels des SOLL-Compilers lässt sich der obige Solidity-Code nach Webassembly übersetzen.

(Abbildung: Lars Hupel)

Deployment und andere Möglichkeiten

Diese fertige WASM-Datei kann man wie üblich bei Ethereum mit web3.js auf einer Blockchain deployen. Will man dazu Oasis benutzen, lässt sich ein entsprechender Provider konfigurieren. Man kann dabei entweder im Browser oder in Node.js arbeiten.

Um den Vertrag zu deployen, muss man eine neue Trans­aktion erstellen, die keine Empfängeradresse angegeben hat. Als Daten übergibt man den HEX-codierten String des ­Webassembly-Codes:

Anzeige
Anzeige
const receipt = await web3.eth.sendTransaction({ from: 0, data: "0061736d...", gas: 10000000 });
console.log(receipt.contractAddress);

Wenn alles richtig gelaufen ist, gibt die letzte Zeile die Adresse des neu erstellten Vertrags aus:

'0xad1c3896b09F86906030654F6e92D61bf0D24293'

Neben der Verwendung in einer Blockchain kann der vom ­Compiler erzeugte WASM-Code theoretisch auch unverändert im Browser ausgeführt werden, sofern man die nötigen Ethereum-­Funktionen bereitstellt. Die Webassembly-Tools bieten auch noch eine Reihe anderer Möglichkeiten der Verarbeitung, zum Beispiel lässt sich der Binärcode nach C übersetzen. Es wäre also durchaus möglich, den gleichen Code sowohl in Smart Contracts als auch in klassischen Applikationen zu benutzen.

Fazit

Mit EWASM hat die Ethereum-Community die Weichen gestellt, um Smart Contracts zukünftig auf eine solide Basis zu stellen. Im Gegensatz zur selbst gestrickten EVM bietet Webassembly handfeste Vorteile – zum Beispiel die breite Anwendbarkeit und höhere Sicherheit dank zahlreicher Analysemöglichkeiten.

Verschiedene Ethereum-Clients implementieren diese alter­native VM bereits, sind aber teilweise noch nicht zueinander kompatibel. Schade ist, dass die Rust-Toolchain noch nicht ­sauber in Ethereum integriert ist. Da die Entwicklung von Ethereum 2.0 aber laufend voranschreitet und ein hohes Interesse an Webassembly besteht, gibt es hoffentlich bald ein robusteres ­Tooling.

Dieser Artikel erschien ursprünglich in der t3n 63 Hier findest du die neuesten Magazin-Ausgaben und hier unser Archiv.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
Schreib den ersten Kommentar!
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige