Motoko – die Programmiersprache des Internet Computers

Motoko ist eine von der Dfinity Foundation entwickelte Programmiersprache für den Internet Computer und seine besonderen Anforderungen.

Kategorisiert in Wissen

Der Internet Computer von Dfinity ist eine dezentrale Cloud-Computing Plattform. Sie erlaubt es Entwicklern Anwendungen und Dienstleistungen direkt im Internet zu veröffentlichen. Um es Entwicklern zu vereinfachen effiziente und robuste Anwendungen zu erstellen, hat Dfinity die Programmiersprache Motoko entwickelt.

Was ist Motoko?

Die Programmiersprache Motoko und das dazugehörige Software Developement Kit (SDK) erlaubt es einer breiten Gruppe von Entwicklern zuverlässige Websites, Unternehmenssysteme und Dienste für den Internet Computer zu erstellen. Der Internet Computer verfolgt die Idee einer dezentralen Alternative zum traditionellen Internet. Anwendungen, auch DApps genannt werden dabei in Canisters erstellt und auf die Blockchain des Internet Computers geladen. Canisters sind in ihrer Funktionsweise vergleichbar mit Smart Contracts auf der Ethereum Blockchain, bieten jedoch eine deutlich höhere Kapazität und Funktionalität.

Subnet von Software Canisters
Subnet von Software Canisters @dfiniity.org

Dfinity hat sich dazu entschieden eine eigene Sprache für die Erstellung von Canisters zu entwickeln. Sie soll Entwicklern eine nahtlosen Übergang zum Internet Computer Protokoll ermöglichen und das Programmieren von DApps erleichtern. Denn eine Sprache für den Internet Computer muss die Hauptkonzepte der Plattform unterstützen können. Dazu gehören unter anderem ein verteiltes Programmiermodel mit asynchroner Nachrichtenweitergabe oder die Unterstützung des Cycles Konzepts des Internet Computers. Mit einer nativen Sprache lässt sich das am besten durchsetzen, da sie für diese Umgebung optimiert ist.

Video: Motoko Coding Demo
*Mit dem Laden des Videos akzeptieren Sie die Datenschutzerklärung von YouTube. Mehr erfahren

Eine Programmiersprache abgestimmt auf WebAssembly

Für ein besseres Verständnis von Motoko und seinen Eigenschaften ist es wichtig sich zunächst näher mit WebAssembly auseinanderzusetzen. Dieses Low-Level-Codeformat, welches auch unter der Abkürzung wasm bekannt ist, wurde erstmals für Webbrowser eingesetzt. Das Ziel bei der Erstellung von WebAssembly war es einen offenen Standard zu entwickeln, der portabel, sicher und effizient ist. Als Open Standard ist Wasm außerdem an keine bestimmte Programmiersprache, Computerumgebung oder Plattform gebunden und ist daher universell einsetzbar. Das macht sie so besonders.

Der Open Standard Wasm (WebAssembly) ist universell einsetzbar

Denn im Gegensatz zu anderen virtuellen Maschinen abstrahiert WebAssembly lediglich die zugrunde liegende Hardware. Ein Bytecode aus wasm entspricht dabei den Anweisungen und dem Speichermodell von modernen CPUs. Die starke Modularität und die strenge mathematische Spezifikationen des WebAssembly Sandboxing stellen sicher, dass die Ausführung sicher beinahe vollständig deterministisch ist. Diese und viele andere Eigenschaften von Funktionen von WebAssembly machen es zu einer idealen Wahl für den Internet Computer.

Die Portierung einer bestehenden Programmiersprache nach WebAssembly ist jedoch nicht so einfach, da es mit einigen Hürden wie zum Beispiel:

  • Implementierung eines neuen Compiler-Backend
  • Portierung von Laufzeitsystemen und Bibliotheksprimitive
  • Einfügen von Threads, Co-Routinen, Tail Calls oder Exceptions

