nodejs und web3: Unbehandelter Ablehnungsfehler: Die Transaktion wurde nicht innerhalb von 50 Blöcken abgebaut, bitte stellen Sie sicher, dass Ihre Transaktion ordnungsgemäß gesendet wurde

Ich versuche, ETH von einem meiner Konten mit web3 von nodejs zu einem anderen zu senden:

    web3.eth.personal.unlockAccount(config.mainGethAccount, config.gethPassword, function () {
        console.log("sendingTransaction: " + config.mainGethAccount);
        let obj = {
            from: config.mainGethAccount,
            to: newAccountId,
            value: web3.utils.toWei(.005, 'ether')
        };
        console.log("obj",obj);
        web3.eth.sendTransaction(obj).then(function (receipt) {
            done(newAccountId,config.userAccountGethPassword);
        });
    });

Mein Web3-Objekt ist in Ordnung, es kann ein neues Konto erstellen, aber es stürzt in .sendTransaction ab und ETH wird eigentlich nie übertragen:

sendingTransaction: 0x6c92C4201bBaFE97011C9EA9144c907Fd16F5089
[2017-08-01 03:21:46.240] [LOG]   obj { from: '0x6c92C4201bBaFE97011C9EA9144c907Fd16F5089',
  to: '0x2628fCe3675f25F94f06E1F0EE2c782be40fa6c8',
  value: '5000000000000000' }
[2017-08-01 03:22:46.040] [WARN]  Unhandled rejection Error: Transaction was not mined within 50 blocks, please make sure your transaction was properly send. Be aware that it might still be mined!
    at C:\tmp\qqq\node_modules\web3\packages\web3-core-method\src\index.js:362:45
    at tryCatcher (C:\tmp\qqq\node_modules\web3\packages\web3-core-promievent\node_modules\bluebird\js\release\util.js:16:23)
    at Promise._settlePromiseFromHandler (C:\tmp\qqq\node_modules\web3\packages\web3-core-promievent\node_modules\bluebird\js\release\promise.js:497:31)
    at Promise._settlePromise (C:\tmp\qqq\node_modules\web3\packages\web3-core-promievent\node_modules\bluebird\js\release\promise.js:555:18)
    at Promise._settlePromise0 (C:\tmp\qqq\node_modules\web3\packages\web3-core-promievent\node_modules\bluebird\js\release\promise.js:600:10)
    at Promise._settlePromises (C:\tmp\qqq\node_modules\web3\packages\web3-core-promievent\node_modules\bluebird\js\release\promise.js:679:18)
    at Async._drainQueue (C:\tmp\qqq\node_modules\web3\packages\web3-core-promievent\node_modules\bluebird\js\release\async.js:125:16)
    at Async._drainQueues (C:\tmp\qqq\node_modules\web3\packages\web3-core-promievent\node_modules\bluebird\js\release\async.js:135:10)
    at Immediate.Async.drainQueues (C:\tmp\qqq\node_modules\web3\packages\web3-core-promievent\node_modules\bluebird\js\release\async.js:16:14)
    at runCallback (timers.js:672:20)
    at tryOnImmediate (timers.js:645:5)

Das Interessanteste ist, dass es von Zeit zu Zeit funktioniert. Aber ist es möglich, es zu beheben?

Verwenden Sie Mainnet, Testnet oder privates Testnet? Ich würde versuchen, die gasPricepro Transaktion zu erhöhen.
Ich benutze Testnet, aber ich wäre dankbar, wenn Sie eine Idee geben, wie das geht ...
Sie müssen den gasPrice-Parameter wie folgt hinzufügen web3.eth.sendTransaction({ from: "0xSenderAddress", to: "0xRecipientAddress", value: "YourValue", gasPrice: gasPrice })(die Dokumente haben jeden Parameter github.com/ethereum/wiki/wiki/… ). Um den Standardwert zu erhalten, rufen Sie web3.eth.gasPrice wie folgt auf var gasPrice = web3.eth.gasPrice;.
@StepanYakovenko - Ich habe genau das gleiche Problem. Was haben Sie getan, um das Problem zu beheben? Jede Hilfe wäre sehr willkommen. Prost.
@AbdulMunim, ich bin vom Testnetz zu meinem lokalen Blockchain-Netzwerk migriert und habe das nie wieder gesehen. Ich schlage vor, ein Kopfgeld für diese Frage zu starten und zu warten, bis uns ein Experte eine Idee gibt ...
@StepanYakovenko Ich laufe lokal mit Geth und sehe diesen Fehler. Ist es etwas, das Sie in Ihrer genesis.jsonDatei festgelegt haben, wenn Sie geth verwenden ? Danke für deine Antwort.
@AbdulMunim Ich habe dort keine speziellen Parameter eingefügt, außer dass ich die Mining-Komplexität stark reduziert habe.
@StepanYakovenko danke für deine Antwort. Ich habe es mit Komplexität neu gestartet und stehe 0x10immer noch vor den gleichen Problemen. Hast du eine Anleitung, die du beim Einrichten befolgt hast? Jede Hilfe wird sehr geschätzt. Prost.
@AbdulMunim, ich habe diese Parameter verwendet, ich verstehe sie nicht gut: gist.github.com/stiv-yakovenko/341e4c3323cdaea071094973c0a9045c
Ich mag Kommentare, bitte upvote sie :)
@AbdulMunim siehe meine Antwort unten. Bitte geben Sie an, welches Testnetz Sie verwendet haben/benutzen. Ich empfehle Ihnen, zu Rinkeby- oder Kovan-Testnetzen zu wechseln, da Ropsten Probleme mit böswilligen Bergleuten hatte, die den Mindestgaspreis erhöhten und das Netzwerk auf andere Weise angreifen.

