Я пытаюсь отправить ETH с одной моей учетной записи на другую с помощью web3 из nodejs:
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);
});
});
мой объект web3 в порядке, он может создать новую учетную запись, но он дает сбой в .sendTransaction, и ETH на самом деле никогда не передаются:
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)
Самое интересное, что это работает время от времени. Но можно ли это исправить?
Какую тестовую сеть вы использовали в этот момент? Если это была тестовая сеть Ropsten примерно 31 июля (когда был задан ваш вопрос), эта тестовая сеть подверглась атаке и не подтвердила никаких транзакций.
Так что, скорее всего, ваш код в порядке, это была сеть. Вы можете попробовать использовать тестовые сети Rinkeby или Kovan, чтобы подтвердить это. Кроме того, Ropsten теперь должен работать нормально, просто обратите внимание, что время от времени у него возникают проблемы.
Если это срабатывает время от времени, скорее всего, вы устанавливаете слишком низкую цену на газ. Если у вас есть наличные или в тестовой сети, просто поднимите цену на газ, и вы увидите, как она пролетит. Например, на ropsten я иногда устанавливаю цену на газ в 300 gWei, чтобы я мог мгновенно включиться.
Наконец решил это: для меня источником этой неясной ошибки было то, что ключ подписи принадлежал получателю! API НЕ определяет, является ли неявный адрес signing_key! = поле отправителя!
Еще одна проблема здесь заключалась в смешении hex и int и отсутствующем parseInt.value: web3.toHex(parseInt(web3.utils.toWei(.005, 'ether')))
Теперь я все еще получаю случайные тайм-ауты, но по крайней мере через минуту они появляются в журнале транзакций.
Худший API когда-либо
Пожалуйста, поправьте меня, если это нужно сделать здесь вручную, но попробуйте также добавить одноразовый номер:
let obj = {
from: config.mainGethAccount,
to: newAccountId,
nonce: web3.toHex(web3.eth.getTransactionCount(config.mainGethAccount)),
value: web3.utils.toWei(.005, 'ether')
};
РЕДАКТИРОВАТЬ: Поскольку ошибка, похоже, не устранена, здесь более подробное объяснение отправки необработанных транзакций. Мне нравится использовать обещания здесь, а также не использовать учетную запись, хранящуюся в узле (поскольку вы тогда привязаны к ней), а самому подписывать ее с помощью закрытого ключа, поэтому я могу использовать инфуру, например.
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);
}
Включите блок try/catch следующим образом:
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);
}
}
Исмаэль
gasPrice
за транзакцию.Степан Яковенко
Исмаэль
web3.eth.sendTransaction({ from: "0xSenderAddress", to: "0xRecipientAddress", value: "YourValue", gasPrice: gasPrice })
(в документах есть каждый параметр github.com/ethereum/wiki/wiki/… ). Чтобы получить значение по умолчанию, вызовите web3.eth.gasPrice следующим образомvar gasPrice = web3.eth.gasPrice;
.Абдул Муним
Степан Яковенко
Абдул Муним
genesis.json
файле, если используете geth ? Спасибо за ваш ответ.Степан Яковенко
Абдул Муним
0x10
, все еще сталкиваясь с той же проблемой. У вас есть руководство, которому вы следовали при настройке? Любая помощь высоко ценится. Ваше здоровье.Степан Яковенко
Степан Яковенко
Степан Яковенко
Алекс