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

Web3 v0.2中Ganache地址参数失效,转账误至合约地址问题排查

问题分析:转账误转至合约地址而非目标地址

兄弟,我一眼就看到了你Web3代码里的关键问题——调用合约函数的方式错了,导致这笔交易根本没触发你写的sendMoney函数,反而变成了直接向合约地址转ETH的普通转账,这就是为什么MetaMask弹窗看不到address参数,钱直接进了合约。

Web3代码的核心错误

你现在用的是instance.sendMoney.sendTransaction(...)这种写法,这是Web3.js v0.x的旧语法,但现在大部分DApp用的都是v1.x版本,v1.x里必须通过methods对象来调用合约函数,否则Web3不会把你的函数参数编码进交易数据里。

正确的写法应该是这样:

App.contracts.EthereumPractice.deployed().then(function (instance) {
  // 先通过methods获取目标函数,传入地址参数,再调用send()传入交易选项
  return instance.methods.sendMoney(addressInput.value).send({ 
    from: web3.eth.accounts[0], 
    value: etherAmount 
  });
})

原来的写法没有通过methods对象,MetaMask只能识别出这是一笔向合约地址转ETH的请求,自然不会显示你要传递的目标地址参数,钱就直接进了合约账户。

额外提个Solidity的小问题(避免后续踩坑)

虽然你问的是Web3的问题,但你的Solidity函数也有两个潜在问题:

  • 函数没有加payable修饰符:如果没加这个,带value的交易调用会直接失败(你说钱已经转出,可能你实际代码里加了,但贴出来的没写);
  • 用this.balance会转走合约所有余额:如果你只是想转用户本次转入的etherAmount,应该用msg.value代替this.balance,不然合约里之前的其他资金也会被一起转走。修正后的Solidity代码:
function sendMoney(address _sendToThisAddress) public payable {
  _sendToThisAddress.transfer(msg.value);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:33:11