Weiter zum Hauptinhalt
Change page

Transaktionen

Letzte Änderung: , 15. November 2023

Transaktionen sind kryptographisch signierte Anweisungen von Konten. Ein Konto wird eine Transaktion starten, um den Zustand des Ethereum-Netzwerks zu aktualisieren. Die einfachste Transaktion ist die Übertragung von ETH von einem Konto auf ein anderes.

Voraussetzungen

Um dir zu helfen, diese Seite besser zu verstehen, empfehlen wir dir, zuerst Konten, Transaktionen und unsere Einführung in Ethereum zu lesen.

Was ist eine Transaktion?

Eine Transaktion von Ethereum bezieht sich auf eine Aktion, die von einem externen Konto initiiert wird; mit anderen Worten auf ein Konto, das von einem Menschen verwaltet wird und nicht von einem Vertrag. Wenn zum Beispiel Bob Alice 1 ETH sendet, muss Bobs Konto belastet werden und das von Alice muss eine Gutschrift erhalten. Diese zustandsverändernde Aktion findet innerhalb einer Transaktion statt.

Diagramm mit einer Zustandsänderung aus einer Transaktion Diagramm angepasst von Ethereum EVM illustriert(opens in a new tab)

Transaktionen, die den Zustand der EVM verändern, müssen auf das gesamte Netzwerk übertragen werden. Jeder Knoten kann eine Anfrage zur Ausführung einer Transaktion an die EVM senden, woraufhin ein Validator die Transaktion ausführt und die daraus resultierende Statusänderung an den Rest des Netzwerks weitergibt.

Transaktionen sind gebührenpflichtig und müssen in einem validierten Block enthalten sein. Um diesen Überblick zu vereinfachen, werden wir die Gas-Kosten und Validierungsgebühren an anderer Stelle behandeln.

Eine abgeschlossene Transaktion enthält folgende Informationen:

  • von – der Adresse des Senders, der die Transaktion unterzeichnet. Es handelt sich dabei um ein externes Konto, da Vertragskonten keine Transaktionen senden können.
  • recipient – die Empfangsadresse (im Fall eines externen Kontos wird die Transaktion den Wert übertragen. Bei einem Smart-Contract-Konto führt die Transaktion den Vertragscode aus.)
  • signature – die Kennung des Absenders. Das wird generiert, wenn der private Schlüssel des Absenders die Transaktion signiert und bestätigt, dass der Absender diese Transaktion autorisiert hat.
  • nonce – ein fortlaufend inkrementierender Zähler, der die Transaktionsnummer eines Kontos angibt
  • Wert – gewünschte Menge an Ether (ETH), die vom Absender an den Empfänger zu überweisen sind (in WEI, ein Ether gleicht 1e + 18wei)
  • input data – optionales Feld für die Eingabe beliebiger Daten
  • gasLimit – die maximale Menge an Gaseinheiten, die von der Transaktion verbraucht werden können. Die EVM gibt die Gas-Einheiten an, die für jeden Berechnungsschritt benötigt werden
  • maxPriorityFeePerGas – der Höchstpreis des verbrauchten Gas, der als Trinkgeld an den Validierer weitergegeben wird
  • maxFeePerGas – die maximale Gebühr pro Gas-Einheit, die für die Transaktion gezahlt werden soll (einschließlich baseFeePerGas und maxPriorityFeePerGas)

Gas ist ein Hinweis auf die Berechnung, die für die Bearbeitung der Transaktion durch einen Validierer erforderlich ist. Benutzer müssen für diese Berechnung eine Gebühr bezahlen. Das gasLimit und maxPriorityFeePerGas bestimmen die maximale Transaktionsgebühr, die an den Validator gezahlt wird. Mehr zu Gas.

Das Transaktionsobjekt wird in etwa wie folgt aussehen:

1{
2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
4 gasLimit: "21000",
5 maxFeePerGas: "300",
6 maxPriorityFeePerGas: "10",
7 nonce: "0",
8 value: "10000000000"
9}
Alles anzeigen
Kopieren

Aber ein Transaktionsobjekt muss mit dem privaten Schlüssel des Absenders signiert werden. Dies beweist, dass die Transaktion nur vom Absender hätte kommen können und nicht betrügerisch verschickt wurde.

Ein Ethereum-Client wie Geth wird diesen Signaturprozess bearbeiten.

Beispiel-JSON-RPC-Aufruf:

1{
2 "id": 2,
3 "jsonrpc": "2.0",
4 "method": "account_signTransaction",
5 "params": [
6 {
7 "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
8 "gas": "0x55555",
9 "maxFeePerGas": "0x1234",
10 "maxPriorityFeePerGas": "0x1234",
11 "input": "0xabcd",
12 "nonce": "0x0",
13 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
14 "value": "0x1234"
15 }
16 ]
17}
Alles anzeigen
Kopieren

Beispielantwort:

1{
2 "jsonrpc": "2.0",
3 "id": 2,
4 "result": {
5 "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
6 "tx": {
7 "nonce": "0x0",
8 "maxFeePerGas": "0x1234",
9 "maxPriorityFeePerGas": "0x1234",
10 "gas": "0x55555",
11 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
12 "value": "0x1234",
13 "input": "0xabcd",
14 "v": "0x26",
15 "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",
16 "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
17 "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"
18 }
19 }
20}
Alles anzeigen
Kopieren

Mit dem Signatur-Hash kann für die Transaktion kryptographisch nachgewiesen werden, dass sie vom Absender stammt und dem Netzwerk übermittelt wurde.

Das Datenfeld

