Transaktionen
Letzte Änderung: @MajorDom_DePIN(opens in a new tab), 16. Juli 2024
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 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.to
– die Empfängeradresse (wenn es sich um ein Konto in externem Besitz handelt, wird durch die Transaktion ein 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 angibtWert
– 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 DatengasLimit
– 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 werdenmaxPriorityFeePerGas
– der Höchstpreis des verbrauchten Gas, der als Trinkgeld an den Validierer weitergegeben wirdmaxFeePerGas
– die maximale Gebühr pro Gas-Einheit, die für die Transaktion gezahlt werden soll (einschließlichbaseFeePerGas
undmaxPriorityFeePerGas
)
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 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-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 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}Alles anzeigenKopieren
raw
ist die signierte Transaktion in Recursive Length Prefix (RLP) in kodierter Form.- 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 .
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:
10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d012792000000000000000000000000000000000000000000000000000000003b0559f4
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 gwei2--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
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.
Smart Contract-Interaktionen
Gas wird für jede Transaktion benötigt, die Smart Contracts betrifft.
Smart Contracts können auch Funktionen enthalten, die als view
(opens in a new tab) oder pure
(opens in a new tab) bezeichnet werden; sie verändern nicht den Zustand des Vertrags. Daher ist es nicht erforderlich, Gas zu zahlen, wenn diese Funktionen von einem externen Konto (EOA) aufgerufen werden. Der zugrunde liegende RPC-Aufruf in diesem Szenario ist eth_call
Im Gegensatz zum Zugriff über eth_call
werden diese view
- oder pure
-Funktionen auch häufig intern aufgerufen (also vom Vertrag selbst oder von einem anderen Vertrag), was jedoch Gas kostet.
Transaktions-Lebenszyklus
Sobald die Transaktion abgeschickt wurde, passiert Folgendes:
- Ein Transaktions-Hash wird kryptografisch erzeugt:
0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
- Die Transaktion wird dann an das Netzwerk weitergeleitet und zu einem Transaktionspool hinzugefügt, der aus allen anderen ausstehenden Netztransaktionen besteht.
- Ein Validator muss Ihre Transaktion auswählen und in einem Block hinzufügen, um die Transaktion zu verifizieren und sie als "erfolgreich" zu bezeichnen.
- 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.
Basierend auf dem TransactionType
-Wert kann eine Transaktion wie folgt klassifiziert werden:
Typ-0-Transaktionen (veraltet): Das ursprüngliche Transaktionsformat, das seit dem Start von Ethereum verwendet wird. Diese Transaktionen enthalten keine Funktionen aus EIP-1559(opens in a new tab) wie dynamische Gasgebührenkalkulationen oder Zugriffslisten für Smart Contracts. Veraltete Transaktionen haben in ihrer serialisierten Form keinen spezifischen Präfix, der ihren Typ angibt; sie beginnen mit dem Byte
0xf8
, wenn die Recursive Length Prefix(RLP)-Kodierung verwendet wird. Der TransactionType-Wert für diese Transaktionen ist0x0
.Typ-1-Transaktionen: Diese Transaktionen wurden in EIP-2930(opens in a new tab) als Teil des Berlin-Upgrades von Ethereum eingeführt und enthalten einen
accessList
-Parameter. Diese Liste gibt Adressen und Speicherschlüssel an, auf die bei der Transaktion zugegriffen werden soll, was potenziell die Gas-Kosten für komplexe Transaktionen mit Smart Contracts reduzieren kann. Änderungen des EIP-1559-Gebührenmarkts sind in Typ-1-Transaktionen nicht enthalten. Typ-1-Transaktionen enthalten auch einenyParity
-Parameter, der entweder0x0
oder0x1
sein kann und die Parität des y-Werts der secp256k1-Signatur angibt. Sie werden durch das Anfangs-Byte0x01
identifiziert und ihr TransactionType-Wert ist0x1
.Typ-2-Transaktionen, allgemein als EIP-1559-Transaktionen bezeichnet, sind Transaktionen, die in EIP-1559(opens in a new tab), dem London-Upgrade von Ethereum, eingeführt wurden. Diese haben sich zur Standardform für Transaktionen auf dem Ethereum-Netzwerk entwickelt. Diese Transaktionen führen einen neuen Gebührenmarktmechanismus ein, der durch die Trennung der Transaktionsgebühr in eine Basisgebühr und eine Prioritätsgebühr die Vorhersehbarkeit verbessert. Sie beginnen mit dem Byte
0x02
und enthalten Felder wiemaxPriorityFeePerGas
undmaxFeePerGas
. Typ-2-Transaktionen sind aufgrund ihrer Flexibilität und Effizienz nun der Standard und werden besonders in Zeiten hoher Netzwerkbelastung bevorzugt – aufgrund ihrer Fähigkeit, den Benutzern eine besser vorhersehbare Verwaltung der Transaktionsgebühren zu ermöglichen. Der TransactionType-Wert für diese Transaktionen ist0x2
.
Weiterführende Informationen
Du kennst Community-Ressourcen die dir geholfen haben? Bearbeite diese Seite und füge sie hinzu!