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

