Sprachen von Smart Contracts
Seite zuletzt aktualisiert: 26. Februar 2026
Das Tolle an Ethereum ist, dass Smart Contracts mit relativ Entwickler-freundlichen Sprachen programmiert werden können. Wenn Sie Erfahrung mit Python oder einer Sprache mit geschweiften Klammernopens in a new tab haben, können Sie eine Sprache mit vertrauter Syntax finden.
Die zwei häufig genutzten und aktuellsten Sprachen sind:
- Solidity
- Vyper
Remix IDE bietet eine umfassende Entwicklungsumgebung zum Erstellen und Testen von Contracts in Solidity als auch in Vyper. Probieren Sie die Remix IDE im Browser ausopens in a new tab, um mit dem Programmieren zu beginnen.
Erfahrenere Entwickler möchten vielleicht auch Yul, eine Zwischensprache für die Ethereum Virtual Machine, oder Yul+, eine Erweiterung von Yul, verwenden.
Wenn Sie neugierig sind und gerne dabei helfen, neue, noch in der Entwicklung befindliche Sprachen zu testen, können Sie mit Fe experimentieren, einer aufstrebenden Smart-Contract-Sprache, die derzeit noch in den Kinderschuhen steckt.
Voraussetzungen
Vorwissen über andere Programmiersprachen, insbesondere JavaScript oder Python, ist hilfreich, um Smart-Contract-Sprachen und die Unterschiede zwischen den jeweiligen Sprachen schneller zu verstehen. Wir empfehlen Ihnen außerdem, sich mit dem Grundkonzept von Smart Contracts vertraut zu machen, bevor Sie sich die Unterschiede der Smart-Contract-Sprachen genauer ansehen. Einführung in Smart Contracts.
Solidity
- Objektorientierte Hochsprache zur Implementierung von Smart Contracts
- Sprache mit geschweiften Klammern, die am stärksten von C++ beeinflusst wurde
- Statisch typisiert (der Typ einer Variable ist zur Kompilationszeit bekannt)
- Unterstützt:
- Vererbung (Sie können andere Smart Contracts erweitern)
- Bibliotheken (Sie können wiederverwertbaren Code programmieren, den Sie von verschiedenen Smart Contracts aus abrufen können – wie z. B. in statischen Funktionen in einer statischen Klasse in anderen objektorientierten Programmiersprachen)
- Komplexe benutzerdefinierte Typen
Wichtige Links
- Dokumentationopens in a new tab
- Solidity-Sprachportalopens in a new tab
- Solidity by Exampleopens in a new tab
- GitHubopens in a new tab
- Solidity Matrix-Chatroomopens in a new tab überbrückt zum Solidity Matrix-Chatroomopens in a new tab
- Spickzettelopens in a new tab
- Solidity-Blogopens in a new tab
- Solidity auf Twitteropens in a new tab
Beispielvertrag
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // Das Schlüsselwort "public" macht Variablen6 // für andere Verträge zugänglich7 address public minter;8 mapping (address => uint) public balances;910 // Ereignisse ermöglichen es Clients, auf bestimmte11 // von Ihnen deklarierte Vertragsänderungen zu reagieren12 event Sent(address from, address to, uint amount);1314 // Konstruktor-Code wird nur ausgeführt, wenn der Vertrag15 // erstellt wird16 constructor() {17 minter = msg.sender;18 }1920 // Sendet eine Menge neu erstellter Münzen an eine Adresse21 // Kann nur vom Vertragsersteller aufgerufen werden22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Sendet eine Menge vorhandener Münzen29 // von einem beliebigen Aufrufer an eine Adresse30 function send(address receiver, uint amount) public {31 require(amount <= balances[msg.sender], "Guthaben nicht ausreichend.");32 balances[msg.sender] -= amount;33 balances[receiver] += amount;34 emit Sent(msg.sender, receiver, amount);35 }36}Alles anzeigenDieses Beispiel soll ein Gefühl vermitteln, wie die Smart-Contract-Syntax in Solidity aussieht. Eine detailliertere Beschreibung der Funktionen und Variablen finden Sie in der Dokumentationopens in a new tab.
Vyper
- Pythonische Programmiersprache
- Starke Typisierung
- Kompilierter Code ist kurz und nachvollziehbar
- Effiziente Bytecode-Generierung
- Hat beabsichtigterweise weniger Funktionen als Solidity – mit dem Ziel, die Smart Contracts sicherer und einfacherer auditierbar zu machen. Vyper bietet keine Untersützung für:
- Modifikationen
- Vererbung
- Inline-Assembly
- Funktionsüberladung
- Operatorüberladung
- Rekursive Abfragen
- Schleifen mit unendlicher Länge
- Binäre Fixpunkte
Für weitere Informationen lesen Sie die Begründung für Vyperopens in a new tab.
Wichtige Links
- Dokumentationopens in a new tab
- Vyper by Exampleopens in a new tab
- More Vyper by Exampleopens in a new tab
- GitHubopens in a new tab
- Vyper-Community-Discord-Chatopens in a new tab
- Spickzettelopens in a new tab
- Entwicklungsframeworks und Tools für Smart Contracts für Vyper
- VyperPunk – Lernen Sie, Vyper-Smart-Contracts zu sichern und zu hackenopens in a new tab
- Vyper-Hub für die Entwicklungopens in a new tab
- Vyper Greatest Hits: Beispiele für Smart Contractsopens in a new tab
- Awesome Vyper – Kuratierte Ressourcenopens in a new tab
Beispiel
1# Offene Auktion23# Auktionsparameter45# Der Begünstigte erhält Geld vom Höchstbietenden67beneficiary: public(address)8auctionStart: public(uint256)9auctionEnd: public(uint256)1011# Aktueller Stand der Auktion1213highestBidder: public(address)14highestBid: public(uint256)1516# Wird am Ende auf „true“ gesetzt, verbietet jede Änderung1718ended: public(bool)1920# Nachverfolgung der zurückgezahlten Gebote, damit wir dem Auszahlungsmuster folgen können2122pendingReturns: public(HashMap[address, uint256])2324# Erstellt eine einfache Auktion mit `_bidding_time`2526# Sekunden Bietzeit im Namen der2728# Begünstigten-Adresse `_beneficiary`.2930@external31def __init__(_beneficiary: address, _bidding_time: uint256):32 self.beneficiary = _beneficiary33 self.auctionStart = block.timestamp34 self.auctionEnd = self.auctionStart + _bidding_time3536# Mit dem Wert, der zusammen mit dieser Transaktion3738# gesendet wird, auf die Auktion bieten.3940# Der Wert wird nur dann zurückerstattet,4142# wenn die Auktion nicht gewonnen wird.4344@external45@payable46def bid():47 # Prüfen, ob die Bietfrist abgelaufen ist.48 assert block.timestamp < self.auctionEnd49 # Prüfen, ob das Gebot hoch genug ist50 assert msg.value > self.highestBid51 # Rückerstattung für den vorherigen Höchstbietenden nachverfolgen52 self.pendingReturns[self.highestBidder] += self.highestBid53 # Neues Höchstgebot nachverfolgen54 self.highestBidder = msg.sender55 self.highestBid = msg.value5657# Ein zuvor erstattetes Gebot abheben. Das Auszahlungsmuster wird5859# hier verwendet, um ein Sicherheitsproblem zu vermeiden. Wenn Rückerstattungen direkt6061# als Teil von bid() gesendet würden, könnte ein bösartiger Bietvertrag6263# diese Rückerstattungen blockieren und somit das Eingehen neuer, höherer Gebote verhindern.6465@external66def withdraw():67 pending_amount: uint256 = self.pendingReturns[msg.sender]68 self.pendingReturns[msg.sender] = 069 send(msg.sender, pending_amount)7071# Die Auktion beenden und das höchste Gebot an7273# den Begünstigten senden.7475@external76def endAuction():77 # Es ist eine gute Richtlinie, Funktionen, die mit anderen Verträgen interagieren78 # (d. h. sie rufen Funktionen auf oder senden Ether),79 # in drei Phasen zu gliedern:80 # 1. Überprüfung der Bedingungen81 # 2. Ausführung von Aktionen (potenziell ändernde Bedingungen)82 # 3. Interaktion mit anderen Verträgen83 # Wenn diese Phasen vermischt werden, könnte der andere Vertrag84 # in den aktuellen Vertrag zurückrufen und den Zustand ändern oder bewirken,85 # dass Effekte (Ether-Auszahlung) mehrmals ausgeführt werden.86 # Wenn intern aufgerufene Funktionen die Interaktion mit externen87 # Verträgen beinhalten, müssen sie ebenfalls als Interaktion mit88 # externen Verträgen betrachtet werden.8990 # 1. Bedingungen91 # Prüfen, ob die Endzeit der Auktion erreicht ist92 assert block.timestamp >= self.auctionEnd93 # Prüfen, ob diese Funktion bereits aufgerufen wurde94 assert not self.ended9596 # 2. Effekte97 self.ended = True9899 # 3. Interaktion100 send(self.beneficiary, self.highestBid)Alles anzeigenDieses Beispiel soll ein Gefühl vermitteln, wie die Smart-Contract-Syntax in Vyper aussieht. Eine detailliertere Beschreibung der Funktionen und Variablen finden Sie in der Dokumentationopens in a new tab.
Yul und Yul+
Falls Sie noch nicht mit Ethereum vertraut sind und Sie noch nie mit Smart-Contract-Sprachen programmiert haben, empfehlen wir Ihnen, zunächst mit Solidity oder Vyper anzufangen. Verwenden Sie Yul oder Yul+ bitte nur dann, wenn Sie sich mit den bewähren Methoden für sicheres Programmieren mit Smart-Contract-Sprachen und den Besonderheiten beim Arbeiten mit der EVM auskennen.
Yul
- Intermediäre Sprache für Ethereum.
- Unterstützt die EVM und Ewasmopens in a new tab, ein WebAssembly im Ethereum-Stil, und ist als brauchbarer gemeinsamer Nenner beider Plattformen konzipiert.
- Ein gutes Ziel für High-Level-Optimierungsstufen, von denen sowohl EVM als auch eWASM-Plattformen gleichermaßen profitieren können
Yul+
- Eine hocheffiziente Yul-Erweiterung auf unterer Ebene
- Ursprünglich für einen Optimistic Rollup-Vertrag konzipiert.
- Yul+ kann als ein Vorschlag für ein experimentelles Upgrade für Yul betrachtet werden, das neue Funktionen hinzufügt
Wichtige Links
- Yul-Dokumentationopens in a new tab
- Yul+-Dokumentationopens in a new tab
- Yul+-Einführungsbeitragopens in a new tab
Beispielvertrag
Das folgende einfache Beispiel implementiert eine Power-Funktion. Es kann mit solc --strict-assembly --bin input.yul kompiliert werden. Das Beispiel
sollte in der Datei "input.yul" gespeichert werden.
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {9 result := power(mul(base, base), div(exponent, 2))10 if mod(exponent, 2) { result := mul(base, result) }11 }12 }13 let res := power(calldataload(0), calldataload(32))14 mstore(0, res)15 return(0, 32)16}Alles anzeigenWenn Sie bereits viel Erfahrung mit Smart Contracts haben, finden Sie eine vollständige ERC20-Implementierung in Yul hieropens in a new tab.
Fe
- Statisch typisierte Sprache für die Ethereum-Virtual Machine (EVM)
- Inspiriert von Python und Rust
- Es soll einfach zu erlernen sein – auch für Entwickler, die neu im Ethereum-Ökosystem sind
- Die Fe-Entwicklung befindet sich noch in der Anfangsphase, die Alpha-Version der Sprache wurde im Januar 2021 veröffentlicht
Wichtige Links
- GitHubopens in a new tab
- Fe-Ankündigungopens in a new tab
- Fe-Roadmap 2021opens in a new tab
- Fe Discord-Chatopens in a new tab
- Fe auf Twitteropens in a new tab
Beispielvertrag
Im Folgenden ist ein einfacher Vertrag in Fe implementiert:
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16Alles anzeigenWie Sie die richtige Wahl treffen
Wie bei jeder anderen Programmiersprache geht es vor allem darum, das geeignete Tool für den richtigen Job nach den persönlichen Präferenzen zu wählen.
Im Folgenden finden Sie einige Apsekte, die Sie in Betracht ziehen können, wenn Sie noch keine der Sprachen ausprobiert haben:
Was ist gut an Solidity?
- Wenn Sie Anfänger sind, gibt es viele Tutorials und Lerntools. Weitere Informationen dazu finden Sie im Abschnitt Lernen durch Programmieren.
- Gute Entwicklertools verfügbar
- Solidity hat eine große Entwickler-Community. Das bedeutet, dass Sie höchstwahrscheinlich ziemlich schnell Antworten auf Ihre Fragen finden.
Was ist gut an Vyper?
- Gute Einstiegsmöglichkeit für Python-Entwickler, um Smart Contracts kennenzulernen und in das Thema einzusteigen
- Vyper bietet weniger Funktionen und das erleichtert ein schnelleres Prototyping von Ideen.
- Vyper hat sich zum Ziel gesetzt, leicht auditierbar und möglichst für Menschen lesbar zu sein.
Was ist gut an Yul und Yul+?
- Einfache und funktionale Low-Level-Sprachen
- Ermöglicht die Annäherung an rohe EVM, was dazu beitragen kann, den Ressourcnverbrauch Ihrer Smart Contracts zu optimieren.
Sprachvergleiche
Vergleiche von grundlegender Syntax, Vertragslebenszyklus, Schnittstellen, Operatoren, Datenstrukturen, Funktionen, Kontrollfluss und mehr finden Sie in diesem Spickzettel von Auditlessopens in a new tab