Solidity語言學習筆記————26、回退函式
回退函式(Fallback Function)
一個合約可以有一個匿名函式。此函式不能有引數,不能返回任何值。如果沒有其他函式與給定的函式識別符號匹配,或者如果根本沒有提供資料,將執行一個合約的呼叫。
此外,每當合同接收沒有資料的純Ether時,會執行回退函式。此外,為了接收Ether,回退函式必須標記為payable
。如果沒有這樣的函式,合約不能通過常規transactions接收Ether。
在這種情況下,函式呼叫通常只有2300gas可用,所以使回退函式儘可能便宜是很重要的。注意,呼叫回退函式的事務與內部呼叫相比,所需的gas要高得多,因為每個事務都收取額外的21000gas或更多的用於簽名檢查之類。
以下操作將比回退函式消耗更多的gas:
- 寫入storage
- 建立合約
- 呼叫一個消耗大量gas的外部函式
- 傳送Ether
請徹底測試回退函式,以確保在部署合約之前執行消耗小於2300gas。
註解 |
---|
雖然回退函式不能有引數,仍然可以使用msg.data 來檢索檢索呼叫的任何payload |
警告 |
---|
直接接收Ether的合約(沒有函式呼叫,即使用send 或transfer ),不定義回退函式將丟擲異常並返回Ether(這與Solidity v0.4.0之不同)。因此,如果您希望合約接收Ether,則必須實現回退函式。 |
警告 |
---|
沒有payable 回退函式的合約可以作為一個coinbase transaction的接收者來接收Ether(又名挖礦獎勵)或selfdestruct 的目的地。合約不能對這樣的Ether轉賬作出反應,因此也不能拒絕它們。這是EVM和Solidity的設計選擇。這也意味著,this.balance 可以高於合約中實現的一些手工記賬的總和(即有一個計數器在回退函式中更新)。 |
pragma solidity ^0.4.0;
contract Test {
// This function is called for all messages sent to
// this contract (there is no other function).
// Sending Ether to this contract will cause an exception,
// because the fallback function does not have the `payable`
// modifier.
function() public { x = 1; }
uint x;
}
// This contract keeps all Ether sent to it with no way
// to get it back.
contract Sink {
function() public payable { }
}
contract Caller {
function callTest(Test test) public {
test.call(0xabcdef01); // hash does not exist
// results in test.x becoming == 1.
// The following will not compile, but even
// if someone sends ether to that contract,
// the transaction will fail and reject the
// Ether.
//test.send(2 ether);
}
}
相關文章
- Solidity語言學習筆記————28、純函式Solid筆記函式
- Solidity語言學習筆記————27、檢視函式Solid筆記函式
- Solidity語言學習筆記————18、字串和函式Solid筆記字串函式
- Solidity語言學習筆記————30、函式過載Solid筆記函式
- Solidity語言學習筆記————20、函式修飾符Solid筆記函式
- Solidity語言學習筆記————23、函式呼叫和賦值Solid筆記函式賦值
- Solidity語言學習筆記————26、Assert, Require, Revert 和 ExceptionsSolid筆記UIException
- Solidity語言學習筆記————1、初識Solidity語言Solid筆記
- Solidity語言學習筆記————38、Solidity彙編Solid筆記
- c語言學習筆記===函式C語言筆記函式
- Solidity語言學習筆記————36、 庫Solid筆記
- Solidity語言學習筆記————37、Using forSolid筆記
- Solidity語言學習筆記————4、常量Solid筆記
- Solidity語言學習筆記————33、事件(Events)Solid筆記事件
- Solidity語言學習筆記————12、陣列Solid筆記陣列
- Solidity語言學習筆記————34、繼承Solid筆記繼承
- Solidity語言學習筆記————43、安全考量Solid筆記
- Solidity語言學習筆記————42、提示和技巧Solid筆記
- Solidity語言學習筆記————16、對映MappingSolid筆記APP
- Solidity語言學習筆記————32、建立合約Solid筆記
- Solidity語言學習筆記————21、函式的訪問許可權和可見性Solid筆記函式訪問許可權
- Solidity語言學習筆記————11、隱式轉換和顯式轉換Solid筆記
- 【Go】Go語言學習筆記-2-函式Go筆記函式
- Solidity語言學習筆記————41、記憶體佈局Solid筆記記憶體
- Solidity語言學習筆記————39、獨立彙編Solid筆記
- Solidity語言學習筆記————25、作用域和宣告Solid筆記
- Solidity語言學習筆記————10、布林型、整型Solid筆記
- Solidity語言學習筆記————3、Remix的基本使用Solid筆記REM
- Solidity語言學習筆記————15、結構體StructSolid筆記結構體Struct
- Solidity語言學習筆記————14、左值運算子Solid筆記
- Solidity語言學習筆記————9、左值運算子Solid筆記
- Solidity語言學習筆記————17、原始檔對映Solid筆記
- Solidity語言學習筆記————5、全域性變數Solid筆記變數
- Solidity語言學習筆記————2、使用編譯器Solid筆記編譯
- Solidity語言學習筆記————19、函式可見性定義符、修飾符、保留字和語法Solid筆記函式
- Solidity語言學習筆記————35、抽象合約和介面Solid筆記抽象
- Solidity語言學習筆記————22、可見性和GettersSolid筆記
- Solidity語言學習筆記————24、輸入輸出引數Solid筆記