使用 ethreumjs-tx 签名并使用 HttpProvider 发送会给出“超过块气体限制”,而不管 gasLimit

Posted

技术标签:

【中文标题】使用 ethreumjs-tx 签名并使用 HttpProvider 发送会给出“超过块气体限制”,而不管 gasLimit【英文标题】:Sign with ethrereumjs-tx and send with HttpProvider gives "Exceeds block gas limit" regardless of gasLimit 【发布时间】:2019-07-04 06:16:01 【问题描述】:

我正在尝试编写一个保存私钥并签署交易的服务器。我使用 ethereumjs-wallet/hdkey 生成帐户和私钥,使用 ethereumjs-tx 签署交易,使用 Httprovider 发送交易的 web3js。

不幸的是,当我尝试发送交易时,我总是收到错误消息“超过块气体限制”(即使我将 gasLimit 设置为 21000,远低于我的 ganache-cli 实例的块气体限制)。

我怀疑原始编码交易的格式有误。

知道实际问题是什么以及如何解决?

干杯

const hdkey = require('ethereumjs-wallet/hdkey');
const Transaction = require('ethereumjs-tx');
const walletHdpath = "m/44'/60'/0'/0/";
const hdwallet = hdkey.fromMasterSeed(bip39.mnemonicToSeed(process.env.KEYSTORE_SEED));
const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

async function generateAccount() 
        const wallet = hdwallet.derivePath(walletHdpath + nextAccountIndex).getWallet();
        nextAccountIndex += 1;
        const addr = '0x' + wallet.getAddress().toString('hex');
        accounts[addr] = wallet;

        await fundAccount(addr);

        return addr;


async function fundAccount(address) 
    const txParams = 
        gasPrice: '20000000000',
        gasLimit: '21000',
        from: process.env.KEYSTORE_ADDRESS_0,
        to: address,
        value: web3.utils.toWei('0.1', 'ether'),
        data: ''
      

      const signed = signTransaction(txParams);

      // this line throws exception: "exceeds block gas limit"
      await web3.eth.sendSignedTransaction(signed.signed_transaction);


function signTransaction(txParams) 
    const from = txParams.from.toLowerCase();
    const wallet = accounts[from];
    if (wallet === undefined) 
        return sucess: false, message: "unknown from account" 
     

    const tx = new Transaction(txParams);
    const pkey = wallet.getPrivateKey();
    tx.sign(pkey);
    const rawTx = '0x' + tx.serialize().toString('hex');

    return  success: true, signed_transaction: rawTx 


【问题讨论】:

你可以试试更低的gas价格吗? 【参考方案1】:

问题是 txParams 中的值需要进行十六进制编码并以 0x 为前缀

【讨论】:

以上是关于使用 ethreumjs-tx 签名并使用 HttpProvider 发送会给出“超过块气体限制”,而不管 gasLimit的主要内容,如果未能解决你的问题,请参考以下文章

httpclient 和自签名证书的问题

Node.js创建自签名的HTTPS服务器

ECDSA 使用 HSM 签名并在 Java/Kotlin 中进行验证

ECDSA 使用 BouncyCastle 签名并使用 Crypto++ 进行验证

关于 iOS 代码签名策略 - 当我们在没有代码签名的情况下归档项目并稍后使用配置文件将其导出时会发生啥?

Web3 签名交易问题找到非十六进制数字(Python)