很多刚学 Solidity 的朋友,会把 fallback 和 receive 函数搞混 —— 俩都是合约的 “默认处理函数”,都能接收 ETH,到底有啥不一样?啥时候该写 fallback,啥时候用 receive?今天用大白话拆解开讲,看完你就再也不迷糊了。
核心区别:触发条件天差地别
要分清 fallback 和 receive,关键看两个维度:
1. 是否给合约转 ETH;
2. 是否携带函数调用数据(比如调用某个函数时,会传函数名、参数等数据,单纯转 ETH 没有这些数据)。
用一张表就能说清触发规则:
| 场景 |
触发哪个函数? |
| 1. 单纯给合约转 ETH(无函数调用数据) |
优先触发 receive;如果合约没写 receive,再触发 fallback(且 fallback 要加 payable) |
| 2. 调用合约里不存在的函数(带数据) |
只触发 fallback(不管有没有 receive,也不管是否转 ETH,只要调用不存在的函数就触发) |
| 3. 调用存在的函数,但函数没加 payable |
既不触发 receive 也不触发 fallback,直接报错(因为函数没法接收 ETH) |
先搞懂基础:俩函数都是干啥的?
首先得明确一个大前提:fallback 和 receive 都是合约里的 “被动触发函数”,不用你主动调用(比如写合约地址.fallback()),而是当满足特定条件时,合约会自动执行它们。而且俩函数都有个硬性要求 —— 要接收 ETH,必须加payable修饰符,不然钱根本转不进来。
先看两个最简单的例子,感受下区别:
- receive 函数:只干一件事 —— 接收 ETH,代码长这样:
receive() external payable {
// 这里可以写简单逻辑,比如记录收款金额
totalReceived += msg.value;
}
- fallback 函数:能干两件事 —— 接收 ETH、处理 “调用不存在的函数”,代码长这样:
fallback() external payable {
// 既可

最低0.47元/天 解锁文章
1691

被折叠的 条评论
为什么被折叠?



