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

