{"content":{"title":"Solidity Receive - 接受 Native Coin","body":"它有点烦人，只为发送以太币而必须进行 abi 编码。幸运的是，Solidity 有一种很好的处理方式。\r\n\r\n```solidity\r\n\r\ncontract TakeMoney {\r\n\r\n    receive() external payable {\r\n\r\n    }\r\n}\r\n\r\n```\r\n\r\n注意几个新内容：\r\n\r\n- receive 是一个函数，但它没有 function 关键字。这是因为它是一个“特殊”函数，像构造函数一样，所以为了强调这个，“function” 关键字没有包含。\r\n- 我们使用了修饰符 **external** 而不是 **public**。\r\n\r\n到现在为止，我们每当希望函数可以在合约外部调用时都会使用修饰符 public。External 意味着它可以 **只能** 在合约外部调用。为了简单起见，我们将使用 **public**，但稍后我们会详细讨论 external 和 public 之间的区别。不过，Solidity 只允许 **receive** 函数为 external。\r\n\r\n它还必须是 payable。尝试删除 payable 关键字并编译合约。那将不会成功。\r\n\r\n现在，另一个函数如何发送以太币到它？\r\n\r\n```solidity\r\n\r\ncontract TakeMoney {\r\n    receive()\r\n        external\r\n        payable {\r\n\r\n    }\r\n\r\n    function viewBalance()\r\n        public\r\n        view\r\n        returns (uint256) {\r\n            return address(this).balance;\r\n    }\r\n}\r\n\r\ncontract ForwardMoney {\r\n    function payMe()\r\n        public\r\n        payable {\r\n\r\n    }\r\n\r\n    function sendMoney(address luckyAddress)\r\n        public\r\n        payable {\r\n            uint256 myBalance = viewBalance();\r\n            luckyAddress.call{value: myBalance}(\"\");\r\n    }\r\n\r\n    function viewBalance()\r\n        public\r\n        view\r\n        returns (uint256) {\r\n            return address(this).balance;\r\n    }\r\n}\r\n\r\n```\r\n\r\n现在把它插入 remix 进行测试。\r\n\r\n这干净多了。没有 abi 编码或其他。\r\n\r\n这种结构也是我们向 **wallets** 发送资金的方式。下面是一个允许只有一个地址提取以太币的合约。\r\n\r\n```solidity\r\n\r\ncontract SaveMoney {\r\n    function withdrawMoney()\r\n        public\r\n        payable {\r\n            require(msg.sender ==\r\n                0x5B38Da6a701c568545dCfcB03FcB875f56beddC4,\r\n                \"not the first remix address\");\r\n            msg.sender.call{value: viewBalance()}(\"\");\r\n    }\r\n\r\n    function viewBalance()\r\n        public\r\n        view\r\n        returns (uint256) {\r\n            return address(this).balance;\r\n    }\r\n\r\n    // 任何人都可以发送\r\n    receive()\r\n        external\r\n        payable {\r\n\r\n    }\r\n}\r\n\r\n```\r\n\r\n我们向没有函数的钱包进行“函数调用”可能看起来有些奇怪。\r\n\r\n这种惯例有点令人困惑。只需记住这一点。\r\n\r\n**所有的调用调用都会转移以太币。但是零是一个有效的以太币转移金额。**\r\n\r\n在以太坊中，所有函数调用都可以转移以太币，即使未明确设置值参数。然而，零是一个有效的以太币转移金额，并且在不需要转移任何以太币的情况下非常有用。\r\n\r\n**练习题**\r\n\r\n[Receive](https://github.com/RareSkills/Solidity-Exercises/tree/main/Receive)\r\n\r\n[Donations](https://github.com/RareSkills/Solidity-Exercises/tree/main/Donations)\r\n\r\n[Withdraw](https://github.com/RareSkills/Solidity-Exercises/tree/main/Withdraw)\r\n\r\n[Distribute](https://github.com/RareSkills/Solidity-Exercises/tree/main/Distribute)\r\n\r\n[DistributeV2](https://github.com/RareSkills/Solidity-Exercises/tree/main/DistributeV2)\r\n\r\n[BasicBank](https://github.com/RareSkills/Solidity-Exercises/tree/main/BasicBank)\r\n\r\n[BasicBankV2](https://github.com/RareSkills/Solidity-Exercises/tree/main/BasicBankV2)\r\n\r\n### 了解更多  \r\n\r\n查看  [Solidity 训练营](https://learnblockchain.cn/openspace/1) ，以了解更多关于智能合约开发和代币标准的内容。\r\n\r\n \r\n\r\n>- 原文链接： [rareskills.io/learn-soli...](https://www.rareskills.io/learn-solidity/receive)\r\n>- 登链社区 AI 助手，为大家转译优秀英文文章，如有翻译不通的地方，还请包涵～"},"author":{"user":"https://learnblockchain.cn/people/20722","address":null},"history":null,"timestamp":1740625349,"version":1}