以太坊:NodeJS web3-UnhandledPromiseRejection警告:资金不足

时间:2018-07-08 13:00:53

标签: node.js promise ethereum smartcontracts web3

我正在使用web3.js v1.0.0-beta.34nodeJS v9.11.2smart contract Kovan上执行testnet。同样的方法对我在Ropsten上使用另一个智能合约也适用。这是我通过回调收到的两个错误:

1。)

  

UnhandledPromiseRejectionWarning:错误:返回的错误:不足   资金。您尝试从中发送交易的帐户没有   足够的资金。必需183675000000并获得:0。

2。)

  

(节点:15422)UnhandledPromiseRejectionWarning:未处理的承诺   拒绝。该错误是由抛出异步内部引起的   没有捕获块或拒绝承诺   未使用.catch()处理。 (拒绝ID:1)

这是我的智能合约:

pragma solidity ^0.4.24;

contract Test2 {
    address public customer;
    bytes32 public productName;

    struct Box {
        uint size;
    }
    Box public box;

    constructor() public {
        box.size = 3;
        customer = 0xDa3E3C75....;
        productName = "0x576...";
    }

    function changeBox(uint _change) public {
        box.size = _change;
    }

    function getBox() public returns (uint) {
        return box.size;
    }  
}

下面是执行交易并使用web3和节点执行function changeBox的JavaScript代码:

const Tx = require('ethereumjs-tx');
var Web3 = require('web3'); 


var web3 = new Web3(new Web3.providers.HttpProvider('https://kovan.infura.io/api_key'));
const contractAddress = '0x36075430619b21Fff798454e2D5C81E9C18DEe81';
var contractABI = new web3.eth.Contract(
    [...json abi...], contractAddress);
var boxNum;


function changeBox(boxNum, callback) {
    web3.eth.defaultAccount = "0x002D189c25958c60...";
    const account = '0x002D189c2595...';
    const privateKey = Buffer.from('240462d5...', 'hex');
    const contractFunction = contractABI.methods.changeBox(Number(boxNum));
    const functionAbi = contractFunction.encodeABI();
    let estimatedGas;
    let nonce;

    contractFunction.estimateGas(function(error, gasAmount) {
        if(!error) {
            console.log('Estimated Gas : ' + gasAmount);
            estimatedGas = gasAmount + 10000;
            console.log('New Gas: ' + estimatedGas);

            web3.eth.getTransactionCount(account).then(_nonce => { 
                nonce = _nonce.toString(16);
                console.log("Nonce: " + nonce);

                const txParams = {
                    gasPrice: estimatedGas,
                    gasLimit: 5000000,
                    to: contractAddress,
                    data: functionAbi,
                    from: account,
                    nonce: '0x' + nonce
                };
                const tx = new Tx(txParams);
                tx.sign(privateKey);
                const serializedTx = tx.serialize();
                web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('receipt', receipt => {
                    callback(receipt);

                });
            });  
        } 
        else {
            callback(error);
        }
    });
}

//calling the contract with value 6
changeBox(6, function(err, data) {
    if (!err) {
        console.log(data);
    }
    else {
        console.log(err);
    }});

1 个答案:

答案 0 :(得分:3)

((Control)spOptionsValue.Children[loopIndex - 3]).Focus(); 返回一个promiEvent,您可以在其上链接sendSignedTransactionthen

catch

web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')) .on('receipt', receipt => { callback(receipt); }).then(() => { // success }).catch(() => { // fail }); 之所以被抛出,是因为Promise被拒绝了,但是没有Unhandled promise rejection处理程序。