8 Minuten Lesezeit
Dieser Leitfaden enthält Verweise auf das Kovan-Testnetz, das nicht mehr aktiv gepflegt wird. Auch wenn bestimmte Schritte in Bezug auf diese Blockchain möglicherweise nicht mehr zutreffen, kann der allgemeine Ablauf für andere Blockchains weiterhin gültig sein. Wir empfehlen Ihnen, aktuelle Alternativen für Ihre Implementierung zu prüfen. Wenn Sie eine aktualisierte Version dieses Leitfadens wünschen, lassen Sie es uns bitte wissen!
Übersicht
Manchmal sendet man eine Transaktion auf Ethereum mit unzureichendem Gas, weil das Netzwerk überlastet ist oder zu viele ausstehende Transaktionen einen höheren Gaspreis bieten als der, den man für die eigene Transaktion angeboten hat. Wenn man eine Transaktion mit hoher Priorität, aber geringem Gas hat, kann es passieren, dass man Stunden oder sogar Tage warten muss, bis die Transaktion abgewickelt wird. In solchen Fällen muss man die Transaktion mit höherem Gas und demselben Nonce erneut senden, damit sie möglichst schnell gemined wird.
In dieser Anleitung gehen wir auf alle Fachbegriffe und Informationen ein, die mit dem Senden einer Transaktion auf Ethereum und dem erneuten Senden derselben Transaktion mithilfe von Ethers.js in einem der Ethereum-Testnetzwerke zusammenhängen.
Was ist eine Transaktion in Ethereum?
Jedes Mal, wenn wir im Ethereum-Netzwerk etwas hinzufügen, aktualisieren oder ändern möchten, führen wir eine Transaktion durch. Im Grunde genommen ist eine Transaktion die Schnittstelle zwischen der realen Welt und dem Ethereum-Blockchain-Netzwerk. Für jede Transaktion, die wir im Ethereum-Netzwerk durchführen, müssen wir eine Gebühr zahlen, die als „Gas“ bezeichnet wird. Gas wird entweder in Wei (der kleinsten Einheit von ETH) oder in Gwei angegeben.
Transaktionsarten in Ethereum
Im Ethereum-Netzwerk gibt es drei gängige Arten von Transaktionen:
- Eine gewöhnliche Transaktion, bei der ETH/Ether von einem Konto auf ein anderes übertragen wird.
- Eine Transaktion, bei der ein Vertrag erstellt wird, ist eine Transaktion, bei der ein Smart Contract im Ethereum-Blockchain-Netzwerk bereitgestellt wird.
- Eine Transaktion, die einen Vertrag aufruft; diese Transaktion wird zusammen mit bestimmten Daten gesendet und dient dazu, einen zuvor bereitgestellten Smart Contract abzufragen bzw. mit ihm zu interagieren.
Parameter einer typischen Ethereum-Transaktion
- von: Die Absenderadresse, eine 20-Byte-Adresse, die das Konto angibt, von dem aus die Transaktion initiiert wird.
- An: Die Empfängeradresse, eine 20-Byte-Adresse, die ein Konto des Empfängers oder ein Vertragskonto bezeichnet.
- Wert: Dies ist der Betrag in ETH, der im Rahmen der Transaktion von einem Konto auf ein anderes gesendet wurde.
- data: Dieses Feld enthält den Bytecode für Transaktionen zur Bereitstellung von Smart Contracts. Für die Ausführung einer Smart-Contract-Funktion enthält es eine Funktionssignatur und kodierte Argumente. Bei Geldtransfer-Transaktionen wird dieses Feld nicht benötigt bzw. leer gelassen.
- gasLimit: Dies ist der Höchstbetrag in Wei, den eine Transaktion als Gas verwenden darf.
- gasPrice: Dies ist der Betrag in Wei, den der Absender bereit ist, für die Transaktion zu zahlen.
- chainId: Dies ist die Netzwerk-ID Ihres Ethereum-Knotens (Mainnet: 1, Rinkeby: 4, Kovan: 42 usw.)
- Nonce: Dies ist die Anzahl der Transaktionen, die eine bestimmte Adresse sendet. Jedes Mal, wenn eine Adresse eine Transaktion sendet, erhöht sich der Nonce-Wert um 1.
Transaktionsablauf in Ethereum
- Ein Transaktionsobjekt erstellen und es mit allen erforderlichen Parametern versehen.
- Die Transaktion mit dem privaten Schlüssel des Absenders signieren.
- Die Transaktion wird über einen Ethereum-Knoten an das Ethereum-Blockchain-Netzwerk gesendet.
Eine Transaktion unterzeichnen
Das Signieren einer Transaktion bedeutet, dass mithilfe des privaten Schlüssels des Absenders eine Signatur für ein Transaktionsobjekt erstellt wird. Wenn Sie mehr über das Signieren und Validieren in Ethereum erfahren möchten, finden Sie hier einige hervorragende Artikel: „Signing and Verifying Ethereum Signatures“ von Yos und „Ethereum: Signing and Validating“ von Angello Pozo.
Da wir nun ein besseres Verständnis von Transaktionen in Ethereum haben, wollen wir selbst eine senden.
Voraussetzungen
- Node.js ist auf Ihrem System installiert
- Ein Texteditor
- Terminal, auch bekannt als Befehlszeile
Installation der erforderlichen Tools.
Wir werden NodeJS verwenden, um unser Bibliothekspaket zu verwalten und mit der JavaScript-Datei zu arbeiten. Um zu überprüfen, ob NodeJS auf Ihrem System installiert ist, öffnen Sie ein Terminal und führen Sie folgenden Befehl aus:
$ node -v
Falls es noch nicht installiert ist, können Sie die LTS-Version von NodeJS von der offiziellen Website herunterladen.
Um eine Transaktion zu senden, verwenden wir einen kurzen JavaScript-Code und die Bibliothek „ethers.js“ (stelle sicher, dass es sich um Version 5.7 handelt). Du kannst sie mit npm über die Befehlszeile bzw. das Terminal installieren:
$ npm install --save ethers@5.7
Das häufigste Problem in diesem Schritt ist ein interner Fehler bei `node-gyp`. Die Installationsanleitung für node-gyp finden Sie hier.
Ein weiteres häufiges Problem ist ein veralteter Cache. Leeren Sie Ihren npm-Cache, indem Sie einfach den folgenden Befehl in Ihr Terminal eingeben:
$ npm cache clean
In unserem ethers.js-Leitfaden erfahren Sie mehr über die ethers.js-Bibliothek.
Eine Wallet erstellen und etwas Test-ETH erhalten
Nun wollen wir uns eine Wallet erstellen. Erstellen Sie dazu zunächst eine Datei namens „index.js“ oder eine JavaScript-Datei mit einem Namen Ihrer Wahl. Sie können den folgenden Code in Ihren Code-Editor kopieren und einfügen:
var Ether = require('ethers');
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var wallet = new ethers.Wallet(privateKey);
Konsole.log("Adresse: " + Wallet.Adresse);
Schauen wir uns einmal an, was hier passiert: Import der Bibliothek „ethers.js“, die wir zuvor installiert haben (Zeile 1), Erstellen eines privaten Schlüssels speziell für unsere Wallet – Sie müssen selbst einen erstellen; er kann eine beliebige Zahl sein, achten Sie jedoch darauf, dass er dieselbe Anzahl an Ziffern wie oben enthält (Zeile 2), Erstellen einer Wallet-Instanz mit Ethers unter Verwendung des privaten Schlüssels (Zeile 3), Ausgeben unserer Wallet-Adresse zusammen mit dem Text „Address“ in der Konsole (Zeile 4).
Führen Sie die Datei nun mit folgendem Befehl aus:
$ node index.js
Wenn alles gut läuft, sollte die im Terminalfenster angezeigte Ausgabe etwa so aussehen:
Adresse: 0x3f5D3070Fc7924479B5e367a83EC2b284E9c4e04
Da für jede Transaktion Gas als Gebühr anfällt und wir etwas davon benötigen, um die Transaktion zu senden, sollten wir zunächst etwas Test-ETH in unsere Wallet laden. Zu diesem Zweck verwenden wir einen Kovan-Knoten. Gehen Sie also zu diesem Kovan-Faucet, um etwas Test-ETH zu erhalten, fügen Sie die Wallet-Adresse ein, die Sie durch Ausführen des obigen Codes erhalten haben, und klicken Sie auf „send me KETH!“.
Hinweis: Hierbei handelt es sich um Test-ETH, die keinen Marktwert hat.
Richten Sie Ihren Quicknode-Ethereum-Endpunkt ein
Für unsere heutigen Zwecke könnten wir so ziemlich jeden Ethereum-Client verwenden, beispielsweise Geth oder OpenEthereum (früher Parity). Um einen Ethereum-Knoten selbst zu starten, müssen wir zunächst einen Client auswählen und ihn konfigurieren; die Synchronisierung und Wartung eines Ethereum-Knotens ist eine anspruchsvolle Aufgabe; die Synchronisierung eines vollständigen Ethereum-Knotens kann Tage dauern.
Da das für das Versenden einer einzigen Transaktion etwas zu aufwendig ist, nutzen wir einen kostenlosen Endpunkt von Quicknode, um das Ganze zu vereinfachen. Nachdem Sie Ihren kostenlosen Ethereum-Endpunkt erstellt haben, kopieren Sie den Endpunkt Ihres HTTP-Providers:
Für diese Anleitung verwenden wir einen Kovan-Testnetz-Knoten.

