美文网首页Solidity智能合约专题
Solidity的fallback和receive

Solidity的fallback和receive

作者: 梁帆 | 来源:发表于2022-11-09 23:02 被阅读0次

    Solidity 支持两种特殊的回调函数,receive() 和 fallback(),他们主要在两种情况下被使用:

    • 接收 ETH

    • 处理合约中不存在的函数调用(代理合约 proxy contract)

    我们这一讲主要介绍接收 ETH 的情况。

    1.接收 ETH 函数 receive

    receive() 只用于处理接收 ETH

    当合约接收 ETH 的时候,receive() 会被触发。receive() 最好不要执行太多的逻辑因为如果别人用 send 和 transfer 方法发送 ETH 的话,gas 会限制在 2300,receive() 太复杂可能会触发 Out of Gas 报错;如果用 call 就可以自定义 gas 执行更复杂的逻辑(这三种发送 ETH 的方法我们之后会讲到)。

    有些恶意合约,会在 receive() 函数嵌入恶意消耗 gas 的内容,使得一些退款合约不能正常工作:Akutar NFT项目因此被永久锁定了 11539 ETH,接近 2 亿元!因此写包含退款等逻辑的合约时候,一定要注意这种情况。

    2.回退函数 fallback

    fallback() 函数会在调用合约不存在的函数时被触发。可用于接收 ETH,也可以用于代理合约 proxy contract。fallback() 声明时不需要 function 关键字,必须由 external 修饰,一般也会用 payable 修饰,用于接收 ETH:

    fallback() external payable { ... }
    

    3.receive 和 fallback 的区别

    receive 和 fallback 都能够用于接收 ETH,他们触发的规则如下: receive和fallback的触发规则

    简单来说,合约接收 ETH 时,msg.data 为空且存在 receive() 时,会触发 receive();msg.data 不为空或不存在 receive() 时,会触发 fallback(),此时 fallback() 必须为 payable。

    一般来说,合约中如果定义了 payable fallback() 而缺少 receive() 函数的话,会报warning提示你加入定义 receive() 函数。

    receive() 和 payable fallback() 均不存在的时候,向合约发送 ETH 将会报错。

    相关文章

      网友评论

        本文标题:Solidity的fallback和receive

        本文链接:https://www.haomeiwen.com/subject/sgnatdtx.html