调用合约方法并手动签名时出错。 SendTransaction 有效 SendRawTransaction 无效
Error when calling contract method and signing it manually. SendTransaction works SendRawTransaction doesn't
我正在编写一个节点 API 以在我的区块链上公开方法(使用 truffle 进行部署和测试)。我正在使用 web3.js、ethereumjs-tx、ethereum、truffle 和 solidity 作为我的技术堆栈。
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);
}
});
我收到错误消息,gas * price + value 资金不足。我从 mainAccount 发送此交易(from: 来自 txParams 的字段)。所以我在我的 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 区块的 gas 限制是 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');
实际上与我的主帐户有关。 private_key_inserted_here 取自“密文”字段中与我的主帐户相关的密钥库。我通过匹配密钥库的“地址”字段检查了它是否与我的 mainAccount 相关。
我能看到的一些东西
- 是
gas
而不是 gasLimit
chainId
不需要
- 你真的应该自己管理
nonce
而不是依赖节点向你发送正确的随机数。换句话说,不要从节点查询它而是在 周围保留一个变量
如果你愿意,你可以看看一个极简主义的钱包签名者 class 我写了
https://gist.github.com/gaiazov/e65a3e36c67eaf46fe81982cd193316d
我正在编写一个节点 API 以在我的区块链上公开方法(使用 truffle 进行部署和测试)。我正在使用 web3.js、ethereumjs-tx、ethereum、truffle 和 solidity 作为我的技术堆栈。
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);
}
});
我收到错误消息,gas * price + value 资金不足。我从 mainAccount 发送此交易(from: 来自 txParams 的字段)。所以我在我的 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 区块的 gas 限制是 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');
实际上与我的主帐户有关。 private_key_inserted_here 取自“密文”字段中与我的主帐户相关的密钥库。我通过匹配密钥库的“地址”字段检查了它是否与我的 mainAccount 相关。
我能看到的一些东西
- 是
gas
而不是gasLimit
chainId
不需要- 你真的应该自己管理
nonce
而不是依赖节点向你发送正确的随机数。换句话说,不要从节点查询它而是在 周围保留一个变量
如果你愿意,你可以看看一个极简主义的钱包签名者 class 我写了 https://gist.github.com/gaiazov/e65a3e36c67eaf46fe81982cd193316d