Solidityでmodifier修飾子を使う方法【初心者向け】

初心者向けにEthereum上でコントラクト開発に使われる言語Solidityのmodifier修飾子を使う方法について詳しく解説しています。実際に実行するサンプルプログラムを書いているのえ、ぜひ理解しておきましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

今回は、Solidityでmodifierを使う方法について解説します。

基本構文を説明し、サンプルプログラムを実際に書いているので、ぜひ参考にしてみてください。ブロックチェーン技術を使った開発に役立つはずです。

 

なお本記事は、TechAcademyのブロックチェーンオンライン講座の内容をもとに作成しています。

 

田島悠介

今回は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修飾子の説明と基本形だね。

大石ゆかり

{}の中に、実行したい処理を記述するんですね。

田島悠介

次は実際の例で見てみよう。今回は公式で公開されているサンプルを見ながら確認していくよ。

[PR]ブロックチェーンで挫折しない学習方法を動画で公開中

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修飾子によって条件を付けたりすることができるので活用してみよう。

大石ゆかり

分かりました。ありがとうございます!

また、オンラインのプログラミングスクールTechAcademyでは、ブロックチェーンオンライン講座を開催しています。

ブロックチェーン技術の仕組みを理解し、実際に分散型アプリケーションを開発することができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

この記事を監修してくれた方

中本賢吾(なかもとけんご)
アジマッチ有限会社 代表取締役社長

開発実績:PHPフレームワークを利用した会員制SNS・ネットショップ構築、AWSや専用サーバー下でLinuxを使用したセキュアな環境構築、人工知能を利用したシステム開発、店舗検索スマホアプリ開発など。

その他にも地域の職業プログラマー育成活動を行い、2018年には小学生がUnityで開発したオリジナルAndroidアプリをGooglePlayでリリース。ゲームで遊ぶより作ろうぜ!を合言葉に、小学生でも起業できる技術力を育成可能で有ることを証明し続けている。