使用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
相关产品推荐
相关产品推荐

