Ethereum(29) - スマートコントラクトが不要になったらきれいに破棄①(実装編)

コントラクトがehterを保持していた場合、不要となったらコントラクトからetherを回収しなければなりません。

そのため、コントラクトを破棄すると同時にownerにetherを送金するようにしておく必要があります。

脆弱性が発見されることに備えて、攻撃者からの不正な引出しをされる前にetherを回収できるようにしておくことはセキュリティ的に必須です。

実装

コントラクトをきれいに破棄するためのサンプルコードは以下の通りです。

[ソースコード]

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
40
41
42
pragma solidity ^0.4.11;
contract Mortal {
address public owner;

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

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

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

/// コントラクトを破棄して、etherをownerに送る
function kill() public onlyOwner {
selfdestruct(owner);
}
}

contract MortalSample is Mortal{
string public state;

/// Fallback関数
function() payable {
}

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

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

ポイントは23行目のselfdestruct関数です。

selfdestruct関数はコントラクトを破棄し、引数のアドレスにコントラクト内のetherを送金します。

不特定のアドレスからコントラクトを破棄されては困るので、onlyOwner(22行目)を付加して、コントラクトのオーナーからのみ実行できるようにアクセス制限をかけています。


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