Transaktionen
Letzte Änderung: , Invalid DateTime
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.
(opens in a new tab)
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. Jede Node kann eine Anfrage für eine Transaktion auf der EVM senden. Dann wird ein Miner/Validator die Transaktion ausführen und die daraus resultierende Zustandsänderung an den Rest des Netzwerks weiterleiten.
Transaktionen erfordern eine Gebühr und müssen gemint werden, um Gültigkeit zu erlangen. Um diese Übersicht zu vereinfachen, werden wir die Gasgebühren und das Mining an anderer Stelle abdecken.
Eine abgeschlossene Transaktion enthält folgende Informationen:
recipient
– die Empfangsadresse (im Fall eines externen Kontos wird die Transaktion den Wert übertragen. Bei einem Smart-Contract-Konto wird die Transaktion den Vertragscode ausführen.)signature
– der Identifikator des Absenders. Dies wird generiert, wenn der private Schlüssel des Absenders die Transaktion signiert und bestätigt, dass der Absender diese Transaktion autorisiert hat.value
– Betrag der ETH zum Übertragen vom Absender zum Empfänger (in WEI, einer Stückelung von ETH)data
– optionales Feld, um beliebige Daten einzubindengasLimit
– Die maximale Menge an Gaseinheiten, die von der Transaktion verbraucht werden können. Gaseinheiten stellen Berechnungsschritte dar.maxPriorityFeePerGas
– die maximale Menge an Gas, die für den Miner als Trinkgeld enhalten sein sollmaxFeePerGas
– die maximale Menge an Gas, die für die Transaktion gezahlt werden soll (einschließlichbaseFeePerGas
undmaxPriorityFeePerGas
)
Gas ist eine Referenz auf die Berechnung, die erforderlich ist, um die Transaktion durch einen Miner/Validator zu verarbeiten. Benutzer müssen für diese Berechnung eine Gebühr bezahlen. Das gasLimit
und maxPriorityFeePerGas
bestimmen die maximale Transaktionsgebühr, die an den Miner 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}10Alles anzeigenKopieren
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(opens in a new tab)-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}18Alles anzeigenKopieren
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}21Alles anzeigenKopieren
- Das
raw
ist die signierte Transaktion in rekursivem Längenpräfix (RLP) kodiertem Format. - Das
tx
ist die signierte Transaktion im JSON-Format.
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 application binary interface (ABI).
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:
10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d012792000000000000000000000000000000000000000000000000000000003b0559f43
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 einer Wallet zur anderen.
- 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 gwei2--oder--30,0042 ETH4
Bobs Konto wird belastet mit -1,0042 ETH
Alices Konto wird +1,0 ETH gutgeschrieben
Die Grundgebühr wird -0,00399 ETH verbrannt
Miner behält das Trinkgeld +0,000210 ETH
Gas ist auch für alle Smart Contracts erforderlich.
(opens in a new tab)
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:
- Sobald du eine Transaktion gesendet hast, erzeugt die Kryptographie einen Transaktions-Hash:
0x97d99bc77292111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
- Die Transaktion wird dann in das Netzwerk übertragen und in einen Pool mit vielen anderen Transaktionen aufgenommen.
- Ein Miner/Validator muss deine Transaktion auswählen und in einen Block einbinden, um die Transaktion zu überprüfen und sie als "erfolgreich" einzustufen.
- Du musst eventuell warten, wenn das Netzwerk beschäftigt ist und Miner/Validatoren nicht in der Lage sind, mit der Menge zu validierender Transaktionen mitzuhalten.
- Deine Transaktion wird "Bestätigungen" erhalten. Die Anzahl der Bestätigungen ist die Anzahl der Blöcke, die seit dem Block, der deine Transaktion enthielt, erstellt wurde. Je höher die Zahl, desto größer ist die Gewissheit, dass das Netzwerk die Transaktion verarbeitet und anerkannt hat.
- Neuere Blöcke können umorganisiert werden, was den Eindruck erweckt, dass die Transaktion nicht erfolgreich war; die Transaktion kann jedoch noch gültig, aber in einem anderen Block enthalten sein.
- Die Wahrscheinlichkeit einer Reorganisation sinkt mit jedem weiteren geminten Block, d. h., je größer die Anzahl der Bestätigungen ist, desto unveränderlicher ist die Transaktion.
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-codiert und sehen in etwa so 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: Typisierter Transaktionsumschlag(opens in a new tab) definiert einen Transaktionstyp, der ein Umschlag für zukünftige Transaktionstypen ist.
EIP-2718 ist ein neuer allgemeiner Umschlag für typisierte Transaktionen. In dem neuen Standard werden Transaktionen 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
Kennst du eine Community-Ressource, die dir geholfen hat? Bearbeite diese Seite und füge sie hinzu!