メインコンテンツまでスキップ

Modifier

Modifierについて学習します

modifierとは関数に対して前処理や後処理を追加するための特殊な関数です

関数の修飾子に付与することで関数の呼び出しと共に実行されます

宣言

modifier identifier(parameter-list) {
// do something before calling target function

// calling target function
_;

// do something after calling target function
}

という形で宣言できる

オーバーライドはできるがオーバーロードはできない

呼び出し

関数の修飾子にmodifierをつけることで呼び出される

複数付与することが可能

modifierに引数がない場合はidentifierのみの記述でよく、ある場合は修飾子に引数を渡す必要がある

contract ModifierSample {
uint count;

modifier checkCount() {
require(count < 100);
_;
}

modifier checkNum(uint num) {
require(num < 5);
_;
}

function addCount(uint num) checkCount chekNum(num) {
count += num;
}
}

頻出のmodifier

コントラクト実装に際して頻出のmodifierを紹介する

onlyOwner

コントラクトのオーナーのみが呼び出せる関数を用意する場合に用いる

contract OnlyOwner {
address owner;

modifier onlyOwner() {
require(owner == msg.sender);
_;
}

function withdrawFee() onlyOwner {
// withdraw fee money
}
}

nonReentrant

関数が再帰的に呼び出されることを防ぐ場合に用いる

再帰的に呼び出されることを防ぐ必要性については以下を参照 https://docs.soliditylang.org/en/latest/security-considerations.html#reentrancy

contract NonReentrant {
bool locked;

modifier nonReentrant {
require(locked == false);
locked = true;
_;
locked = false;
}

function someFunction nonReentrant {
// This will be reverted;
someFunction();
}
}

Reference