美好的一天,
我正在编写一个节点api以在我的区块链上公开方法(已部署并经过松露测试)。我使用web3.js,ethereumjs-tx,以太坊,松露和坚固性作为我的技术堆栈。
var txMethodData = masterKeyContract.myMethod.getData(myParams);
事务参数为:
const txParams = {
nonce: web3.toHex(web3.eth.getTransactionCount(web3.eth.coinbase)),
gasPrice: web3.toHex(web3.eth.gasPrice),
gasLimit: web3.toHex(2000000),
from: mainAccount,
value: '0x00',
to: targetContract.address,
data: txMethodData,
chainId: 3
};
我正在使用ethereumjs-tx
const EthereumTx = require('ethereumjs-tx');
使用链接到我的mainAccount的私钥签署交易
const tx = new EthereumTx(txParams);
tx.sign(privateKey);
const serializedTx = tx.serialize();
web3.eth.sendRawTransaction("0x" + serializedTx.toString('hex'), function (err1, resp1) {
if (err1) {
console.log(err1);
} else {
console.log(resp1);
}
});
而且我得到的错误是供气*价格+价值不足的资金。我从mainAccount(txParams中的from:字段)发送此交易。所以我将余额记入了我的mainAccount
web3.eth.getBalance(mainAccount, function (error, result) {
if (!error) {
console.log(web3.fromWei(result.toNumber(), "ether"));
} else {
console.error(error);
}
});
结果是252.12609391539726。因此不可能没有资金。我什至估计了web3.eth.estimateGas(txParams)事务,它给了我97899。当前ropstein区块的气体限制为4,707,806。所以我应该有足够的。所以问题仍然是为什么我没有足够的资金。
我怀疑的唯一原因是from:字段(这是我的mainAccount)实际上不是交易的付款人。
更新:
问题可能出在签名上,因为我刚刚测试过
web3.eth.sendTransaction(txParams, function (err1, resp1) {
if (err1) {
console.log(err1);
} else {
console.log(resp1);
}
});
它起作用了,所以问题实际上是为什么sendRawTransaction不起作用。可能与我签署交易的方式有关吗?
我检查了
const privateKey = Buffer.from('[private_key_inserted_here]', 'hex');
实际上与我的mainAccount有关。 private_key_inserted_here来自“密文”字段中与我的主帐户相关的密钥库。然后我通过匹配密钥库的“地址”字段检查了与我的mainAccount相关的内容。
提前致谢。
最佳答案
我看到的一些东西
是gas
而不是gasLimit
不需要chainId
您应该真正自己管理nonce
,而不是依赖节点向您发送正确的随机数。换句话说,不要从节点查询它,而要保留一个变量
如果您愿意,可以看一看我写的极简钱包签名器类
https://gist.github.com/gaiazov/e65a3e36c67eaf46fe81982cd193316d