Solidity v0.6版本fallback与receive函数作用及使用场景咨询
核心概念区分:receive 与 fallback 函数
Solidity 0.6版本之后把原有的fallback函数拆分为两个独立的匿名函数,触发规则完全不同:
receive() external payable是专门为接收ETH设计的入口,仅当合约收到无任何附带调用数据的纯ETH转账时才会触发,该函数必须标记payable才能正常接收ETHfallback() external [payable]是兜底触发函数,满足以下任意一种情况就会被调用:- 用户调用的函数不存在于当前合约中
- 合约收到带调用数据的ETH转账,且未定义
receive函数、或receive函数不满足接收条件
结合提供的合约的实际使用场景
你给出的合约中两个匿名函数的作用对应场景如下:
receive() external payable中调用了buyToken():当有用户直接向合约地址发起纯ETH转账(比如从个人钱包直接转ETH到合约地址,没有选择调用任何合约方法)时,会自动触发该函数,执行买币逻辑:给转账用户的余额加1,把用户转的ETH转到预设的收款钱包地址,同时触发购买事件。- 空实现的
fallback() external payable:作为兜底逻辑,如果有人调用了合约不存在的方法,或者转ETH的时候附带了其他调用数据,交易不会直接回滚,合约会收下ETH,但不会执行买币逻辑。
关于「可直接调用
buyToken()绕过receive」的疑问 receive的设计目的从来不是限制用户调用buyToken(),而是为了覆盖普通ETH转账的场景:
- 直接调用
buyToken()是给知道合约接口的用户预留的主动买币入口,本身就是合法的使用方式 - 很多场景下用户不会主动调用合约方法,比如从交易所直接提ETH到合约地址、或者普通用户不知道合约有
buyToken接口只知道转ETH买币,这些场景下的纯ETH转账就会自动走receive逻辑完成买币,不会因为用户没有调用buyToken就导致买币失败。如果没有定义receive,这类纯ETH转账要么直接回滚,要么走fallback逻辑,用户转了ETH也拿不到Token。
内容的提问来源于stack exchange,提问作者Roman Karpyshyn
相关产品推荐
相关产品推荐

