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

如何通过已部署智能合约实现ETH账户间转账(React+Ganache+MetaMask)

ETH转账功能修改方案

一、智能合约优化(可选但更严谨)

当前合约的payment函数逻辑可实现转账,但缺少金额校验,易出现合约余额不足的情况。建议添加校验逻辑,确保合约收到的ETH足够覆盖转账金额:

function payment(uint amount, address payable beneficiary) payable external {
    // 校验合约收到的ETH与转账金额一致(可根据需求调整为大于等于)
    require(msg.value == amount, "转账金额与传入ETH不匹配");
    beneficiary.transfer(amount);
}

若希望直接转调用者传入的全部ETH,可简化代码:

function payment(address payable beneficiary) payable external {
    beneficiary.transfer(msg.value);
}

二、React前端代码核心修改

问题根源是调用合约时未附带要转账的ETH金额,导致合约仅消耗Gas费,无可用ETH转出。需在send方法中添加value参数,同时注意以太坊金额单位转换(默认单位为wei,需将ETH转为wei):

修改后的代码示例:

function payment(e){
    e.preventDefault();
    // 定义转账金额(示例为1ETH,需转为wei单位)
    const transferAmount = web3.utils.toWei('1', 'ether'); 
    // 可改为从输入框动态获取收款地址,示例为固定地址
    const beneficiary = '0xe13DC66579940552574Cbe795410423609C2BFd9';

    project.methods.payment(transferAmount, beneficiary)
        .send({
            from: CurrentAccount, // 简化写法,直接使用当前账户
            value: transferAmount // 关键:添加要转账的ETH金额(wei单位)
        })
        .on('transactionHash', (hash) => {
            console.log('交易哈希:', hash);
        })
        .on('error', (error) => {
            console.error('转账失败:', error);
        });
}

关键修改点:

  • 新增value参数:在send的配置对象中传入转账金额(必须为wei单位),该部分ETH会从调用者账户转入合约,再由合约转给目标地址。
  • 金额单位转换:用web3.utils.toWei()将ETH转为wei,避免原代码中1代表1wei(约等于0ETH)的极小金额问题。
  • 简化账户写法:{CurrentAccount}['CurrentAccount']可直接写为CurrentAccount,代码更简洁。

三、前端交互优化(可选)

若要实现“输入收款地址”功能,可添加输入框并动态获取地址:

// 组件渲染部分添加输入框和按钮
<input type="text" id="beneficiary" placeholder="请输入收款地址" />
<button onClick={payment}>发起转账</button>

// 修改payment函数获取输入的地址
const beneficiary = document.getElementById('beneficiary').value;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:01:17