NodeJS UnhandledPromiseRejection警告:资金不足

pjngdqdw  于 2023-04-20  发布在  Node.js
关注(0)|答案(1)|浏览(145)

我使用web3.jsv1.0.0-beta.34& nodeJS v9.11.2在Kovan测试网上执行智能合约。同样的方法对我在Ropsten上使用另一个智能合约也有效。下面是我通过回调得到的两个错误:
UnhandledPromiseRejection警告:错误:返回错误:资金不足。您尝试发送交易的帐户没有足够的资金。需要183675000000并获得:0.
(node:15422)UnhandledPromiseRejectionWarning:未处理的promise rejection。此错误源于在没有catch块的异步函数内部抛出,或者拒绝未使用.catch()处理的promise。(rejection 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和node执行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);
    }});
u5i3ibmn

u5i3ibmn1#

sendSignedTransaction返回一个promiEvent,你可以在上面链接thencatch

web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
  .on('receipt', receipt => {
    callback(receipt);
  }).then(() => {
    // success
  }).catch(() => {
    // fail
  });

抛出Unhandled promise rejection,因为promise被拒绝,但没有catch处理程序。

相关问题