Datenarchitektur der Libra Blockchain – Teil 2 – account state

Die Libra Blockchain ist die Plattform, mit der in Zukunft die Kryptowährung Libra unterstützt werden soll. Dank ihr wird es möglich sein, einen Betrag an Libra zu «besitzen» oder eine bestimmte Summe Libra an einen Empfänger zu «überweisen». Es ist deshalb naheliegend, dass man auf der Libra Blockchain etwas wie ein «Konto» erwartet, ein Konto, das jemandem gehört und unter dem die Libra Blockchain ein Libra-Guthaben führt.

Zwingend ist das für eine Kryptowährung jedoch nicht: Bitcoin, die «Mutter aller Blockchains», kennt keine derartigen Konten mit aktuellen Bitcoin-Saldi. Die Libra Blockchain im Gegensatz dazu schon, ebenso wie ethereum, ihre Schwester-Blockchain. Sie führt sogenannte accounts mit einem account state.

Die Adresse eines accounts

Jeder account hat eine eindeutige Adresse. Ähnlich wie eine IBAN-Nummer, die ein traditionelles Bankkonto heute eindeutig identifiziert, soll sie einem Libra-account einen eindeutigen Namen geben. Damit ist die Ähnlichkeit aber schon erschöpft. Das Format einer account address ist mit einer IBAN nicht vergleichbar. Eine account address ist einfach eine Folge von 32-Bytes.

Sie besteht voll ausgeschrieben aus einem einleitenden 0x als Hinweis, dass jetzt eine Hexadezimalzahl folgt, gefolgt von 64=32*2 Hexadezimal-Ziffern, zum Beispiel

0xc5b59df503dfc2a9170f47134a8b88b8820000a2e6ed4cd109d7f6a0d05e3160

In diesem und folgenden Blog-Beiträgen verwenden wir oft eine Kurzform davon. Hier zwei Beispiele.

Der account state

Unter einer account address bewirtschaftet die Libra Blockchain tatsächlich ein aktuelles Guthaben an Libra im account state.

Weil die Libra Blockchain heute praktisch immer in einem Atemzug mit der Kryptowährung Libra diskutiert wird, geht leicht vergessen, dass Transaktionen auf der Libra Blockchain nicht nur Geldeinheiten in der Libra-Währung von einem account zum anderen überweisen können.

Mit resources bezeichnet die Libra Blockchain alle Daten, die man im account state hinterlegen kann. Jedermann kann auf der Libra Blockchain eigene Typen von resources definieren, resources dieses Typs in Transaktionen verarbeiten und resources im account state ablegen. Dafür ist anwendungsspezifischer Code nötig, den man in anderen Blockchain-Systemen als «Smart Contracts» und in der Libra Blockchains als modules bezeichnet.

Der Code (die modules) wird gleich wie die Daten (die resources) im account state abgelegt.

Der account state besteht also in einer ersten groben Einteilung aus zwei Teil-Datenbeständen:

  1. den modules, einem Bestand von Code-Modulen mit resource-Typen und ausführbarem Code zur Verarbeitung von resources dieser Typen

  2. den resources, den eigentlichen Daten, die im account state gespeichert sind

resources im account state

Aus logischer Sicht behandelt die Libra Blockchain den account state für resources wie ein Dateisystem. Natürlich kennt sie im account state keine «Laufwerke», «Verzeichnisse» oder «Dateien», aber sie gliedert den Datenbestand so, wie ein Dateisystem in «Laufwerke», «Verzeichnisse» und «Dateien» gegliedert ist: Sie legt eine resource (die «Datei») unter einem bestimmen Zugriffspfad (dem «Verzeichnis») in einem spezifischen Bereich für den Typ dieser resource (dem «Laufwerk») ab.

Auf der obersten Ende der Hierarchie, auf der Ebene der «Laufwerke», unterteilt die Libra Blockchain den account state in Speicherbereiche pro module. Jeder account state verfügt zum Beispiel über das «Laufwerk» 0x0.LibraAccount, im dem der aktuelle Libra-Saldo dieses accounts abgelegt ist. 0x0.LibraAccount ist das module für die Bewirtschaftung von Libra-Geldeinheiten.

Woher stammt diese kryptische Bezeichnung 0x0.LibraAccount? Jedes module auf der Libra Blockchain ist eindeutig identifiziert durch einen Namen und die account address, unter der es publiziert wird. Im Fall von 0x0.LibraAccount ist 0x0 die account address und LibraAccount der Name des modules. Das module 0x0.LibraAccount wurde also unter der Adresse der Libra Association publiziert, wenig überraschend für ein derart grundlegendes module.

Auf der nächsten Hierarchieebene gliedert die Libra Blockchain den Speicherbereich in Verzeichnisse, die gleich aufgebaut sind, wie Verzeichnisse in einem Unix-Dateisystem. Der Zugriffpfad /T/balance/T/value ist zum Beispiel der Pfad zum aktuellen Libra-Saldo innerhalb des «Laufwerks» 0x0.LibraAccount im account state.

Auf der untersten Ebene, auf der Ebenen der «Dateien», speichert die Libra Blockchain den Wert einer resource ab, konvertiert in eine rohe Byte-Sequenz. Unter dem Zugriffspfad 0x0.LibraAccount/T/balance/T/value speichert sie beispielsweise in einem account state den aktuellen Libra-Saldo als Integer-Wert (64 Bit) ab.

Logisch ist der account state also wie folgt gegliedert:

account state speichern

Eine naheliegende Vermutung ist nun, dass die Libra Blockchain den account state gerade unter der account address als Schlüssel in ihren key value store schreibt. Sie könnte in diesem Fall eine Anfrage wie "Was ist der aktuelle account state für den account 0xABCD ?" schnell und effizient beantworten. Ein Zugriff unter dem Schlüssel 0xABCD auf den key value store ... et voilà – der account state läge vor!

Die Vermutung erweist sich aber als falsch: Der account state wird nicht unter der account address im key value store gespeichert. Warum das so ist und wo er in den Datenbestände der Libra Blockchain stattdessen abgelegt ist, werden wir später in einem weiteren Blog-Beitrag zeigen.