Solidity

Solidity ist eine objektorientierte, anwendungsspezifische höhere Programmiersprache zum Entwickeln von Smart Contracts für Blockchain-Plattformen wie Ethereum oder Tron, die von C++, Python und JavaScript beeinflusst ist.[1][2]

Geschichte

Die erste Spezifikation von Solidity wurde im August 2014 von Gavin Wood ausgearbeitet.[3] Die weitere Entwicklung übernahm die Ethereum Foundation unter Leitung von Christian Reitwiessner. Solidity ist die 4. für die Ethereum Virtual Machine (EVM) entwickelte Sprache – nach der Go-ähnlichen Sprache Mutan, LLL – einer Lisp-artigen Sprache – sowie der Python-ähnlichen Sprache Serpent. Solidity ist die bedeutendste und am stärksten entwickelte dieser Sprachen. Mutan wurde 2015 zugunsten von Solidity abgesetzt[4] und auch LLL wird wenig verwendet.[5] Serpent wird aufgrund von Sicherheitsproblemen nicht mehr weiterentwickelt und wurde durch den Nachfolger Vyper ersetzt.[6]

Beschreibung

Solidity ist eine auf JavaScript basierende, statisch typisierte Programmiersprache, die entwickelt wurde, um Smart Contracts für die Ethereum Virtual Machine (EVM) zu programmieren.[1] Solidity-Contracts können in Bytecode kompiliert werden, der von der EVM ausgeführt werden kann, um dann (zum Beispiel über die Ethereum-Geth-Konsole) in die Ethereum-Blockchain hochgeladen zu werden. Es gibt mehrere Methoden, um Solidity-Code zu kompilieren, zum Beispiel über den Online-Compiler,[7] den Kommandozeilen-Solidity-Compiler solc oder den in die Ethereum-IDE Mix eingebauten Compiler.[8]

Die Solidity-Syntax ist stark an die ECMAScript-Syntax angelehnt, um Webentwicklern den Einstieg in die Smart-Contract-Entwicklung zu erleichtern; im Unterschied zu ECMAScript ist sie aber statisch typisiert und unterstützt variadische Rückgabewerte. Im Vergleich mit den zuvor bestehenden, vergleichbaren Sprachen (LLL, Serpent, Mutan) unterstützt Solidity komplexe Variablentypen wie hierarchische Mappings und Structs, die auch verschachtelt werden können, sowie Vererbung für Contracts. Es wurde auch ein Application Binary Interface (ABI) spezifiziert, sodass eine Interaktion externer Applikationen und Libraries (zum Beispiel Web3.js) mit Ethereum-Contracts möglich ist.[9]

Beispielcode für einen in Solidity geschriebenen Contract:[10]

contract TestCoin {
    // Das Schlüsselwort "public" erlaubt es auch anderen Smart Contracts, die Variable auszulesen.
    // Diese Variable hat den Typ "address" und steht für die Adresse eines Ethereum Accounts.
    address public minter;
    mapping (address => uint) public balances;

    // Events erlauben es Ethereum-Clients, auf Ereignisse des Contracts zu reagieren.
    event Sent(address from, address to, uint amount);

    // Die Funktion mit demselben Namen wie der Smart Contract ist der Konstruktor.
    // Diese Funktion wird ein einziges Mal bei der Erstellung des Contracts aufgerufen.
    function TestCoin() {
        minter = msg.sender;
    }

    // Mit dieser Funktion kann der "minter" Ethereum Account anderen Accounts einen beliebigen
    // Betrag des "TestCoin" überweisen.
    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }

    // Diese Funktion erlaubt es Ethereum-Accounts, sich gegenseitig TestCoin zu überweisen.
    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

Kritik

Solidity geriet besonders nach dem medial stark aufgegriffenen Hack von The DAO, aber auch durch das Entdecken weiterer Exploits, wegen ernsthafter Sicherheitsprobleme in die Kritik.[11][12] Es wird unter anderem kritisiert, dass Solidity zu permissiv ist und auf JavaScript-ähnlichen Konzepten basiert, anstatt auf wissenschaftlicher Forschung zum Thema Formale Sprachen für Contracts aufzubauen.[13][14]

Bekannte Anwendungen

  • Uniswap ist in Solidity geschrieben.

Weblinks

Einzelnachweise

  1. a b Solidity — Solidity 0.2.0 documentation. In: solidity.readthedocs.io. Abgerufen am 9. September 2016.
  2. Solidity — Solidity 0.8.7 documentation. Abgerufen am 4. August 2021.
  3. Benoit Schweblin: StackEdit Viewer. In: stackedit.io. Archiviert vom Original (nicht mehr online verfügbar) am 1. April 2016; abgerufen am 9. September 2016.
  4. Mutan FAQ. Abgerufen am 11. September 2016.
  5. Is LLL still used as language? In: ethereum.stackexchange.com. Abgerufen am 11. September 2016.
  6. Serpent auf Github. Abgerufen am 19. September 2018.
  7. Solidity realtime compiler and runtime. In: ethereum.github.io. Abgerufen am 12. September 2016.
  8. Mix IDE. Abgerufen am 12. September 2016.
  9. Ethereum Contract ABI. Abgerufen am 12. September 2016.
  10. Introduction to Smart Contracts. Abgerufen am 12. September 2016.
  11. The DAO's Community: The DAO - Home. In: daohub.org. Archiviert vom Original (nicht mehr online verfügbar) am 22. Juni 2016; abgerufen am 12. September 2016.
  12. heise online: Nach dem DAO-Hack: Ethereum glückt der harte Fork. In: heise online. Abgerufen am 12. September 2016.
  13. Muneeb Ali: Solarstorm: A security exploit with Ethereum’s Solidity language, not just the DAO. In: Muneeb's Blog. 21. Juni 2016, abgerufen am 22. Januar 2023.
  14. Why Solidity isn’t solid. In: Blockstack Blog. 20. Juni 2016, abgerufen am 12. September 2016.