Besonders für anspruchsvollere Anwendungen und Funktionen auf dem Internet Computer ist es wichtig eine Sprachimplementierung für WebAssembly zu haben, die diese Features erfüllen kann. Gleichzeitig muss diese Programmiersprache eine hohe Sicherheit bieten, sowie leicht zugänglich und effizient sein. Um diese Anforderungen zu erfüllen hat Dfinity die Programmiersprache Motoko entwickelt.

Erstellung einer Internet-Computer Dapp per  MacOS Terminal
Erstellung einer Internet-Computer Dapp per MacOS Terminal

Funktionen und Eigenschaften von Motoko

Eines der wichtigsten Merkmale von Motoko ist die direkte Unterstützung von Aktoren. Das Aktormodell wurde erstmals 1973 beschrieben, genießt heute jedoch außerhalb der Fachkreise wenig Bekanntheit. In der Informatik handelt es sich bei Aktoren um nebenläufige Einheiten. Sie verfügen über keinen geteilten Speicherplatz. Stattdessen kommunizieren sie ausschließlich über Nachrichten. Dieses Prinzip ist vergleichbar mit der Kapselung in der objektorientieren Programmierung. Alle Nachrichtenübermittlungen im Aktormodell sind asynchron. Außerdem entstehen keine Warteschlangen, auch wenn Nachrichten gleichzeitig gesendet werden. Denn die Ausführung erfolgt atomar.

Das Aktormodell und seine Eigenschaften sind ideal für die Parallele Programmierung von Canisters. Das macht es auch für den Internet Computer besonders attraktiv. Denn die Canister stimmen in einigen Eigenschaften mit Aktoren überein, werden jedoch als WebAssembly Module dargestellt. Sie können über die Subnets hinweg miteinander kommunizieren. Das Speicherkonzept von WebAssembly erlaubt die direkte Verwaltung von bis zu 4 Gibibyte. Durch die Verknüpfung von Canistern ist der Speicher noch erweiterbar.

Ein weiteres Element, das bei der Entwicklung von Motoko aufgenommen wurde, sind Futures. Auch hierbei handelt es sich um ein Konzept aus der Informatik, das mehr als 40 Jahre alt ist. Futures erleichtern die asynchrone Programmierung. Ein Future bezeichnet man auch als Promise, da es sich im Grunde um einen Platzhalter für eine häufig noch nicht abgeschlossene Berechnung handelt.

In Kombination mit dem Aktormodell sind die Futures für Motoko besonders wichtig. Denn in der Regel wäre ein Aktor und jede andere Methode mit einem asynchronen Ergebnis blockiert, solange die Antwort auf eine gesendete Nachricht noch aussteht. Für DApps und Websites, die nicht lokal gespeichert und mehrfach aufgerufen werden, wäre die Umsetzung in dieser Form undenkbar. Das Konzept von Futures umgeht jedoch diese Blockade und erlaubt es Aktoren in der Zwischenzeit andere Nachrichten zu erhalten, sofern es sich um Futures handelt. Das Future Element zeigt sich in Motoko in Form von sogenannten async Values.

Bei der Entwicklung von Motoko war ein weiterer Faktor besonders wichtig. Die Dfinity Foundation wollte es Entwicklern ermöglichen, die Blockchain Technologie zu nutzen, ohne zu tief in das Fachwissen eintauchen zu müssen. Aus diesem Grund verzichtet Motoko zum Großteil auf die klassischen Elemente und Begriffe aus der Blockchain Programmiersprache. Entwickler müssen sich nicht mit Blöcken, Blockhöhen (Block Height), Status-Update der Blockchain und ähnliches auseinandersetzen.

Der Internet Computer setzt auf orthogonale oder auch transparente Persistenz. In der Programmiersprache Motoko zeichnet sich die orthogonale Persistenz so aus, dass Entwickler sich nicht explizit um das Speichern ihres Datenstatus zwischen dem Empfang von Nachrichten, ebenso wenig kümmern müssen wie um Dateien oder externe Datenbanken.

