# Solidity极简入门: 19. 接收ETH receive和fallback **Published by:** [0xAA](https://paragraph.com/@wtfacademy/) **Published on:** 2022-05-01 **URL:** https://paragraph.com/@wtfacademy/solidity-19-eth-receive-fallback ## Content 我最近在重新学solidity,巩固一下细节,也写一个“Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 欢迎关注我的推特:@0xAA_Science WTF技术社群discord,内有加微信群方法:链接 所有代码和教程开源在github(1024个star发课程认证,2048个star发社群NFT): github.com/AmazingAng/WTFSolidity回调函数Solidity支持两种特殊的回调函数,receive()和fallback(),他们主要在两种情况下被使用:接收ETH处理合约中不存在的函数调用(代理合约proxy contract)我们这一讲主要介绍接收ETH的情况。接收ETH函数 receivereceive()只用于处理接收ETH。一个合约最多有一个receive()函数,声明方式与一般函数不一样,不需要function关键字:receive() external payable { ... } receive()函数不能有任何的参数,不能返回任何值,必须包含external和payable。 当合约接收ETH的时候,receive()会被触发。receive()最好不要执行太多的逻辑因为如果别人用send和transfer方法发送ETH的话,gas会限制在2300,receive()太复杂可能会触发Out of Gas报错;如果用call就可以自定义gas执行更复杂的逻辑(这三种发送ETH的方法我们之后会讲到)。 我们可以在receive()里发送一个event,例如: // 定义事件 event Received(address Sender, uint Value); // 接收ETH时释放Received事件 receive() external payable { emit Received(msg.sender, msg.value); } 有些恶意合约,会在receive()函数嵌入恶意消耗gas的内容,使得一些退款合约不能正常工作:Akutar NFT项目因此被永久锁定了11539 ETH,接近2亿元!因此写包含退款等逻辑的合约时候,一定要注意这种情况。回退函数 fallbackfallback()函数会在调用合约不存在的函数时被触发。可用于接收ETH,也可以用于代理合约proxy contract。fallback()声明时不需要function关键字,必须由external修饰,一般也会用payable修饰,用于接收ETH:fallback() external payable { ... }。 我们定义一个fallback()函数,被触发时候会释放fallbackCalled事件,并输出msg.sender,msg.value和msg.data: // fallback fallback() external payable{ emit fallbackCalled(msg.sender, msg.value, msg.data); } receive和fallback的区别receive和fallback都能够用于接收ETH,他们触发的规则如下:触发fallback() 还是 receive()? 接收ETH | msg.data是空? / \ 是 否 / \ receive()存在? fallback() / \ 是 否 / \ receive() fallback() 简单来说,合约接收ETH时,msg.data为空且存在receive()时,会触发receive();msg.data不为空或不存在receive()时,会触发fallback(),此时fallback()必须为payable。 receive()和payable fallback()均不存在的时候,向合约发送ETH将会报错。总结这一讲,我介绍了Solidity中的两种特殊函数,receive()和fallback(),他们主要在两种情况下被使用,他们主要用于处理接收ETH和代理合约proxy contract。 ## Publication Information - [0xAA](https://paragraph.com/@wtfacademy/): Publication homepage - [All Posts](https://paragraph.com/@wtfacademy/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@wtfacademy): Subscribe to updates - [Twitter](https://twitter.com/0xAA_Science): Follow on Twitter