Antworten (5)

Welches Testnetz haben Sie zu diesem Zeitpunkt verwendet? Wenn es um den 31. Juli (als Ihre Frage gestellt wurde) das Ropsten-Testnetz war, wurde dieses Testnetz angegriffen und es würde keine Transaktionen bestätigen.

Es besteht also die Möglichkeit, dass Ihr Code in Ordnung ist, es war das Netzwerk. Sie können versuchen, dies mit den Rinkeby- oder Kovan-Testnetzen zu bestätigen. Außerdem sollte Ropsten jetzt gut funktionieren, beachten Sie jedoch, dass es von Zeit zu Zeit Probleme gibt.

nein, nicht ropsten, local geth --syncmode 'light'. (Kette 3?) Versuchen Sie es erneut mit einem vollständigen Gas-Client, sobald dieser vollständig heruntergeladen/synchronisiert ist.

Wenn es von Zeit zu Zeit funktioniert, ist es wahrscheinlich, dass Sie den Gaspreis zu niedrig ansetzen. Wenn Sie das Geld oder das Testnet haben, erhöhen Sie einfach den Benzinpreis und Sie werden sehen, wie er durchfliegt. Bei ropsten setze ich den Gaspreis zum Beispiel manchmal auf 300 gWei, nur damit ich sofort aufgenommen werden kann

Endlich gelöst: Für mich war die Quelle dieses obskuren Fehlers, dass der Signaturschlüssel dem Empfänger gehörte! Die API erkennt NICHT, ob implizit signing_key address!=sender field!

Ein weiteres Problem war hier das Mischen von Hex und Int und ein fehlendes parseIntvalue: web3.toHex(parseInt(web3.utils.toWei(.005, 'ether')))

Jetzt bekomme ich immer noch gelegentliche Auszeiten, aber nach einer Minute tauchen sie zumindest im Transaktionsprotokoll auf.

Schlechteste API aller Zeiten

Bitte korrigieren Sie mich, wenn dies hier manuell erfolgen muss, aber versuchen Sie auch, die Nonce hinzuzufügen:

let obj = {
            from: config.mainGethAccount,
            to: newAccountId,
            nonce: web3.toHex(web3.eth.getTransactionCount(config.mainGethAccount)),
            value: web3.utils.toWei(.005, 'ether')
        };

BEARBEITEN: Da der Fehler weiterhin zu bestehen schien, hier eine ausführlichere Erklärung zum Senden von Rohtransaktionen. Ich nutze hier gerne Promises, auch kein im Node gespeichertes Konto (da man dann daran gebunden ist), sondern selbst mit einem privaten Schlüssel signieren, so dass ich bspw. infura flexibel einsetzen kann.

var EthTx = require("ethereumjs-tx");
const Web3 = require("web3");

if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
} else {
    // Use the provider from the config.
    web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); //your node url or infura 

promisedSendRawTransaction = function (serializedTx) {
    return new Promise(function (resolve, reject) {
        web3.eth.sendRawTransaction(serializedTx, function (e, data) {
            if (e !== null) {
                console.log(e);
                reject(e);
            } else {
                resolve(data);
            }
        });
    });
};

                var pKey1 = "yourPrivateKey";
                var pKey1x = new Buffer(pKey1, "hex");

                var rawTx = {
                nonce: web3.toHex(web3.eth.getTransactionCount(addr1)),  
                to: theAddress,
                value: web3.toHex(theValue),  
                gasPrice: web3.toHex(22000000000),  
                gas: web3.toHex(900000),
                gasLimit: web3.toHex(4700000)
                }

                var tx = new EthTx(rawTx);
                tx.sign(pKey1x);
                console.log("This is the raw tx: " + tx);
                var serializedTx = "0x" + tx.serialize().toString('hex');

                console.log("The tx now looks like this " + serializedTx);

                console.log("Now sending the full tx.");

                promisedSendRawTransaction(serializedTx).then(function(data){
                    console.log("Tx ID" + data);
                }
gleiches Problem wie gestern wieder. Vielleicht war ich zu schnell mit der Kopfgeldbelohnung :(
Bitte überprüfen Sie meine Bearbeitung und versuchen Sie, ob Ihnen das hilft.
Danke. Das Problem war, dass die Signaturschlüsseladresse != Absender oder Signaturschlüssel== Empfänger war

Fügen Sie einen Try/Catch-Block wie diesen ein:

 try {
           web3.eth.sendTransaction(obj).then(function (receipt) {
             done(newAccountId,config.userAccountGethPassword);
          });
        } catch (err) {
            if (err.includes('not mined within 50 blocks')) {
                const handle = setInterval(() => {
                    web3.eth.getTransactionReceipt(err.response.transactionHash).then((resp)
=> {
                        if (resp != null && resp.blockNumber > 0) {
                            clearInterval(handle);
                            web3.eth.sendTransaction(obj).then(function (receipt) {
                            done(newAccountId,config.userAccountGethPassword);
                            continue;
                        }
                    });
                },3000);
            } else {
                console.error(err.response);
            }
        }