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?
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.
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);
}
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);
}
}
Ismael
gasPrice
pro Transaktion zu erhöhen.Stepan Jakowenko
Ismael
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 aufvar gasPrice = web3.eth.gasPrice;
.Abdul Munim
Stepan Jakowenko
Abdul Munim
genesis.json
Datei festgelegt haben, wenn Sie geth verwenden ? Danke für deine Antwort.Stepan Jakowenko
Abdul Munim
0x10
immer noch vor den gleichen Problemen. Hast du eine Anleitung, die du beim Einrichten befolgt hast? Jede Hilfe wird sehr geschätzt. Prost.Stepan Jakowenko
Stepan Jakowenko
Stepan Jakowenko
Alex