Die überwiegende Mehrheit der Transaktionen greift auf einen Vertrag über ein externes Konto zu. Die meisten Verträge sind in Solidity geschrieben und interpretieren ihr Datenfeld entsprechedn dem

.

Die ersten vier Bytes geben an, welche Funktion aufgerufen werden soll, wobei der Hash des Funktionsnamens und der Argumente verwendet wird. Manchmal kannst du die Funktion anhand des Selektors aus dieser Datenbank(opens in a new tab) identifizieren.

Der Rest der Aufrufdaten sind die Argumente, codiert wie in den ABI-Spezifikationen angegeben(opens in a new tab).

Betrachten wir zum Beispiel diese Transaktion(opens in a new tab). Verwende Für mehr hier klicken, um die Aufrufdaten zu sehen.

Der Funktions-Selektor ist 0xa9059cbb. Es gibt mehrere bekannte Funktionen mit dieser Signatur(opens in a new tab). In diesem Fall wurde der Contract-Quellcode(opens in a new tab) auf Etherscan hochgeladen, so dass wir wissen, dass die Funktion transfer(address,uint256) ist.

Der Rest der Daten lautet:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4

Entsprechend den ABI-Spezifikationen erscheinen Ganzzahlwerte (wie Adressen, die 20-Byte-Ganzzahlen sind) in ABI als 32-Byte-Wörter, die vorne mit Nullen aufgefüllt werden. Also wissen wir, dass die Adresse von to 4f6742badb049791cd9a37ea913f2bac38d01279(opens in a new tab) ist. Der Wert ist value 0x3b0559f4 = 990206452.

Arten von Transaktionen

Bei Ethereum gibt es unterschiedliche Arten von Transaktionen:

  • Reguläre Transaktionen: eine Transaktion von einem Konto auf ein anderes.
  • Vertragseinsatz-Transaktionen: eine Transaktion ohne "An"-Adresse, bei der das Datenfeld für den Vertragscode verwendet wird.
  • Ausführung eines Vertrags: eine Transaktion, die mit einem bereitgestellten Smart Contract interagiert. In diesem Fall ist die Adresse von "to" die des Smart Contracts.

Über Gas

Wie bereits erwähnt, kosten das Ausführen von Transaktionen gas. Einfache Überweisungstransaktionen erfordern 21000 Gas.

Damit Bob also Alice 1 ETH zu einer BasisgebührPerGas von 190 gwei und einer maximalenPrioritätsgebührPerGas von 10 gwei schicken kann, muss er folgende Gebühr bezahlen:

1(190 + 10) * 21000 = 4.200.000 gwei
2--oder--
30,0042 ETH

Bobs Konto wird mit -1,0042 ETH belastet (1 ETH für Alice + 0,0042 ETH an Gas-Gebühren)

Alices Konto wird +1,0 ETH gutgeschrieben

Die Grundgebühr wird -0,00399 ETH verbrannt

Validatoren behalten das "Trinkgeld" +0,000210 ETH

Gas ist auch für alle Smart Contracts erforderlich.

Diagramm zeigt, wie ungenutztes Gas zurückerstattet wird Diagramm angepasst von Ethereum EVM illustriert(opens in a new tab)

Jedes Gas, das nicht in einer Transaktion verwendet wird, wird auf das Benutzerkonto zurückerstattet.

Transaktions-Lebenszyklus

Sobald die Transaktion abgeschickt wurde, passiert Folgendes:

  1. Ein Transaktions-Hash wird kryptografisch erzeugt: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. Die Transaktion wird dann an das Netzwerk weitergeleitet und zu einem Transaktionspool hinzugefügt, der aus allen anderen ausstehenden Netztransaktionen besteht.
  3. Ein Validator muss Ihre Transaktion auswählen und in einem Block hinzufügen, um die Transaktion zu verifizieren und sie als "erfolgreich" zu bezeichnen.
  4. Mit der Zeit wird der Block, der Ihre Transaktion enthält, auf "justified" und dann auf " finalized" hochgestuft. Mit diesen Hochstufungen steigt auch die Sicherheit, dass Ihre Transaktion erfolgreich war und nicht mehr verändert werden kann. Sobald ein Block abgeschlossen, also "finalized", ist, könnte er nur noch durch einen Angriff auf Netzwerkebene verändert werden, der viele Milliarden Dollar kosten würde.

Eine visuelle Demo

Schaue Austin bei einer Führung durch Transaktionen, Gas und Mining zu.

Typisierter Transaktionsumschlag

Ursprünglich hatte Ethereum ein einziges Format für Transaktionen. Jede Transaktion enthielt eine Nonce, einen Gaspreis, ein Gaslimit, eine Zieladresse, einen Wert, Daten, v, r und s. Diese Felder sind RLP-kodiert und sehen etwa folgendermaßen aus:

RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])

Ethereum hat sich so entwickelt, dass es mehrere Transaktionsarten unterstützt, damit neue Funktionen wie Zugriffslisten und EIP-1559(opens in a new tab) implementiert werden können, ohne die alten Transaktionsformate zu beeinflussen.

EIP-2718(opens in a new tab) ermöglicht dieses Verhalten. Transaktionen werden wie folgt interpretiert:

TransactionType || TransactionPayload

Die Felder sind wie folgt definiert:

  • TransactionType – eine Zahl zwischen 0 und 0x7f, für insgesamt 128 mögliche Transaktionsarten.
  • TransactionPayload – ein beliebiges Byte-Array, das durch den Transaktionstyp definiert wird.

Weiterführende Informationen

Du kennst Community-Ressourcen die dir geholfen haben? Bearbeite diese Seite und füge sie hinzu!

War dieser Artikel hilfreich?