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

无法向Solidity智能合约转入以太币,交易回滚问题求助

合约接收以太币回滚的问题排查与解决

问题原因

你的合约当前仅定义了RecieveMoney payable函数,但如果是直接向合约地址转账(未调用该函数),合约没有实现Solidity要求的receive()或fallback()特殊函数,交易会被默认回滚。另外也需要确认你是否正确调用了RecieveMoney函数并附带了转账金额。

解决方案

1. 添加默认接收函数

如果需要合约支持直接转账(无需手动调用特定函数),添加以下receive()函数,它会在合约直接收到以太时自动触发:

receive() external payable {
    funds[msg.sender] += msg.value;
    funders.push(msg.sender);
}

逻辑可以和RecieveMoney保持一致,确保转账记录正常更新。

2. 正确调用收款函数

如果通过调用函数转账,需注意操作步骤:

  • 在Remix或其他开发工具中,选中RecieveMoney函数;
  • 在VALUE输入框填写要转入的以太金额(可选择Wei、Gwei等单位);
  • 点击调用按钮完成转账,不要直接向合约地址发起无函数调用的转账(除非已添加上述receive()函数)。

3. 可选:修正函数命名规范

Solidity推荐函数名使用小驼峰命名,将RecieveMoney改为receiveMoney(不影响功能,但提升代码可读性和规范性)。

修改后的完整合约示例:

pragma solidity ^0.8.0;

contract SimpleBank {
    string public name;
    address public owner;
    mapping (address => uint256) public funds;
    address[] public funders;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner{
        require(msg.sender == owner);
        _;
    }

    function getBalance() public view returns (uint256){
        return owner.balance;
    }

    function getAddress() public view returns(address){
        return owner;
    }

    function receiveMoney() public payable{
        funds[msg.sender] += msg.value;
        funders.push(msg.sender);
    }

    receive() external payable {
        funds[msg.sender] += msg.value;
        funders.push(msg.sender);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:01:08