javascript - Ethereum web3 sendSignedTransaction:资金不足。帐户...没有足够的资金。需要 750000000000000 并得到:0
问题描述
我正在发送已签名的交易并收到错误:
不充足的资金。您尝试从中发送交易的帐户没有足够的资金。需要 750000000000000 并得到:0。
问题是我的账户有足够的资金,你可以在这里查看0x002D189c25958c60736aE21C966ff3131C2AC849
如果我设置了 gasLimit: web3.utils.toHex(20000)
,那么我会收到另一个错误:
交易气体太低。没有足够的 gas 来支付最低的交易成本(最低: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 会抛出这些错误的错误?
解决方案
我已经通过 Parity 创建了帐户,并将帐户导出为 json 文件,其中包含
ciphertext
,这是私钥
cipthertext
是私钥的加密版本。如果你好奇的话,这个问答包括一些更深层次的背景。
要获取您的私钥,您将需要密钥文件和用于加密它的密码。然后您可以使用web3.eth.accounts.decrypt()
from web3.js v1 (beta) 来提取密钥,如下所示:
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){...}
}
推荐阅读
- ruby-on-rails - Docker Compose - 更短的命令别名
- excel - 使用 laravel 和 mattwebsite excel 将布尔值从 excel 文件导入数据库
- c - 宏或全局数组
- jenkins - Jenkins Groovy 管道,变量添加换行符并中断 curl 语句
- python - 保留数据框中不均匀行的最后 n 个实际值?
- r - Bbox的星星物体小于星星物体本身?
- facebook-graph-api - 如何使 Facebook API 批处理请求异步
- git - 如何从 .gitignore 中列出的存储库中删除文件而不更改空格
- webpack - 如何在 Nextjs 应用程序中删除 .js 块?
- sql - 如何将从 SQL 查询接收到的字段设置为 Crystal Reports 中另一个存储过程的参数?