作用
函式修改器(function modifiers)可以方便的控制函式的邏輯,比如可以在某個行為執行前檢查某個前置條件,函式修改器還支援繼承和重寫。定義格式:
應用例項1:修改合約所有者在函式修改器**塊內,判斷條件不符合就丟擲異常,符合則執行佔位符_處**,_代指的是使用函式修改器的函式體。modifier onlyowner
函式修改器允許return;(中斷當前流程)。但不允許明確的return值。
**:應用例項2:編寫乙份合約,實現剩餘電量soc交易pragma solidity ^0.4.0;
contract ownable
/// 改變合約的所有者 【注意這裡的格式,先是修改器的名字,才是大括號】
//修改器檢查呼叫這個函式的是否合約的所有者
function changeowner(address _newowner)
onlyowner
}
測試操作: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 傳入不同的值,覆蓋你的數字,但是這個數字仍會被...