Zum Inhalt springen

Solidity

aus Wikipedia, der freien Enzyklopädie

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.<ref name=":0">Solidity — Solidity 0.2.0 documentation. In: solidity.readthedocs.io. Abgerufen am 9. September 2016.</ref><ref>Solidity — Solidity 0.8.7 documentation. Abgerufen am 4. August 2021.</ref>

Geschichte[Bearbeiten]

Die erste Spezifikation von Solidity wurde im August 2014 von Gavin Wood ausgearbeitet.<ref>Benoit Schweblin: StackEdit Viewer. In: stackedit.io. Archiviert vom Vorlage:IconExternal (nicht mehr online verfügbar) am 1. April 2016; abgerufen am 9. September 2016.</ref> 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<ref>Mutan FAQ. Abgerufen am 11. September 2016.</ref> und auch LLL wird wenig verwendet.<ref>Is LLL still used as language? In: ethereum.stackexchange.com. Abgerufen am 11. September 2016.</ref> Serpent wird aufgrund von Sicherheitsproblemen nicht mehr weiterentwickelt und wurde durch den Nachfolger Vyper ersetzt.<ref>Serpent auf Github. Abgerufen am 19. September 2018.</ref>

Beschreibung[Bearbeiten]

Solidity ist eine auf JavaScript basierende, statisch typisierte Programmiersprache, die entwickelt wurde, um Smart Contracts für die Ethereum Virtual Machine (EVM) zu programmieren.<ref name=":0" /> 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,<ref>Solidity realtime compiler and runtime. In: ethereum.github.io. Abgerufen am 12. September 2016.</ref> den Kommandozeilen-Solidity-Compiler solc oder den in die Ethereum-IDE Mix eingebauten Compiler.<ref>Mix IDE. Abgerufen am 12. September 2016.</ref>

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.<ref>Ethereum Contract ABI. Abgerufen am 12. September 2016.</ref>

Beispielcode für einen in Solidity geschriebenen Contract:<ref>Introduction to Smart Contracts. Abgerufen am 12. September 2016.</ref> <syntaxhighlight lang="javascript"> 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);
   }

} </syntaxhighlight>

Kritik[Bearbeiten]

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.<ref>The DAO's Community: The DAO - Home. In: daohub.org. Archiviert vom Vorlage:IconExternal (nicht mehr online verfügbar) am 22. Juni 2016; abgerufen am 12. September 2016.</ref><ref>heise online: Nach dem DAO-Hack: Ethereum glückt der harte Fork. In: heise online. Abgerufen am 12. September 2016.</ref> 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.<ref>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.</ref><ref>Why Solidity isn’t solid. In: Blockstack Blog. 20. Juni 2016, abgerufen am 12. September 2016.</ref>

Bekannte Anwendungen[Bearbeiten]

  • Uniswap ist in Solidity geschrieben.

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

<references />