Solidity學習 (16)函式修改器

2021-08-28 23:34:18 字數 2999 閱讀 9255

作用

函式修改器(function modifiers)可以方便的控制函式的邏輯,比如可以在某個行為執行前檢查某個前置條件,函式修改器還支援繼承和重寫。

定義格式:

modifier onlyowner
在函式修改器**塊內,判斷條件不符合就丟擲異常,符合則執行佔位符_處**,_代指的是使用函式修改器的函式體。

函式修改器允許return;(中斷當前流程)。但不允許明確的return值。

應用例項1:修改合約所有者

**:

pragma solidity ^0.4.0;

contract ownable

/// 改變合約的所有者 【注意這裡的格式,先是修改器的名字,才是大括號】

//修改器檢查呼叫這個函式的是否合約的所有者

function changeowner(address _newowner)

onlyowner

}

應用例項2:編寫乙份合約,實現剩餘電量soc交易

pragma solidity ^0.4.0;

contract parameter

//函式修改器,用來檢查soc交易方soc是否足夠

modifier balance_check(uint _balance,uint _transactionamount)

//soc交易函式

function electricity_transact(address _to,uint _elec_amount)

balance_check(soc[msg.sender],_elec_amount)

}

測試操作:

(1)編譯、部署合約【部署合約的賬戶下的在該合約下的soc會初始化為100】

(2)在electricity_transact函式中,填入其他賬戶位址和交易的數額

1、先填乙個大於100的

嘗試交易------------------->丟擲異常了

2、再用小於100的交易額

嘗試交易------------------>交易成功

再看看對應賬戶下的soc

如果函式有返回值,且函式修改器丟擲異常,那麼將返回對應型別的預設值

測試**:

pragma solidity ^0.4.0;

contract return

//返回預設值

function uintreturn() a returns(uint)

//返回預設值

function stringreturn() a returns(string)

}

上例中,我們寫了乙個特殊的函式修改器a,永遠判斷不成功。故uintreturn(),stringreturn()中的**都將不會執行。上述函式將分別返回uint,string的預設值0和空串。

如果函式修改器 " _; "  後面還有可執行**,那麼在對應函式體return或執行完之後,會繼續在函式修改器中往下執行 

測試**:

pragma solidity ^0.4.0;

contract processflow

} }

}

乙個函式可使用多個函式修改器,定義時依次填寫,並用空格隔開。函式修改器執行時,將按定義順序依次執行。

測試**:

pragma solidity ^0.4.0;

contract multimodifier

modifier instate(bool state)

//多個函式修改器

function f(bool state) onlyowner instate(state) returns(uint)

}

可以重寫父類的函式修改器。來改變父類的修改器行為。

測試**:

pragma solidity ^0.4.0;

contract bank

}contract modifieroverride is bank

function f(uint withdraw) transferlimit(withdraw) returns(uint)

}

參考文章:

solidity學習筆記

1 狀態變數是放在區塊鏈上 2 view修飾的函式,讀取和訪問狀態變數,表示訪問狀態變數 區塊鏈上的資料 但是不會修改,僅限於訪問,不消耗資源 3 pure修飾的函式,不修飾也不讀取狀態變數 區塊鏈上的資料 不會消耗任何資源 4 不用view,pure等修飾的函式,會修改區塊鏈上的資料,會消耗資源 ...

Solidity學習筆記(3)

在此後的學習,將更加深入理解solidity的方方面面 solidity原始檔的布局 引入其他的原始檔 注釋合約的結構 型別變數型別 列舉 參考型別對映 包括左賦值的操作符 在基本型別間的轉換 型別匯出 單元區域性和全域性可見變數 ether單元 time單元 特殊變數和函式 表示式和控制結構 控制...

以太坊 Solidity學習

函式set和get可以用來變更或取出變數的值。該合約能完成的事情並不多 由於以太坊構建的基礎架構的原因 它能允許任何人在合約中儲存乙個單獨的數字,並且這個數字可以被世界上任何人訪問,且沒有可行的辦法阻止你發布這個數字。當然,任何人都可以再次呼叫 set 傳入不同的值,覆蓋你的數字,但是這個數字仍會被...