Zum Hauptinhalt springen
Change page

Anatomie von Smart Contracts

Letzte Aktualisierung der Seite: 15. April 2026

Ein Smart Contract ist ein Programm, das unter einer Adresse auf Ethereum läuft. Sie bestehen aus Daten und Funktionen, die nach Erhalt einer Transaktion ausgeführt werden können. Hier ist ein Überblick darüber, woraus ein Smart Contract besteht.

Voraussetzungen

Stellen Sie sicher, dass Sie zuerst über Smart Contracts gelesen haben. Dieses Dokument setzt voraus, dass Sie bereits mit Programmiersprachen wie JavaScript oder Python vertraut sind.

Daten

Alle Vertragsdaten müssen einem Speicherort zugewiesen werden: entweder storage (Speicher) oder memory (Arbeitsspeicher). Es ist teuer, den Speicher in einem Smart Contract zu ändern, daher müssen Sie sich überlegen, wo Ihre Daten abgelegt werden sollen.

Storage

Persistente Daten werden als Storage bezeichnet und durch Zustandsvariablen (State Variables) repräsentiert. Diese Werte werden dauerhaft auf der Blockchain gespeichert. Sie müssen den Typ deklarieren, damit der Vertrag beim Kompilieren nachverfolgen kann, wie viel Speicherplatz er auf der Blockchain benötigt.

// Solidity-Beispiel
contract SimpleStorage {
    uint storedData; // Zustandsvariable
    // ...
}
# Vyper-Beispiel
storedData: int128

Wenn Sie bereits in objektorientierten Sprachen programmiert haben, werden Ihnen die meisten Typen wahrscheinlich vertraut sein. address sollte jedoch neu für Sie sein, wenn Sie neu in der Ethereum-Entwicklung sind.

Ein address-Typ kann eine Ethereum-Adresse aufnehmen, was 20 Bytes oder 160 Bits entspricht. Sie wird in hexadezimaler Schreibweise mit einem führenden 0x zurückgegeben.

Weitere Typen sind:

  • Boolean (Wahrheitswerte)
  • Integer (Ganzzahlen)
  • Fixed Point Numbers (Festkommazahlen)
  • Fixed-size Byte Arrays (Byte-Arrays fester Größe)
  • Dynamically sized Byte Arrays (Byte-Arrays dynamischer Größe)
  • Rational and Integer Literals (Rationale und ganzzahlige Literale)
  • String Literals (Zeichenketten-Literale)
  • Hexadecimal Literals (Hexadezimale Literale)
  • Enums (Aufzählungstypen)

Für weitere Erklärungen werfen Sie einen Blick in die Dokumentation:

Memory

Werte, die nur für die Lebensdauer der Ausführung einer Vertragsfunktion gespeichert werden, nennt man Memory-Variablen. Da diese nicht dauerhaft auf der Blockchain gespeichert werden, sind sie in der Nutzung viel günstiger.

Erfahren Sie mehr darüber, wie die EVM Daten speichert (Storage, Memory und der Stack) in der Solidity-Dokumentation (opens in a new tab).

Umgebungsvariablen

Zusätzlich zu den Variablen, die Sie in Ihrem Vertrag definieren, gibt es einige spezielle globale Variablen. Sie werden hauptsächlich verwendet, um Informationen über die Blockchain oder die aktuelle Transaktion bereitzustellen.

Beispiele:

EigenschaftZustandsvariableBeschreibung
block.timestampuint256Aktueller Block-Epochen-Zeitstempel
msg.senderaddressAbsender der Nachricht (aktueller Aufruf)

Funktionen

Vereinfacht gesagt können Funktionen als Reaktion auf eingehende Transaktionen Informationen abrufen oder festlegen.

Es gibt zwei Arten von Funktionsaufrufen:

  • internal – diese erzeugen keinen EVM-Aufruf
    • Auf interne Funktionen und Zustandsvariablen kann nur intern zugegriffen werden (d. h. aus dem aktuellen Vertrag oder aus Verträgen, die davon abgeleitet sind).
  • external – diese erzeugen einen EVM-Aufruf
    • Externe Funktionen sind Teil der Vertragsschnittstelle, was bedeutet, dass sie von anderen Verträgen und über Transaktionen aufgerufen werden können. Eine externe Funktion f kann nicht intern aufgerufen werden (d. h. f() funktioniert nicht, aber this.f() funktioniert).

