36-Solidity8.0-回退函数 fallback()和 receive()

542 阅读1分钟

fallback() or receive()?

当你调用的函数在合约中不存在,或者直接向合约中发送以太坊主币的时候,都会调用回退函数;

fallback()是一个后备函数,receive 只负责接受主币;

当以太坊主币发送到合约时,首先要判断 msg.data 是否为空

如果不为空就会调用 fallback(),

如果为空,再判断 receive 函数是否存在,如果存在,调用 receive 函数,如果不存在,调用 fallback 函数

msg.data=空?.png

image.png

源码:

pragma solidity ^0.8.7;

contract Fallback{
    event Log(string func, address sender,uint value, bytes data);

    fallback() external payable {
        emit Log("fallback", msg.sender, msg.value, msg.data);
    }

    receive() external payable {
        //receive 不接受数据,把msg.data 写成空字符串
        emit Log("receive", msg.sender, msg.value,"");
    }
    
}