Das wirst du später noch brauchen, also kopiere es und speichere es ab.
Eine Transaktion senden und erneut senden
Nun haben wir also eine Wallet und etwas Test-ETH darin. Versenden wir also eine Transaktion, um etwas ETH auf ein anderes Konto bzw. eine andere Wallet zu überweisen. Dazu fügen wir unserer Datei „index.js“ noch ein paar weitere nützliche Zeilen hinzu. Du kannst den folgenden Code kopieren und in deinen Code-Editor einfügen:
var ethers = require('ethers');
var url = 'ADD_YOUR_ETHEREUM_NODE_URL';
var customHttpProvider = new ethers.providers.JsonRpcProvider(url);
var privateKey = "0x0111111111111111111122222222222222222223333333333333333333344445";
var wallet = new ethers.Wallet(privateKey);
console.log("Address: " + wallet.address);
tx = {
to: "0x6E0d01A76C3Cf4288372a29124A26D4353EE51BE",
value: ethers.utils.parseEther("0.05"),
chainId: 42,
nonce: 3
}
customHttpProvider.estimateGas(tx).then(function(estimate) {
tx.gasLimit = estimate;
tx.gasPrice = ethers.utils.parseUnits("0.14085197", "gwei");
wallet.signTransaction(tx).then((signedTX)=>{
customHttpProvider.sendTransaction(signedTX).then(console.log);
});
});
Ersetzen Sie also `ADD_YOUR_ETHEREUM_NODE_URL` durch den HTTP-Anbieter aus dem obigen Abschnitt.
Eine kurze Erläuterung zum obigen Code: Wir importieren die zuvor installierte „ethers“-Bibliothek (Zeile 1), legen die URL unseres Ethereum-Knotens fest (Zeile 2), instanziieren eine „ethers JsonRpcProvider“-Instanz (Zeile 3) und erstellen einen für unsere Wallet spezifischen privaten Schlüssel – Sie müssen selbst einen erstellen; er kann eine beliebige Zahl sein, achten Sie jedoch darauf, dass er die gleiche Anzahl an Ziffern enthält (Zeile 4), mit dem privaten Schlüssel eine Wallet-Instanz mit „ethers“ erstellen (Zeile 5), unsere Wallet-Adresse zusammen mit dem Text „Address“ in der Konsole ausgeben (Zeile 6), ein Transaktionsobjekt erstellen und das Feld „to“ mit der Empfängeradresse füllen – du kannst eine zufällige Adresse mit `var wallet = Wallet.createRandom();` generieren` eine zufällige Adresse generieren; ein „value“-Feld, das den Wert der zu sendenden ETH angibt; ein „chainId“-Feld, das hier auf 42 gesetzt wird, da wir Kovan verwenden; ein „nonce“-Feld, das auf 3 gesetzt wird (Zeile 7–12); Schätzen des gasLimit über unseren Knoten und Festlegen des Gaspreises (Zeile 13–15); das Transaktionsobjekt mit dem privaten Schlüssel unserer Wallet signieren und es senden sowie die Transaktion in der Konsole ausgeben (Zeile 16–18).
Probieren wir das mal aus:
$ node index.js
Die Ausgabe sieht dann in etwa so aus:

Kopieren Sie die Zeichenfolge aus dem Hash-Feld (etwa „0xe49c8122656c612bf5f1e10b251f56671acf01d831b6876c37c5a52053035642“) und fügen Sie sie in das Suchfeld von Kovan Etherscan ein, um den Status der Transaktion zu überprüfen. Du wirst sehen, dass die Transaktion noch nicht zum neuen Block in der Blockchain hinzugefügt wurde und den Status „pending“ hat. Das liegt daran, dass wir einen deutlich zu niedrigen Gas-Wert eingegeben haben.
Versuchen wir nun, dieselbe Transaktion mit demselben Nonce zu senden, erhöhen diesmal jedoch den Gas-Wert; ändern Sie den Wert von „gasPrice“ in Zeile 15 des Codes von „0,14085197“ auf „2,14085197“ und führen Sie den Code erneut aus:
$ node index.js
Kopieren Sie die Hash-Zeichenfolge aus der neuen Ausgabe und fügen Sie sie in das Suchfeld von Kovan Etherscan ein, um den Status der Transaktion zu überprüfen. Dieses Mal wird unsere Transaktion in den Block aufgenommen und den Status „erfolgreich“ erhalten, da wir sie mit einem entsprechend erhöhten gasPrice-Wert gesendet haben.
Hinweis: Es ist wichtig zu beachten, dass der „Nonce“-Wert bei beiden Transaktionen identisch ist. Wie bereits erwähnt, ist die Nonce ein Hinweis auf die Anzahl der Transaktionen, die eine Ethereum-Adresse bereits durchgeführt hat. Um eine Transaktion mit höherem Gas-Betrag erneut zu senden, müssen Sie dieselbe Nonce wie bei der ursprünglichen Transaktion verwenden. Wenn Sie eine höhere Nonce verwenden, handelt es sich um eine neue Transaktion, wodurch Sie mehr von Ihrem ETH verbrauchen, als Sie beabsichtigt haben.
Fazit
Wie wir also am obigen Beispiel gesehen haben, muss der Gaspreis einer Transaktion wettbewerbsfähig sein, damit sie genehmigt wird. Die Miner der Blockchain legen den Gaspreis auf der Grundlage des verfügbaren Blockplatzes und der Beträge fest, die alle Transaktionen bereit sind, für die Belegung dieses Blockplatzes zu zahlen. Liegt der Gaspreis einer Transaktion unter dem Schwellenwert, wird sie nicht genehmigt. Transaktionen mit einem im Vergleich zu anderen Transaktionen höheren Gaspreis werden schnell genehmigt.
Abonniere unseren Newsletter, um weitere Artikel und Anleitungen zu Ethereum zu erhalten. Wenn du Feedback hast, kannst du dich gerne über Twitter an uns wenden. Bei Fragen kannst du dich jederzeit über unseren Community-Server auf Discord mit uns austauschen. Dort findest du einige der coolsten Entwickler überhaupt – vielen Dank :)
