【问题标题】:Ethereum web3 sendSignedTransaction: Insufficient funds. The account ... does not have enough funds. Required 750000000000000 and got: 0Ethereum web3 sendSignedTransaction:资金不足。帐户...没有足够的资金。需要 750000000000000 并得到:0
【发布时间】:2018-07-14 18:42:39
【问题描述】:

我正在发送已签名的交易并收到错误:

资金不足。您尝试从中发送交易的帐户 没有足够的资金。需要 750000000000000 得到:0。

问题是我的账户有足够的资金,你可以在这里查看0x002D189c25958c60736aE21C966ff3131C2AC849 如果我设置了gasLimit:web3.utils.toHex(20000),那么我会得到另一个错误:

交易气体太低。没有足够的气体来覆盖最小 交易成本(最低:21464,得到:20000)。尝试增加 供气。

这是我的node / web3 代码:

const Web3 = require('web3')

// connect to Infura node
const web3 = new Web3(new Web3.providers.HttpProvider('https://kovan.infura.io/api_key'))

// the addresses & private key 
const addressFrom = '0x002D189c25958c60736aE21C966ff3131C2AC849';
const contractAddress = '0x36075430619b21Fff798454e2D5C81E9C18DEe81';
const privKey = '240462d...';

//ABI objects
var contractABI = new web3.eth.Contract(
    [ ...abi... ],
    contractAddress);
const contractFunction = contractABI.methods.changeBox(5);
const functionABI = contractFunction.encodeABI();

// construct the Tx data
const rawTx = {
    //gasPrice: '0x09184e72a000',
    gasLimit: web3.utils.toHex(25000),
    to: contractAddress,
    from: addressFrom,
    data: functionABI
    };

//sign & send Tx
web3.eth.accounts.signTransaction(rawTx, privKey)
    .then(RLPencodedTx => {
        web3.eth.sendSignedTransaction(RLPencodedTx['rawTransaction'])
            .on('receipt', console.log);
    });

有人知道为什么 web3 会抛出这些错误的错误吗?

【问题讨论】:

  • 你是如何从私钥得到地址的?你确定你有那个钥匙的正确地址吗?旁注:你不应该需要 10 Terawei 的汽油价格才能包含在一个区块中。最近的几笔交易包含在 30 Gigawei。
  • 我通过Parity创建了账户,并将账户导出为json文件,其中包含ciphertext,这是私钥
  • 另外,我看到你喜欢 python。有一些python工具可以做类似的工作,例如:web3py.readthedocs.io/en/stable/web3.eth.account.html

标签: javascript node.js ethereum web3


【解决方案1】:

我已经通过 Parity 创建了帐户,并将帐户导出为 json 文件,其中包含 ciphertext,这是私钥

cipthertext 是私钥的加密 版本。这个Q&A includes some deeper background,如果你好奇的话。

要获取您的私钥,您需要密钥文件和用于加密它的密码。然后您可以使用 web3.js v1 (beta) 中的web3.eth.accounts.decrypt() 来提取密钥,如下所示:

web3.eth.accounts.decrypt({
    version: 3,
    id: '04e9bcbb-96fa-497b-94d1-14df4cd20af6',
    address: '2c7536e3605d9c16a7a3d7b1898e529396a65c23',
    crypto: {
        ciphertext: 'a1c25da3ecde4e6a24f3697251dd15d6208520efc84ad97397e906e6df24d251',
        cipherparams: { iv: '2885df2b63f7ef247d753c82fa20038a' },
        cipher: 'aes-128-ctr',
        kdf: 'scrypt',
        kdfparams: {
            dklen: 32,
            salt: '4531b3c174cc3ff32a6a7a85d6761b410db674807b2d216d022318ceee50be10',
            n: 262144,
            r: 8,
            p: 1
        },
        mac: 'b8b010fff37f9ae5559a352a185e86f9b9c1d7f7a9f1bd4e82a5dd35468fc7f6'
    }
}, 'test!'); // <-- your password for the account goes in place of 'test!'
> {
    address: "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23",
    privateKey: "0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318",
    signTransaction: function(tx){...},
    sign: function(data){...},
    encrypt: function(password){...}
}

【讨论】:

  • 如果私钥是从 Metamask 导出的,并且是正确的,但我仍然得到与原始发布者相同的错误怎么办?同样的问题,我的帐户中有足够的 ETH(使用 web3.js 和节点在 kovan 测试网上进行测试)
  • @DanielHursan 你有什么解决办法吗?
  • @HardikMandankaa,对不起,我最终切换到 .NET 实现,因为我是 .NET 开发人员。 (以太坊)。尝试在 web3.js 的 gitter 频道中发布您的问题 - gitter.im/ethereum/web3.js 该社区中有很多有用且有见地的开发人员。
猜你喜欢
  • 2018-12-16
  • 2014-05-29
  • 1970-01-01
  • 2017-01-19
  • 2013-12-30
  • 2020-04-14
  • 2014-01-24
  • 2018-08-30
  • 2015-06-10
相关资源
最近更新 更多