在Solidity中,fallback
和receive
是特殊的函數,用於處理合約接收以太幣的情況。
-
Fallback 函數 (
fallback()
):- 當合約接收到以太幣時,如果沒有匹配的函數調用或無效的調用,就會觸發回退函數。
- 回退函數是合約的默認函數,沒有函數名,且不接受任何參數。
- 回退函數通常用於接收以太幣、記錄日誌或執行其他必要的操作。
- 如果合約沒有定義回退函數,或者沒有匹配的函數調用,發送以太幣的交易將被拒絕。
-
Receive 函數 (
receive()
):- Solidity 0.6.0 版本引入了
receive
函數作爲接收以太幣的標準函數。 receive
函數是一個可選函數,用於接收以太幣支付,沒有函數名,且不接受任何參數。- 如果合約定義了
receive
函數,它將作爲接收以太幣的入口點,而不是回退函數。 - 只有在合約沒有匹配的函數調用時,纔會觸發
receive
函數。 - 如果合約沒有定義
receive
函數,則會觸發回退函數,如果也沒有回退函數,則交易將被拒絕。
- Solidity 0.6.0 版本引入了
這些特殊函數的使用場景如下:
- 使用回退函數和接收函數時,合約可以接收以太幣支付,並在這些函數內部處理相關邏輯,如更新合約狀態、觸發事件或與其他合約進行交互。
- 回退函數通常用於處理未知函數調用或在沒有匹配函數時接收以太幣。
- 接收函數用於規範化合約接收以太幣的方式,並提供一個入口點來處理以太幣支付。
需要注意的是:
- 在同一個合約中,只能有一個回退函數,但可以有多個接收函數(每個合約只能有一個
receive
函數)。 - 接收函數和回退函數不能接受任何參數。
- 在 Solidity 0.8.0 版本之前,沒有
receive
函數,以太幣支付仍然通過回退函數處理。
總而言之,fallback
和receive
函數是用於接收以太幣支付的特殊函數,使合約能夠處理接收以太幣時的邏輯,並提供一個標準化的入口點來接收以太幣。
寫一個測試合約:
contract FallbackLogContract {
event Basiya(string funName, address from, uint256 value, bytes data);
// 通過balance屬性來查看餘額
function getBalance() external view returns (uint256) {
return address(this).balance;
}
fallback() external payable {
emit Basiya("fallback", msg.sender, msg.value, msg.data);
}
receive() external payable {
emit Basiya("receive", msg.sender, msg.value, "");
}
}
這裏定義了recevie和fallbak函數
如果只有fallback函數也能接受以太幣,但是會有警告提示需要加上receive,所以其實統一採用receive來接受以太幣就好了
如果只有recevie函數,沒有fallback函數,是可以的。
轉賬試試:
總結,recevie/fallback可以接收通過CALLDATA方式的轉賬