Wie kommt man dazu, dass man eine Ethereum-Transaktion einsenden muss?

Ich habe den js-Code des Knotens aufgeschrieben, um eth mit web3 zu senden. Ich erhalte einen Nonce-Wert mit getTransactionCount, was gut funktioniert, aber wie alle wissen, kann es keine ausstehenden Transaktionen zählen. Wenn ich also eine weitere Transaktion sende, bevor die erste bestätigt wurde, wird ein Fehler generiert. Hier ist mein Code

                    var pkey1 = xxxxxxxxxxxxxxx;
                    var privateKey = new Buffer(pkey1, 'hex');

                    web3.eth.getTransactionCount(fromAccount, function(err, nonce) {
                        web3.eth.getGasPrice(function(err, gasPrice) {
                            var gasLimit = 31500;
                            gasPriceHex = web3.utils.toHex(gasPrice);
                            gasLimitHex = web3.utils.toHex(gasLimit);
                            nonceHex = web3.utils.toHex(nonce);
                            amountHex = web3.utils.toHex(amount);
                            var rawTx = {
                                nonce: nonceHex,
                                gasPrice: gasPriceHex,
                                gas: gasLimitHex,
                                to: toAccount,
                                from: fromAccount,
                                value: amountHex,
                            };
                            var tx = new Tx(rawTx);
                            tx.sign(privateKey);

                            var serializedTx = tx.serialize();

                            try {
                                web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), function(err, hash) {
                                    if (err) {
                                        console.log(err);
                                        res.json({
                                            status: false,
                                            msg: "Please try after sometime",
                                            httpcode: 400
                                        });
                                    } else {
                                        res.json({
                                            status: true,
                                            msg: "Transaction Done Successfully",
                                            txid: hash,
                                            httpcode: 200
                                        });
                                    }
                                });
                            } catch (e) {
                                res.json({
                                    status: false,
                                    msg: "insufficient funds",
                                    httpcode: 400
                                });
                            }
                        });
                    });

Antworten (2)

Es liegt in der Verantwortung des Absenders, sein Konto einmal zu kennen. Sie können den Knoten nicht auf ausstehende Transaktionen prüfen, um das Konto einmal zu verfolgen – nicht zuverlässig.

Im Allgemeinen verfolgt eine Brieftasche die Nonce, sodass sich der Benutzer nicht darum kümmern muss. Sie müssen einige Details beachten, um Transaktionen in großem Umfang zuverlässig zu senden.

In dieser Antwort finden Sie einen konzeptionellen Überblick über einen zuverlässigen Prozess und die Ausnahmebehandlung mit einem Link zu einer technischen Diskussion alternativer Ansätze: How to send a lot of transaction to ethereum, using js

Ich hoffe es hilft.

Obwohl Miner Ihre Transaktionen im Allgemeinen nach Nonces in ihrem Mempool sortieren und in der richtigen Reihenfolge aufnehmen können, passiert dies praktisch nicht. Es wird daher dringend empfohlen, zu überprüfen, ob Ihre vorherige Transaktion in einem Block enthalten war (und möglicherweise auch mindestens für 2 oder 3 Blöcke verifiziert wurde), bevor Sie eine Transaktion mit der nächsten Nonce versenden.

Aber dieser Code, den ich in der öffentlichen App verwende, kann den Benutzer nicht darauf beschränken, zu warten, bis die vorherige Transaktion bestätigt ist
Dann ist es sicherlich Zeit für ein Code-Redesign, da das Ethereum-Netzwerk wahrscheinlich nicht bereit sein wird, sich an diese App anzupassen ;)
@AnilBaweja Für denselben Fall habe ich web3.eth.getTransactionReceiptden Status verwendet und finde dann die Nonce-VerwendunggetTransactionCount