调用合同方法并手动签名时出错。 SendTransaction工作SendRawTransaction没有

时间:2017-07-13 16:38:19

标签: node.js ethereum solidity web3js web3

美好的一天,

我正在编写节点api以暴露我的区块链上的方法(使用松露进行部署和测试)。我使用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);
    }
});

我得到的错误资金不足以获得天然气价格+价值。我从mainAccount(来自: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块的气体限制是4,707,806。所以我应该有足够的。所以问题仍然是为什么我的资金不足。

我怀疑的唯一原因是from:field,这是我的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有关。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我能看到的一些事情

  • 它是gas而不是gasLimit
  • chainId不需要
  • 您应该自己管理nonce,而不是依靠节点向您发送正确的现时。换句话说,不要从节点查询它,而是保持变量

如果你想要,你可以看一下我写的极简主义钱包签名者类 https://gist.github.com/gaiazov/e65a3e36c67eaf46fe81982cd193316d