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

更新於 發佈於 閱讀時間約 1 分鐘
這篇來介紹一個還蠻實用又好用的東西,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的介紹,謝謝。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享。
如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
為什麼會看到廣告
avatar-img
20會員
38內容數
目前加密貨幣的市場上幣種非常的多 讓你看得眼花撩亂了嗎? 可以藉由這一系列的加密貨幣分析 能夠幫忙您了解每一個加密貨幣它的價值所在 每一集都會介紹一種幣 是一個很實用的專題,歡迎大家訂閱~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
宅D嘉的沙龍 的其他內容
這篇我們來講一下還蠻重要也蠻常用到的一個自定義型別,叫:struct struct是來自於C/C++的結構,目的是把不同資料型態的參數串在一起,成為一個自定義的資料型態,我們也稱它是一個自定義的結構體。
此篇我們也來介紹另外一個也是蠻常用又蠻重要的Mapping,它和陣列有點像,但比較不同的是:它不能用迴圈的方式取出裡面所有的資料,但陣列可以,Mapping比較像是一個查詢系統,用key值可以取出裡面的value值。
這篇我們來看一個在程式開發很常見也很常用的一個東西:Array 陣列 Array在所有的程式開發中還蠻常見的,也一定會出現,因為有很多的資料都會是一長串的,需要有一個物件來去做集中管理。
由上篇看起來已經沒問題,我也一直用這樣的方式在上班看著幣價(噓~),後來發現了一點問題,我們看一下圖片: 加入Excel常用的函數:VLOOKUP VLOOKUP(搜尋準則, 範圍, 索引, 已排序)
在寫程式裡面,錯誤的檢查和處理是一定要有的,也是相對重要的,但Solidity裡面並沒有ErrorMessage這種東西,有的是Require()、Revert()、Assert()這三個函數,作用大概也跟ErrorMessage差不多,這裡介紹這三種函數的用法
我們知道function除了四種可見度 (visibility) 之外,還有三種比較常見的函式修飾詞(view、pure、payable),這篇就也來認識一下這三種函式修飾詞是做什麼用的吧。
這篇我們來講一下還蠻重要也蠻常用到的一個自定義型別,叫:struct struct是來自於C/C++的結構,目的是把不同資料型態的參數串在一起,成為一個自定義的資料型態,我們也稱它是一個自定義的結構體。
此篇我們也來介紹另外一個也是蠻常用又蠻重要的Mapping,它和陣列有點像,但比較不同的是:它不能用迴圈的方式取出裡面所有的資料,但陣列可以,Mapping比較像是一個查詢系統,用key值可以取出裡面的value值。
這篇我們來看一個在程式開發很常見也很常用的一個東西:Array 陣列 Array在所有的程式開發中還蠻常見的,也一定會出現,因為有很多的資料都會是一長串的,需要有一個物件來去做集中管理。
由上篇看起來已經沒問題,我也一直用這樣的方式在上班看著幣價(噓~),後來發現了一點問題,我們看一下圖片: 加入Excel常用的函數:VLOOKUP VLOOKUP(搜尋準則, 範圍, 索引, 已排序)
在寫程式裡面,錯誤的檢查和處理是一定要有的,也是相對重要的,但Solidity裡面並沒有ErrorMessage這種東西,有的是Require()、Revert()、Assert()這三個函數,作用大概也跟ErrorMessage差不多,這裡介紹這三種函數的用法
我們知道function除了四種可見度 (visibility) 之外,還有三種比較常見的函式修飾詞(view、pure、payable),這篇就也來認識一下這三種函式修飾詞是做什麼用的吧。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
msg.sender 定義:msg.sender 是 Solidity 中的一個全局變量,表示當前調用合約函數的外部地址。這個地址可以是普通用戶賬戶(EOA)或另一個智能合約。 用途:用於識別誰在調用當前函數。在每次函數調用期間,msg.sender 都會動態地更新為當前調用該函數的賬戶地址。
Thumbnail
支付命令是對於借貸關係有爭議情況下的一種有效法律手段,不過提出支付命令仍須注意相關程序和法律條件。本文介紹支付命令的相關流程和詳細內容,並提供範本供參考。若您有任何法律問題,歡迎免費線上諮詢。
法務日常的工作之一就是審閱合約。 承辦人員最喜歡問的就是現在可以簽約了嗎?
Thumbnail
權限管理=新增、修改、刪除+審核 通常,這種程式的設計會包含權限管理,其中包括現場修改、刪除等三大類功能。然而,根據經驗,我們還需要關注另一類功能,即審核權限。 審核不執行新增 審核權限通常不執行新增的動作,僅限於某些欄位的輸入。新增、修改、刪除這些操作基本上是容易理解的。也就是說,對於這個工
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
這篇文章是關於存款帳戶及疑似不法或異常交易的管理辦法。其中解釋了衍生管制帳戶的定義以及設置目的。同時提到當客戶被其他金融機構列為警示帳戶時,名下所有銀行帳戶將被列為衍生管制帳戶,並且會受到限制措斷。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
msg.sender 定義:msg.sender 是 Solidity 中的一個全局變量,表示當前調用合約函數的外部地址。這個地址可以是普通用戶賬戶(EOA)或另一個智能合約。 用途:用於識別誰在調用當前函數。在每次函數調用期間,msg.sender 都會動態地更新為當前調用該函數的賬戶地址。
Thumbnail
支付命令是對於借貸關係有爭議情況下的一種有效法律手段,不過提出支付命令仍須注意相關程序和法律條件。本文介紹支付命令的相關流程和詳細內容,並提供範本供參考。若您有任何法律問題,歡迎免費線上諮詢。
法務日常的工作之一就是審閱合約。 承辦人員最喜歡問的就是現在可以簽約了嗎?
Thumbnail
權限管理=新增、修改、刪除+審核 通常,這種程式的設計會包含權限管理,其中包括現場修改、刪除等三大類功能。然而,根據經驗,我們還需要關注另一類功能,即審核權限。 審核不執行新增 審核權限通常不執行新增的動作,僅限於某些欄位的輸入。新增、修改、刪除這些操作基本上是容易理解的。也就是說,對於這個工
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
這篇文章是關於存款帳戶及疑似不法或異常交易的管理辦法。其中解釋了衍生管制帳戶的定義以及設置目的。同時提到當客戶被其他金融機構列為警示帳戶時,名下所有銀行帳戶將被列為衍生管制帳戶,並且會受到限制措斷。