這篇來介紹一個還蠻實用又好用的東西,modifier 函數修改器或叫函數檢查器也可以,為什麼說它超好用呢?因為在寫程式的function時,前面很容易需要放一些檢查或是做一些修改,而這些檢查或修改很容易在其他的函數也需要用到,也就是需要"共用",modifier就是用在這個上的,它可以寫一個共用的檢查或是修改給function去繼承它就可以了,下面我們就來看看它該怎麼用:
在智能合約的函數裡面,最常用的就是檢查使用者是不是合約的Owner:
//存款
function deposit() {
//檢查是否為Owner
require(owner == msg.sender, "Not Owner");
}
//提款
function withdraw() {
//檢查是否為Owner
require(owner == msg.sender, "Not Owner");
}
這樣寫的話,每個需要檢查是否為Owner的函數就必須都要這樣寫入,為了程式碼的簡潔和提高重覆利用,我們來使用modifier看看:
modifier isOwner() {
//檢查是否為Owner
require(owner == msg.sender, "Not Owner");
_;
}
//存款
function deposit() isOwner {
}
//提款
function withdraw() isOwner {
}
建立modifier isOwner,然後在需要的function後面繼承isOwner就可以了,程式會先去執行isOwner,通過之後會跳到"_"的位置,再來才是回到引用的function內執行,這樣就達到共用函數的目的了。
上面我們是看到了檢查的部份,那為什麼叫修改器呢?下面讓我們來看看:
uint i = 0;
//檢查存款是否足夠
modifier checkWithdraw(uint number) {
require(number >= i, "Insufficient deposit");
_;
}
modifier Deposit_Num(uint number) {
i += number;//存款
_;
}
modifier Withdraw_Num(uint number) {
i -= number;//提領
_;
}
//存款
function deposit(uint num) isOwner public Deposit_Num(num) returns(uint) {
return i;
}
//提款
function withdraw(uint num) isOwner public checkWithdraw(num) Withdraw_Num(num) returns(uint) {
return i;
}
//取得目前存款
function getValue() public view returns(uint) {
return i;
}
新增了兩個modifier,用來做存款和提款,裡面是寫存了多少和提了多少,提款多了一個modifier "checkWithdraw",用來檢查金額是否足夠,放在左邊的checkWithdraw會先進去,沒問題才會進到Withdraw_Num去提領金額。
可以在函數前做檢查和修改,另外一點需要注意,modifier有執行順序的,也就是當檢查通過時,會來到"_"的位置,當"_"後面還有修改時,會先回到原函數執行完後,又會回到modifier把未完成的部份執行完,我們用下面的程式碼說明:
uint i = 0;
//加存款
modifier Deposit_Num(uint number) {
i += number;
_;
i = 100;
}
//存款
function deposit(uint num) public Deposit_Num(num) returns(uint) {
i = 10;
return i;
}
上面這個程式碼執行完,你們覺得"i"會變為多少?答案是"100",為什麼是100呢?因為i會先 + number => "_"(回到原deposit) i=10 => return i => 回到 Deposit_Num => i=100,下面上圖說明比較快:
由上面程式碼可以看出,modifier的"_"是會回到原function,但如果"_"後面還有程式碼的話,會等原function執行完後再跳回來執行剩下的程式碼部份,而不是像一般的function一樣遇到return就跳走了,不會執行下方的部份,這點要特別注意的,好了,以上就是對於modifier的介紹,謝謝。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享。
如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。