【開發智能合約 — Solidity系列】實作篇Ep.8 - 與交易有關的功能(Fallback & Receive)
Solidity支援兩種特殊的函數,分別是Fallback以及Receive,一個是處理合約中不存在的功能時進行的回退機制,而另一個Receive則是負責收款後的動作,但兩者稱為特殊函數的原因主要是跟我們一般函數不同的地方於它們是屬於匿名的函數,也就是不用給定Function名稱,因此才會較為特殊,至於詳細用途我們以下再逐一介紹。
Fallback
主要處理合約中不存在的函數調用,可以用來掌握誰調用了不存在的功能,例如: 訊息警告,
那些條件會觸發Fallback?
- msg.data有資料時。
- 呼叫合約中不存在的function時。
具有哪些限制?
- 由於Fallback可能是無意間被呼叫的,因此盡量在Fallback中減少額外的處理,避免燃料費的浪費,應盡量是少於2300 Gas ⛽。
- function名稱直接以fallback命名。
- 僅能將可視範圍設定為external。
哪些行為會導致Fallback消耗大量的Gas fee ⛽,請參考「receive-ether-function」。
範例:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7.0; contract Example { // 定義事件並接收msg參數 event Log(string msg); fallback() external { // 當觸發fallback()時,撰寫fallback的訊息 emit Log("fallback"); } }
實際操作Remix來Demo fallback()的過程
我們在Transact那邊貼上帳號的地址,讓calldata有值,預期觸發Fallback,送出之後,由於沒有指定任何function,因此會觸發fallback機制,並發送Log訊息。
Receive
receive僅負責處理接收ETH,一個合約最多只能有一個receive函數。
什麼條件下會觸發Receive?
- msg.data為空時。
- 發送ether時。
具有哪些限制?
- 一樣會消耗Gas fee,因此不建議邏輯處理太過於複雜,應盡量是少於2300 Gas ⛽。
- function名稱直接以receive命名。
- 僅能將可視範圍設定為external。
哪些行為會導致Fallback消耗大量的Gas fee ⛽,請參考「receive-ether-function」。
範例:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7.0; contract Example { // 定義事件並接收msg參數 event Log(string msg); receive() external payable { // 當觸發receive()時,撰寫receive的訊息 emit Log("receive"); } }
實際操作Remix來Demo receive()的過程
設定金額數量 → Deploy合約 → calldata未帶資料 → 按下交易 → 觸發receive。
圖片來源
結語
透過實際範例,我們學習到收款的事件處理,以及不在合約內的功能處理,雖然很好的掌握了觸發事件後的處理機制,但也要小心這些事後處理機制要控制運算的資源,避免燃料費的浪費。
今天的範例都在這裡「📦 solidity-remix-toturial/Ep8」歡迎自行取用。
喜歡撰寫文章的你,不妨來了解一下:
Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入?
歡迎加入一起練習寫作,賺取知識,累積財富!
資源參考
- https://docs.soliditylang.org/en/v0.8.17/contracts.html?highlight=fallback#fallback-function
- https://docs.soliditylang.org/en/v0.8.17/contracts.html?highlight=fallback#receive-ether-function