Web3.js在Kovan测试网签名发交易时txHash输出undefined问题
Kovan测试网发送交易返回txHash为undefined问题解决方案
你代码的核心问题和修复步骤如下:
1 优先排查错误信息
你当前的回调只打印了txHash,没有处理错误参数,txHash为undefined说明交易发送环节已经报错,先打印错误信息定位根因:
web3.eth.sendSignedTransaction(raw, (err, txHash) =>{ // 新增错误打印,直接就能看到具体失败原因 if (err) console.error('交易发送失败原因:', err) console.log('txHash:', txHash) })
2 修复gasLimit配置错误(高频触发原因)
普通ETH转账的最低gasLimit为21000,你代码中填写的2100远低于最低要求,节点会直接拒绝该交易,修改txObject中的gasLimit字段:
gasLimit: web3.utils.toHex(21000),
3 检查私钥和交易签名配置
如果你使用的是v3及以上版本的@ethereumjs/tx库,需要注意两个配置要求:
- 传入sign方法的私钥必须是不带0x前缀的Buffer类型,如果你的私钥是字符串格式,先做转换:
const privateKey1 = Buffer.from('你的私钥内容去掉开头的0x', 'hex') - 推荐用Common对象明确指定链配置,避免链ID匹配错误:
const { Common, Chain } = require('@ethereumjs/common') const { Transaction } = require('@ethereumjs/tx') const common = new Common({ chain: Chain.Kovan }) const tx = Transaction.fromTxData(txObject, { common })
4 改用更稳定的事件监听写法
web3的sendSignedTransaction支持事件监听写法,比回调方式更不容易丢信息,替换原有广播逻辑即可:
web3.eth.sendSignedTransaction(raw) .on('transactionHash', hash => { // 交易进入节点内存池后就会返回txHash console.log('txHash:', hash) }) .on('receipt', receipt => { console.log('交易上链成功,收据:', receipt) }) .on('error', err => { console.error('交易异常:', err) })
内容的提问来源于stack exchange,提问作者PythonCoder1981
相关产品推荐
相关产品推荐

