智能合約開發實戰(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
留言分享你的想法!
avatar-img
宅D嘉的開發人生
20會員
45內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
宅D嘉的開發人生的其他內容
2025/03/28
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
2025/03/28
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
2025/03/22
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Thumbnail
2025/03/22
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Thumbnail
2025/03/21
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS
Thumbnail
2025/03/21
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS
Thumbnail
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
銀行貸款還清是件相當令人高興的事情,但提醒你也不要忘記申請清償證明喔!清償證明是什麼?沒有清償證明的話可能會有哪些問題呢?來跟Zoe一起了解清償證明的大小事吧!
Thumbnail
銀行貸款還清是件相當令人高興的事情,但提醒你也不要忘記申請清償證明喔!清償證明是什麼?沒有清償證明的話可能會有哪些問題呢?來跟Zoe一起了解清償證明的大小事吧!
Thumbnail
看契約時要注意什麼/企業法務如何在契約中動手腳/付錢才是老大其實才是正確的/契約公平原則只是拿來唬人
Thumbnail
看契約時要注意什麼/企業法務如何在契約中動手腳/付錢才是老大其實才是正確的/契約公平原則只是拿來唬人
Thumbnail
生意往來、親朋好友之間難免金錢借貸,借據該怎麼寫才合法、有效?哪些地雷務必注意才不會讓對方反臉不認帳,紅筆重點本文一次告訴您!
Thumbnail
生意往來、親朋好友之間難免金錢借貸,借據該怎麼寫才合法、有效?哪些地雷務必注意才不會讓對方反臉不認帳,紅筆重點本文一次告訴您!
Thumbnail
筆者遇到太多太多類似的個案了,臺灣是個有人情味的社會,但遇到金錢的往來,還是要放點心思,別因為對方是麻吉麻或是親戚就不做任何書面契約把錢借出去;否則吃虧的還是自己。 原因無他,借據是最能證明雙方有借貸關係的證據。 ◎借據要怎麼寫,也是一門學問: ◎常見的擔保有:
Thumbnail
筆者遇到太多太多類似的個案了,臺灣是個有人情味的社會,但遇到金錢的往來,還是要放點心思,別因為對方是麻吉麻或是親戚就不做任何書面契約把錢借出去;否則吃虧的還是自己。 原因無他,借據是最能證明雙方有借貸關係的證據。 ◎借據要怎麼寫,也是一門學問: ◎常見的擔保有:
Thumbnail
作為債編各論26個有名契約,買賣既然排在第一個,相當程度上也可以理解其本身有多重要,也因此須要花費諸多篇幅來說明。而買賣結束後,接著是大家可能很少聽過,甚至第一次聽到的互易以及交互計算。雖然只有8個條文,國家考試基本上也不會從這裡出題,但寫這文章的目的並不是為了國家考試,也因此不管是冷門還是熱
Thumbnail
作為債編各論26個有名契約,買賣既然排在第一個,相當程度上也可以理解其本身有多重要,也因此須要花費諸多篇幅來說明。而買賣結束後,接著是大家可能很少聽過,甚至第一次聽到的互易以及交互計算。雖然只有8個條文,國家考試基本上也不會從這裡出題,但寫這文章的目的並不是為了國家考試,也因此不管是冷門還是熱
Thumbnail
 清償證明塗銷完整解析-清償工作天、流程一次告訴您 債務清償證明是什麼? 不論是還清貸款或是轉貸,當我們像某家還清一筆抵押貸款時,結清後的大約3~5個工作天,銀行會通知我們領取的文件,正式名稱叫做「抵押權塗銷同意書」,也有的名稱就叫做「債務清償證明」 這一張同意書上,會寫明因為已經還清貸款,同意某某
Thumbnail
 清償證明塗銷完整解析-清償工作天、流程一次告訴您 債務清償證明是什麼? 不論是還清貸款或是轉貸,當我們像某家還清一筆抵押貸款時,結清後的大約3~5個工作天,銀行會通知我們領取的文件,正式名稱叫做「抵押權塗銷同意書」,也有的名稱就叫做「債務清償證明」 這一張同意書上,會寫明因為已經還清貸款,同意某某
Thumbnail
如果您遇上了與消費借貸有關的任何問題,都可以用網站內所附的電話聯絡我們,讓我們了解您的狀況後再為您安排預約諮詢,好讓專門處理這方面問題的律師來解決您的煩惱。
Thumbnail
如果您遇上了與消費借貸有關的任何問題,都可以用網站內所附的電話聯絡我們,讓我們了解您的狀況後再為您安排預約諮詢,好讓專門處理這方面問題的律師來解決您的煩惱。
Thumbnail
一個有效成立的契約,依照民法第153條規定,至少「必要之點」必須達成合致。不同的契約,「必要之點」會略有不同,但基本上一定要有幾個要素:契約當事人、標的(涉及到金錢的契約還會有「價金」)。民法第199條至第218條之1也就是針對債之標的為規定,今天我們就針對債之標的來說明。
Thumbnail
一個有效成立的契約,依照民法第153條規定,至少「必要之點」必須達成合致。不同的契約,「必要之點」會略有不同,但基本上一定要有幾個要素:契約當事人、標的(涉及到金錢的契約還會有「價金」)。民法第199條至第218條之1也就是針對債之標的為規定,今天我們就針對債之標的來說明。
Thumbnail
資料建檔完成後,在網路申報期間,就可以進行網路申報上傳作業; 操作部分,一樣在新手上路中操作,選擇A7.網路申報資料傳送(含審核處理)
Thumbnail
資料建檔完成後,在網路申報期間,就可以進行網路申報上傳作業; 操作部分,一樣在新手上路中操作,選擇A7.網路申報資料傳送(含審核處理)
Thumbnail
使用借貸是日常生活中比較常見的借貸契約,經常在我們沒自覺的狀況下就發生了。有些貸與人可能會在拿回物品的時候才發現物品有損壞,但借用人可能會主張這是物品自然的折舊磨損,不能這樣就向自己索取賠償,許多糾紛就因此而產生。
Thumbnail
使用借貸是日常生活中比較常見的借貸契約,經常在我們沒自覺的狀況下就發生了。有些貸與人可能會在拿回物品的時候才發現物品有損壞,但借用人可能會主張這是物品自然的折舊磨損,不能這樣就向自己索取賠償,許多糾紛就因此而產生。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News