Bytecode in Hexadezimaldarstellung
EVM Bytecode
Die Sprache für Ethereum Smart Contracts (03.12.2018)
Förderjahr 2017 / Project Call #12 / ProjektID: 2158 / Projekt: EtherTrust

Da Smart Contracts im Endeffekt auch nur eine besondere Art von Programmen sind, braucht man natürlich Programmiersprachen in denen man sie verfassen kann. Wie solche Sprachen für Ethereum aussehen erklären wir hier.

 

Hallo allerseits,

Das letzte Mal haben wir darüber gesprochen wie Ethereum als solches funktioniert und was Smart Contracts überhaupt sind. Dieses Mal wollen wir über die Programmiersprache sprechen, in der Ethereum Smart Contracts geschrieben und ausgeführt werden werden. Diese Sprache ist es nämlich, die wir mathematisch modellieren müssen (siehe dazu unseren Blog-Eintrag zum mathematischen Kern von Ethereum Smart Contracts) um schließlich unser Analyse-Tool darauf aufzubauen.

Ethereum Smart Contracts selbst werden in so genanntem EVM Bytecode geschrieben. Ein Bytecode besteht aus einer Folge von Bytes und is somit praktisch eine Folge von 0en und 1en in praktischen 8er-Packs. Diese Darstellung ist für einen Computer sehr praktisch, aber für einen Menschen sehr schwer zu lesen. Zwar besteht jedes dieser 8er-Packs für eine Kommando oder eine Zahl, aber selbst wenn man das ganze in eine Folge von Kommandos (auch nstruktionen genannt) und Zahlen übersetzt, ist da Programm immer noch sehr schwer zu lesen. Das liegt daran, dass die Ausführung auf eine Art beschrieben wird, die praktisch für einen Computer ist, aber wieder sehr unleserlich für einen Menschen: Wir nennen solche Sprachen im allgemeinen maschinennah. Aber nur, weil eine Sprache maschinennah ist, heißt das nicht, dass man nicht prinzipiell alles damit machen würde - es wird nur leicht sehr lang und kompliziert.

Aus diesem Grund entwickelt man Sprachen, die leichter für den Menschen verständlich sind, so genannte High-Level Sprachen, die zum Beispiel dann mehr aussehen wie Java, Pyhton, C++ oder JavaScript und die dann in die maschinennahe Sprache übersetzt werden. Das gleiche wird für Smart Contracts auch gemacht: Die bekannteste High-Level Sprache für Ethereum heißt Solidity und man kann darin fast genauso schreiben, wie in JavaScript.

Hier ist ein Beispiel eines Smart contracts (dem man einfach Geld spenden kann), erst in Bytecode im Hexadezimalformat, dann als Bytecode mit übersetzten Instruktionen und schließlich in Solidity:

0x6080604052348015600f57600080fd5b5060838061001e6000396000f3fe6080604052600436106039576000357c010000000000000000000000000000000000000000000000000000000090048063ed88c68e14603e575b600080fd5b60446046565b005b34600080828254019250508190555056fea165627a7a723058208ce41c50cdeed79f101ed3fbf37dac22d5598174bbe6cdffee5501613e6400c00029

 

PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x83 DUP1 PUSH2 0x1E PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x39 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV DUP1 PUSH4 0xED88C68E EQ PUSH1 0x3E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x44 PUSH1 0x46 JUMP JUMPDEST STOP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP13 0xe4 SHR POP 0xcd 0xee 0xd7 SWAP16 LT 0x1e 0xd3 0xfb RETURN PUSH30 0xAC22D5598174BBE6CDFFEE5501613E6400C0002900000000000000000000

 

contract DonateMeMoney{
   uint donations;

    function donate() public payable{
        donations += msg.value;
    }
}

Auch wenn eine solche High-Level Sprache viel besser verständlich ist, als EVM Bytecode, muss einem immer bewusst sein, dass es am Ende dieser unleserliche Bytecode ist, der tatsächlich ausgeführt und auf der Blockchain veröffentlich wird. Wenn es also einen Fehler in der Übersetzung gibt, kann das ziemlich gefährlich werden. Das ist ein Grund, weshalb wir direkt den EVM Bytecode analysieren wollen und nicht etwa Solidity.

Dass Solidity selbst so ähnlich aussieht wie eine bekannte Programmiersprache, hat Vor- und Nachteile: Ein Vorteil ist, dass Menschen, die etwas Programmieren können leicht einen Smart Contract schreiben können. Es hat aber den Nachteil, dass Smart Contracts eben keine ganz normalen Programme sind, und es deswegen neue Konstrukte gibt, die ,normale’ Programmierer leicht missverstehen können.

Ein Beispiel dafür sind Konstrukte um auf die Blockchain zuzugreifen: Zum Beispiel kann ein Smart Contract Informationen über den Block lesen, in dem die Transaktion steckt, die ihn ausführt, wie beispielsweise den Timestamp (den Zeitpunkt, zu dem der Block an die Blockchain gehängt wurde).

Ein anderes Beispiel für ein neues und sehr wenig intuitives Konstrukt in Smart Contracts, ist das Konstrukt um eine neue Transaktion zu starten. Was komisch ist: Es gibt ein Konstrukt, das gleichzeitig zum Geldüberweisung und zum Ausführen eines anderen Smart Contracts benutzt wird! Die Idee dabei ist, dass simples Ausführen eines anderen Smart Contracts ja erreicht werden kann, in dem man ihn aufruft, ohne dabei Geld zu senden. Wenn man einem anderen Nutzer einfach Geld senden will, ist das auch kein Problem - externe Accounts haben ja keinen Code und deshalb kann nichts schief gehen, wenn Ihnen mit diesem Konstrukt Geld schickt. Was nun aber, wenn man einem Contract Account einfach nur Geld schicken möchte? Ihr könnt bestimmt ahnen, dass das zu einem Problem führen kann.. Mehr dazu gibt es im nächsten Beitrag :)

Euer EtherTrust Team

P.S.: Wenn ihr Lust habt ein bisschen mit Solidity zu Spielen: Es gibt diese nette Website, auf der ihr Solidity Verträge schreiben könnt und sie dann zu Ethereum Bytecode übersetzen lassen könnt: https://remix.ethereum.org

CAPTCHA
Diese Frage dient der Überprüfung, ob Sie ein menschlicher Besucher sind und um automatisierten SPAM zu verhindern.

    Weitere Blogbeiträge

    Datenschutzinformation
    Der datenschutzrechtliche Verantwortliche (Internet Privatstiftung Austria - Internet Foundation Austria, Österreich) würde gerne mit folgenden Diensten Ihre personenbezogenen Daten verarbeiten. Zur Personalisierung können Technologien wie Cookies, LocalStorage usw. verwendet werden. Dies ist für die Nutzung der Website nicht notwendig, ermöglicht aber eine noch engere Interaktion mit Ihnen. Falls gewünscht, können Sie Ihre Einwilligung jederzeit via unserer Datenschutzerklärung anpassen oder widerrufen.