智能合約開發實戰(13) - modifier

智能合約開發實戰(13) - modifier

更新於 發佈於 閱讀時間約 6 分鐘

這篇來介紹一個還蠻實用又好用的東西,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去提領金額。

raw-image

可以在函數前做檢查和修改,另外一點需要注意,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,下面上圖說明比較快:

raw-image

由上面程式碼可以看出,modifier的"_"是會回到原function,但如果"_"後面還有程式碼的話,會等原function執行完後再跳回來執行剩下的程式碼部份,而不是像一般的function一樣遇到return就跳走了,不會執行下方的部份,這點要特別注意的,好了,以上就是對於modifier的介紹,謝謝。

有什麼想要了解或是不清楚的部份,歡迎留言和我分享。
如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。

avatar-img
宅D嘉的沙龍
20會員
41內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
留言
avatar-img
留言分享你的想法!
宅D嘉的沙龍 的其他內容
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS