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();
}
}