nodejs и web3: необработанный отказ Ошибка: транзакция не была обработана в пределах 50 блоков, убедитесь, что ваша транзакция была отправлена ​​правильно

Я пытаюсь отправить 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)

Самое интересное, что это работает время от времени. Но можно ли это исправить?

Вы используете основную сеть, тестовую сеть или приватную тестовую сеть? Я бы попробовал увеличить gasPriceза транзакцию.
Я использую тестовую сеть, но буду благодарен, если вы подскажете, как это сделать...
Вы должны добавить параметр 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;.
@StepanYakovenko - у меня точно такая же проблема. Что вы сделали, чтобы решить проблему? Любая помощь будет высоко оценен. Ваше здоровье.
@AbdulMunim, я перешел из тестовой сети в свою локальную сеть блокчейнов и больше никогда этого не видел. Я предлагаю начать вознаграждение за этот вопрос и подождать, пока какой-нибудь эксперт не подскажет нам идею...
@StepanYakovenko Я работаю локально с geth и вижу эту ошибку. Это что-то, что вы установили в своем genesis.jsonфайле, если используете geth ? Спасибо за ваш ответ.
@AbdulMunim Я не задавал там никаких специальных параметров, за исключением того, что я значительно уменьшил сложность майнинга.
@StepanYakovenko спасибо за ответ. Я повторно инициировал его со сложностью 0x10, все еще сталкиваясь с той же проблемой. У вас есть руководство, которому вы следовали при настройке? Любая помощь высоко ценится. Ваше здоровье.
@AbdulMunim, я использовал эти параметры, я плохо в них разбираюсь: gist.github.com/stiv-yakovenko/341e4c3323cdaea071094973c0a9045c
Мне нравятся комментарии, пожалуйста, проголосуйте за них :)
@AbdulMunim смотрите мой ответ ниже. Пожалуйста, укажите, какую тестовую сеть вы использовали/используете. Я рекомендую вам переключиться на тестовые сети Rinkeby или Kovan, потому что у Ropsten были проблемы со злонамеренными майнерами, которые поднимали минимальную цену на газ и атаковали сеть другими способами.

Ответы (5)

Какую тестовую сеть вы использовали в этот момент? Если это была тестовая сеть Ropsten примерно 31 июля (когда был задан ваш вопрос), эта тестовая сеть подверглась атаке и не подтвердила никаких транзакций.

Так что, скорее всего, ваш код в порядке, это была сеть. Вы можете попробовать использовать тестовые сети Rinkeby или Kovan, чтобы подтвердить это. Кроме того, Ropsten теперь должен работать нормально, просто обратите внимание, что время от времени у него возникают проблемы.

нет, не ропстен, местный geth --syncmode 'light'. (цепочка 3?) повторная попытка с полным газовым клиентом после его полной загрузки / синхронизации.

Если это срабатывает время от времени, скорее всего, вы устанавливаете слишком низкую цену на газ. Если у вас есть наличные или в тестовой сети, просто поднимите цену на газ, и вы увидите, как она пролетит. Например, на 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);
            }
        }