【问题标题】:Ethereum: NodeJS web3 - UnhandledPromiseRejectionWarning: Insufficient funds以太坊:NodeJS web3 - UnhandledPromiseRejectionWarning:资金不足
【发布时间】:2018-12-16 08:28:08
【问题描述】:

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

1.)

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

2.)

(node:15422) UnhandledPromiseRejectionWarning: 未处理的承诺 拒绝。此错误源于在异步内部抛出 在没有 catch 块的情况下运行,或者通过拒绝一个承诺 不使用 .catch() 处理。 (拒绝编号: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);
    }});

【问题讨论】:

    标签: node.js promise ethereum smartcontracts web3


    【解决方案1】:

    sendSignedTransaction 返回一个promiEvent,您可以将thencatch 链接到该catch

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

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

    【讨论】:

    • 但是 catch 到底应该做什么呢?就像我说的:完全相同的方法,但有其他参数,适用于另一个 smartcontract 及其 contract function
    • 我有一个不同的未处理承诺拒绝,此代码更新修复了错误。它也将有助于我的代码的另一个方面。非常感谢!
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 2018-01-07
    • 2021-10-02
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2017-12-28
    • 2018-07-14
    相关资源
    最近更新 更多