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

如何发起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方法,旧版本写法直接迁移就会触发该报错。

修复步骤

  1. 初始化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);
  1. 修正交易发送逻辑,使用正确的工具方法调用方式传参
// 单位转换统一走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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:39:18