Sie können auch public oder private sein:

  • public-Funktionen können intern aus dem Vertrag heraus oder extern über Nachrichten aufgerufen werden.
  • private-Funktionen sind nur für den Vertrag sichtbar, in dem sie definiert sind, und nicht in abgeleiteten Verträgen.

Sowohl Funktionen als auch Zustandsvariablen können öffentlich (public) oder privat (private) gemacht werden.

Hier ist eine Funktion zum Aktualisieren einer Zustandsvariablen in einem Vertrag:

// Solidity-Beispiel
function update_name(string value) public {
    dapp_name = value;
}
  • Der Parameter value vom Typ string wird an die Funktion übergeben: update_name
  • Sie ist als public deklariert, was bedeutet, dass jeder darauf zugreifen kann.
  • Sie ist nicht als view deklariert, kann also den Vertragszustand ändern.

View-Funktionen

Diese Funktionen versprechen, den Zustand der Vertragsdaten nicht zu verändern. Häufige Beispiele sind "Getter"-Funktionen – Sie könnten diese beispielsweise verwenden, um das Guthaben eines Benutzers abzurufen.

// Solidity-Beispiel
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

Was als Änderung des Zustands gilt:

  1. Schreiben in Zustandsvariablen.
  2. Ausgeben von Ereignissen (Events) (opens in a new tab).
  3. Erstellen anderer Verträge (opens in a new tab).
  4. Verwendung von selfdestruct.
  5. Senden von Ether über Aufrufe (Calls).
  6. Aufrufen einer Funktion, die nicht als view oder pure markiert ist.
  7. Verwendung von Low-Level-Aufrufen.
  8. Verwendung von Inline-Assembly, das bestimmte Opcodes enthält.

Konstruktor-Funktionen

constructor-Funktionen werden nur einmal ausgeführt, wenn der Vertrag zum ersten Mal bereitgestellt wird. Wie der constructor in vielen klassenbasierten Programmiersprachen initialisieren diese Funktionen oft Zustandsvariablen auf ihre angegebenen Werte.

# Vyper-Beispiel

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Eingebaute Funktionen

Zusätzlich zu den Variablen und Funktionen, die Sie in Ihrem Vertrag definieren, gibt es einige spezielle eingebaute Funktionen. Das offensichtlichste Beispiel ist:

  • address.send() – Solidity
  • send(address) – Vyper

Diese ermöglichen es Verträgen, ETH an andere Konten zu senden.

Funktionen schreiben

Ihre Funktion benötigt:

  • Parametervariable und Typ (wenn sie Parameter akzeptiert)
  • Deklaration von internal/external
  • Deklaration von pure/view/payable
  • Rückgabetyp (wenn sie einen Wert zurückgibt)

Ein vollständiger Vertrag könnte in etwa so aussehen. Hier liefert die constructor-Funktion einen Anfangswert für die Variable dapp_name.

Ereignisse und Protokolle

Ereignisse (Events) ermöglichen es Ihrem Smart Contract, mit Ihrem Frontend oder anderen abonnierenden Anwendungen zu kommunizieren. Sobald eine Transaktion validiert und einem Block hinzugefügt wurde, können Smart Contracts Ereignisse ausgeben und Informationen protokollieren, die das Frontend dann verarbeiten und nutzen kann.

Kommentierte Beispiele

Dies sind einige in Solidity geschriebene Beispiele. Wenn Sie mit dem Code spielen möchten, können Sie in Remix (opens in a new tab) mit ihnen interagieren.

Hello World

Token

Einzigartiger digitaler Vermögenswert

Weiterführende Literatur

Sehen Sie sich die Dokumentation von Solidity und Vyper an, um einen vollständigeren Überblick über Smart Contracts zu erhalten:

War dieser Artikel hilfreich?