如何发起Web3交易?sendTransaction相关报错排查
Web3交易实现问题定位与修复方案
问题根因
两个报错的触发原因如下:
Invalid parameters: must provide an Ethereum address:地址格式字符串本身合法不代表符合Web3.js的传参要求,1.x以上版本的Web3.js强制要求地址经过checksum校验和格式化,且from字段必须是当前连接钱包已授权的签名地址,未做格式化、未关联钱包授权的地址都会被判定为非法参数。另外你贴的代码里from和to都传了paymentAddress,属于自转账逻辑,要确认是不是笔误。web3.toWei is not a function:Web3.js 1.0版本后所有工具方法统一挂载到utils命名空间下,不再支持直接在web3实例上调用toWei方法,旧版本写法直接迁移就会触发该报错。
修复步骤
- 初始化Web3实例时先完成钱包连接授权,对所有传入的地址做checksum格式化
// 初始化Web3实例,对接浏览器插件钱包时直接注入provider即可 const web3 = new Web3(window.ethereum); // 请求用户钱包授权,拿到可签名的合法账户地址 const connectedAccounts = await window.ethereum.request({ method: 'eth_requestAccounts' }); // 对所有参与交易的地址做校验和格式化 const validFromAddress = web3.utils.toChecksumAddress(connectedAccounts[0]); // 替换为实际收款地址,不要和付款地址重复 const validToAddress = web3.utils.toChecksumAddress(actualRecipientAddress);
- 修正交易发送逻辑,使用正确的工具方法调用方式传参
// 单位转换统一走utils命名空间,不要直接调用web3.toWei const transferValue = web3.utils.toWei(amountEth.toString(), 'ether'); web3.eth.sendTransaction({ from: validFromAddress, to: validToAddress, value: transferValue }, (err, transactionHash) => { if (err) { console.log('Payment failed', err); divMessage.style.display = "block"; $('#divMessage').html('Payment failed'); return; } // 交易发送成功后可写后续业务逻辑,transactionHash为链上交易哈希,可用于轮询交易确认状态 console.log('Transaction sent successfully, tx hash:', transactionHash); })
避坑提示:前端对接钱包场景下,
from参数必须传用户主动授权连接的钱包地址,不要硬传自定义地址,否则哪怕地址格式完全正确,也会因为没有签名权限被节点拒绝。
内容的提问来源于stack exchange,提问作者Ann
相关产品推荐
相关产品推荐

