Ethereum(31) - 緊急停止機能のあるスマートコントラクト①(実装編)

スマートコントラクトは一度デプロイされると修正ができないため、バグや脆弱性が見つかった際には、不具合や攻撃にさらされる状態が永続的に続く危険性があります。

そのため、スマートコントラクトには緊急停止装置のような機能を準備しておくことが望ましいです。

今回は、緊急停止用の関数再開用の関数をもつスマートコントラクトを作成します。

実装

緊急停止用の関数再開用の関数をもつスマートコントラクトのサンプルコードは下記のようになります。

[ソースコード]

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
pragma solidity ^0.4.11;
contract CircuitBreaker {
bool public stopped; // trueの場合、Circuit Breakerが発動中
address public owner;
bytes16 public message;

/// アクセス制限用modifier
modifier onlyOwner() {
require(msg.sender == owner);
_;
}

/// stopped変数を確認するmodifier
modifier isStopped() {
require(!stopped);
_;
}

/// コンストラクタ
function CircuitBreaker() {
owner = msg.sender;
stopped = false;
}

/// stoppedの状態を変更
function toggleCircuit(bool _stopped) public onlyOwner {
stopped = _stopped;
}

/// messageを更新する関数
/// stopped変数がtrueの場合は更新不可
function setMessage(bytes16 _message) public isStopped {
message = _message;
}
}

上記コントラクトのポイントは次の通りです。

  • toggleCircuit関数 (26-28行目)
    コントラクトを緊急停止・再開させる関数です。
    引数にtrueを指定した場合は停止状態になり、falseを指定した場合はコントラクトが有効(再開)状態になります。
  • isStopped modifier (14-17行目)
    停止状態の場合は処理が中断されるようになるmodifierです。
    今回のサンプルでは、setMessage関数(32行目)にisStopped modifierが付与されているので、停止状態の場合messeageを変更することができなくなります。

次回は、このコントラクトの動作確認を行います。