You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Web3.js[1.0.0] + Node调用sendSignedTransaction时交易收据检查失败

Web3.js 1.0.0 sendSignedTransaction 交易收据检查失败问题解决

我之前也碰到过Web3.js 1.0.0版本里这个sendSignedTransaction的收据检查失败问题,给你几个排查和解决的方向:

  • 检查签名交易数据的完整性
    签名后的交易数据如果缺失必填字段或者参数错误,会导致节点无法正常处理交易,进而返回空的收据信息。你可以先打印出签名后的交易数据,确认gasPrice、gasLimit、to、nonce这些核心字段是否正确:

    console.log(JSON.stringify(data, null, 2));
    

    特别注意nonce不能重复,也不能比当前账户的下一个可用nonce小,否则交易会被节点拒绝。

  • 调整Web3的交易等待配置
    Web3.js 1.0.0默认的交易收据等待逻辑可能存在超时或者重试次数不足的问题,尤其是在测试链(如Ganache)或者链上拥堵时。你可以手动修改配置参数:

    const w3 = new Web3(new Web3.providers.HttpProvider('你的节点URL'));
    // 设置需要等待的确认区块数
    w3.eth.transactionConfirmationBlocks = 1;
    // 延长交易区块等待超时时间(单位:秒)
    w3.eth.transactionBlockTimeout = 60;
    
  • 验证节点连接状态
    先确认你的Web3连接的节点是否正常可用,比如调用w3.eth.getBlockNumber()测试:

    w3.eth.getBlockNumber().then(num => console.log('当前区块高度:', num))
      .catch(err => console.error('节点连接失败:', err));
    

    如果这个调用失败,说明节点未启动、URL错误或者权限受限,先解决节点连接问题再尝试交易。

  • 简化回调逻辑避免冲突
    你当前的代码同时使用了once('receipt')和then()回调,可能存在内部逻辑冲突。可以简化代码,只保留事件监听:

    w3.eth.sendSignedTransaction(data)
      .on('transactionHash', (hash) => {
        console.log(`已提交交易,哈希: ${hash}`);
      })
      .on('confirmation', (confirmationNumber, receipt) => {
        console.log(`交易确认数: ${confirmationNumber}`);
        if (confirmationNumber >= 1) {
          console.log('交易完成,收据:', receipt);
        }
      })
      .on('error', (err) => {
        console.error('交易出错:', err);
      });
    
  • 升级Web3.js版本(推荐)
    Web3.js 1.0.0属于早期的正式版本,存在不少已知的bug,后续的1.3.x及以上版本已经修复了大量交易相关的问题。如果项目依赖允许,建议升级到稳定版本:

    npm install web3@1.8.2 --save
    

内容的提问来源于stack exchange,提问作者1110

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:24:41