Solidityでmodifier修飾子を使う方法【初心者向け】
初心者向けにEthereum上でコントラクト開発に使われる言語Solidityのmodifier修飾子を使う方法について詳しく解説しています。実際に実行するサンプルプログラムを書いているのえ、ぜひ理解しておきましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
今回は、Solidityでmodifierを使う方法について解説します。
基本構文を説明し、サンプルプログラムを実際に書いているので、ぜひ参考にしてみてください。ブロックチェーン技術を使った開発に役立つはずです。
今回はSolidityでmodifier修飾子を使ってみよう。
田島メンター!modifier修飾子というのは何ですか~?
修飾された関数を実行する前に、指定の処理を実行させることができるものなんだ。基本の書き方を説明しよう。
はい!
Solidityのmodifierとは
modifierとは、Solidityで使用する修飾子です。
modifier修飾子を関数につけると、修飾された関数を実行する前に、modifierの処理を予め実行させることができます。
Solidityとは、Ethereumでコントラクトコードを実装する際に利用するプログラミング言語の名称です。
コントラクトコードとは、Ethereum等のブロックチェーン上で、スマートコントラクトを実行するために必要なコードです。
ブロックチェーンとは、仮想通貨等の取引データを分散して管理する仕組みのことです。
ブロックチェーン単体では、仮想通貨の取引や、取引履歴の確認を行うことができます。
スマートコントラクトの機能を実装するには、Solidityというコントラクト指向言語を使用します。
Solidityでmodifier修飾子を利用することで、スマートコントラクト上で関数が実行される毎にアクセス制限をかけることもできます。
modifierの書き方
modifierの基本構文
modifier modifier名称{ modifierの処理部分; _; }
解説
1行目のmodifierでは、Solidityのmodifierを利用することを宣言します。modifierの名称という部分で、実装するmodifierの名称を定義します。{を記載することで、modifierの処理部分を開始したことを定義します。
2行目のmodifierの処理部分では、実際に処理する内容を記載します。処理の最後には;を記載することで、1つの処理が終了したことを表します。
3行目の _; では、処理部分全体が終了したことを意味します。この _; は必ず必要です。
4行目の } では、1行目のmodifier処理定義が終了したことを意味します。
modifier修飾子の説明と基本形だね。
{}の中に、実行したい処理を記述するんですね。
次は実際の例で見てみよう。今回は公式で公開されているサンプルを見ながら確認していくよ。
modifierを実際に書いてみよう
公式ページのサンプルを解説します。
関数実行前にonlyOwnerを実行
pragma solidity ^0.4.11; contract owned { function owned() public { owner = msg.sender; } address owner; modifier onlyOwner { require(msg.sender == owner); _; } } contract mortal is owned { function close() public onlyOwner { selfdestruct(owner); } }
解説
1行目のpragma solidity ^0.4.11では、solidityプログラムを宣言しています。
2行目のcontract owndでは、owndのcontract作成を意味しています。
3行目のfunction owned( ) public { owner = msg.sender; }では、owned関数を定義しています。
4行目のaddress owner;では、ownerという名前の変数をaddress型でアドレスを扱うために宣言します。
5行目のmodifier onlyOwner {では、onlyOwnerという名称のmodifierを宣言します。
6行目のrequire(msg.sender == owner);では、msg.senderがownerであるかどうかを判断しています。
7行目の_;では、modifier処理の内容を実装します。
8行目の}では、3行目から始まるmodifer処理の終了を意味します。
9行目の}では、2行目の処理の終了を意味します。
10行目のcontract mortal is owned {では、ownedコントラクトを継承して宣言しています。継承とは、継承元の機能や内容を再利用する技術です。ここではownedが継承元です。継承にはisを使います。
11行目のfunction close( ) public onlyOwner {では、close( )関数を宣言しています。publicはアクセス修飾子です。アクセス修飾子では、アクセスすることができる場所を制限することができます。publicで指定された場合は、指定した場所(内部)からも、指定していない場所(外部)からもアクセス可能です。
onlyOwnerはステート変数です。ステート変数名とは、オブジェクト指向言語で言うインスタンス変数のようなものです。
12行目のselfdestruct(owner);では、コントラクトを消滅させる処理をしています。
13行目の}では、11行目の処理を終了しています。
14行目の}では、10行目の処理を終了しています。
以上、Solidityでmodifier修飾子を使う方法について解説しました。
modifier修飾子の実例について解説したよ。
ここではonlyOwnerというmodifier修飾子を定義して、それをclose関数の前に実行しているわけですね。
そしてその内容は、msg.senderがownerかどうかというものだったね。このようにmodifier修飾子によって条件を付けたりすることができるので活用してみよう。
分かりました。ありがとうございます!
この記事を監修してくれた方
中本賢吾(なかもとけんご) 開発実績:PHPフレームワークを利用した会員制SNS・ネットショップ構築、AWSや専用サーバー下でLinuxを使用したセキュアな環境構築、人工知能を利用したシステム開発、店舗検索スマホアプリ開発など。 その他にも地域の職業プログラマー育成活動を行い、2018年には小学生がUnityで開発したオリジナルAndroidアプリをGooglePlayでリリース。ゲームで遊ぶより作ろうぜ!を合言葉に、小学生でも起業できる技術力を育成可能で有ることを証明し続けている。 |