Solidityのコードで必ず見かける“onlyOwner”について解説します。
onlyOwnerとは?
onlyOwnerとは、「そのコントラクト所有者のみが呼び出し可能にする修飾子」のことです。
関数にonlyOwnerを修飾することで、その関数は、そのコントラクトのオーナーしか呼べ出せないよう制限を掛けることができます。(※修飾子については以下の関連記事をご覧ください)
onlyOwnerの中身
onlyOwnerは関数の修飾に使用するため、事前に定義しておく必要があります。
ほとんどの場合、以下のような実装になるかと思います。(逆にいうとonlyOwnerの中身がメチャクチャだとonlyOwner自体の処理も変わってしまいますので注意が必要です)
address owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner {
require (msg.sender == owner);
_;
}
onlyOwnerの中身にある“require (msg.sender == owner)”が肝ですね。
呼び出し元がオーナーかどうかチェックし、オーナーではない場合、処理を中断します。
“_;”の意味ですが、「処理を続行する」という意味で、onlyOwnerで修飾した関数の処理がそのまま続けて実行されるようにするために記述しています。(この記述が無いと関数にonlyOwnerを修飾しても、関数の処理が続けて実行されず、onlyOwnerで処理がストップしてしまいます)
一方、onlyOwnerを関数に修飾すると、以下のようになります。
function sayHi() public onlyOwner view returns(string memory) {
return "Hi Owner!";
}
このように関数にonlyOwnerを付けるだけで、onlyOwnerで定義した処理(=そのコントラクト所有者のみが呼び出し可能)を、関数が呼び出される前に実行することができます。
すなわち、上記のsayHi関数は、そのコントラクトのオーナーしか呼び出すことができません。
サンプルコード
最後に、onlyOwnerの定義、関数への修飾も含め、サンプルコード全文を掲載させて頂きます。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Sample {
// onlyOwner修飾子を定義
modifier onlyOwner {
require (msg.sender == owner); // 呼び出し元がオーナーでなければ処理中断
_; // そのまま修飾した関数の処理を続行
}
// 関数にonlyOwner修飾子を修飾(コントラクト所有者しか呼び出せないようにする)
function sayHi() public onlyOwner view returns(string memory) {
return "Hi Owner!";
}
}
onlyOwnerという名前の修飾子が頻繁に登場するため、onlyOwnerに特化して解説しましたが、onlyOwnerはあくまでmodifier修飾子の一つにすぎません。用途に応じてmodifier修飾子を自作することで、このonlyOwnerと同じような使い方ができるため、modifier修飾子についてマスターしておきましょう。