Ethereum(27) - アクセスを制限するスマートコントラクト①(実装編)

今回は、アクセス制限を行うスマートコントラクトを実装します。

アクセス制限の例としては、コントラクトを生成したアドレスからのみ 実行を許可するというケースが挙げられます。

この場合、トランザクション発行アドレスがコントラクトのオーナーのアドレスと一致することを確認する必要があります。

実装

アクセス制限をする場合、modifierを利用すると関数ごとにアクセス制限を実装する必要がなくなり、コードがシンプルになります。

次のような2つのコントラクトを作成します。

  • Ownedコントラクト
    親コントラクトです。
    アクセス制御に関する関数とmodifierを定義しています。
  • AccessRestrictionコントラクト
    子コンストラクトです。
    Ownedコントラクトを継承しています。
    文字列のステートを1つ持ち、オーナーだけがそのステートを変更することができます。

[ソースコード]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
pragma solidity ^0.4.11;
contract Owned {
address public owner;

/// アクセスチェック用のmodifier
modifier onlyOwner() {
require(msg.sender == owner);
_;
}

/// オーナーを設定
function owned() internal {
owner = msg.sender;
}

/// オーナーを変更
function changeOwner(address _newOwner) public onlyOwner {
owner = _newOwner;
}
}

// 継承
contract AccessRestriction is Owned{
string public state;

/// コンストラクタ
function AccessRestriction() {
// Ownedで定義されているowned関数をコール
owned();

// stateの初期値を設定
state = "initial";
}

/// stateを更新する関数
function updateState(string _newState) public onlyOwner {
state = _newState;
}
}

アクセス制限に関する処理は以下の通りです。

  • modifier onlnOwner (6-9行目)
    アクセス制限用のmodifierで、アクセス制限をしたい関数に付与します。
  • owned (12-14行目)
    オーナーを指定するための関数です。
    子コンストラクトから呼ばれることを想定しているためinternalとしています。
  • changeOwner (17-19行目)
    オーナーを変更する場合に利用する関数です。
    現オーナーからの呼び出しのみ許可します。

次回は、このアクセス制限のあるコントラクトの動作確認を行います。