Alle in Programmvariablen gespeicherten Werte und Datenstrukturen sind auch nach dem Empfang der nächsten Nachricht noch vorhanden. Wieviel Zeit in zwischen vergangen ist, spielt dabei keine Rolle. So gehen die Daten selbst nach Monaten nicht verloren. Die Plattform sorgt dafür, dass der private Status eines Canisters zwischen den Aufrufen transparent gespeichert und wiederhergestellt wird. Zur Vereinfachung der Bedienung wurde Motoko außerdem so konzipiert, dass Nutzer, die mit JavaScript und anderen gängigen Sprachen vertraut sind, sich intuitiv schnell zurecht finden können.

Motoko Playground Bildschirm
Motoko Playground Bildschirm

Motoko Playground – die Programmiersprache kennenlernen

Für Entwickler und Interessierte, die die native Sprache des Internet Computers näher kennenlernen und sie ausprobieren möchten, bietet sich der Motoko Playground an. Es erlaubt dem Benutzer, Motoko Canister direkt im Browser zu erstellen und zu veröffentlichen. Weitere Schritte wie das Herunterladen der SDK, die Einrichtung einer lokalen Entwicklungsumgebung oder ein Wallet sind dabei nicht mehr nötig. Im Motoko Playground kann der Nutzer entweder ein neues Projekt beginnen oder sich an Modellprojekten wie zum Beispiel Hello World, Calculator und ähnlichem ausprobieren.

Der Motoko Playground setzt sich zusammen aus einem Frontend und einem Backend, zu dem jeweils verschiedene Elemente gehören.

Das Frontend ist eine Webanwendung, die von einem Asset Canister bedient wird. Er besteht aus:

  • einem Motoko-Compiler, der von Bytecode auf JavaScript übersetzt (js-of-ocaml)
  • einem Monaco-Editor, der die Motoko-Syntaxvalidierung unterstützt
  • dem Vessel Package Manager, der für das Laden der Bibliotheken verantwortlich ist
  • das Bereitstellungsmodul, welches ein Kanister-Upgrade, eine Actorclass und eine Candid UI integriert
  • das Code-Import-Modul, das erlaubt, jeden Motoko Code von GitHub zu importieren

Das Backend ist ein Canister auf dem Internet Computer, der alle von den Benutzern bereitgestellten Canisters verwaltet. Jeder von Nutzern erstellte Canister hat zunächst einen Cycle von 0,5 t und ist damit für etwa 10 Minuten verfügbar. Das erlaubt es Nutzern Programme und Codierungen kostenlos zu testen oder sich einfach mit der Programmiersprache Motoko auseinanderzusetzen. Damit jedoch keine Cycles verschwendet werden, darf der Canister keine Cycles übertragen. Um eine unzulässige Übertragung zu vermeiden, wurde deshalb die Übertragungsanweisung auf der WebAssembly Ebene entfernt. Um die Ressourcen-Fairness sicherzustellen und Verschwendung zu vermeiden, ist außerdem ein Proof-of-Work-Konsens erforderlich, wenn der Nutzer eine Canister-ID anfordert.

Motoko Logo
Motoko Logo @dfinity.org

Fazit

Dfinity arbeitet aktuell daran SDKs für die bekannten Programmiersprachen C und Rust zu entwickeln. Langfristig planen die Entwickler zahlreiche SDKs für verschiedene andere gängige Sprachen anzubieten. So soll möglichst vielen Entwicklern der Zugang zum Internet Computer leichter fallen. Dennoch ist Motoko aufgrund seiner besonderen Eigenschäften und Möglichkeiten die beste Lösung für Programmierer, die Anwendungen und Websites für den Internet Computer entwickeln möchten. Denn die eigens für den Internet Computer entwickelte Programmiersprache erfüllt die anspruchsvollen Anforderungen eines Projekts dieser Größenordnung. Außerdem kompiliert die Programmiersprache gut mit WebAssembly, eines der Schlüsselelemente für die Funktionsfähigkeit eines dezentralen, offenen Internets.

Artikel teilen:

Von Kai Schiller

Kai Schiller ist der Gründer von internet-computer.de - Aufbauend auf seinen Kernkompetenzen Digital-Wirtschaft, Blockchain und DLT - gehört seine Leidenschaft der Planung, Umsetzung und Steuerung von neuen Projekten. Erreichbar über LinkedIn