Ethereum(16) - コントラクト名とアドレスを管理するスマートコントラクト(実装編)

これまではクラウドファンディングを実現するスマートコントラクトを試してきましたが、今回からは別のスマートコントラクトを作成してみます。

コントラクト名とアドレスを管理するスマートコントラクト

コントラクト名とそのアドレスを管理するスマートコントラクトを作成します。

コントラクトを一意で認識するためには、そのアドレスを使わなければなりません。

ただこのアドレスは16進数の長い文字列で認識しにくいため、別名(エイリアス)をつけた方が直感的で管理しやすくなります。


生成したコントラクトを誰かに教える場合、アドレスではなくコントラクトの別名を公開し、今回作成するコントラクトを通してアドレスを伝えた方が便利です。

また、仮にコントラクトに問題があり差し替える必要がある場合、別名(エイリアス)がアドレスへのポインタとなっているので移行がスムーズになるというメリットもあります。

ソースコード

コントラクト名とアドレスを管理するスマートコントラクトを実現するソースコードは、次のようになります。

各定義・処理に関しては、ソースコード内のコメントをご参照下さい。

[ソースコード]

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
pragma solidity ^0.4.11;
contract NameRegistry {
// コントラクト用の構造体
struct Contract {
address owner; // オーナー
address addr; // コントラクトのアドレス
bytes32 description; // コントラクトの説明
}

uint public numContracts; // 登録済みのレコード数

// コントラクトを保持するマップ
mapping (bytes32 => Contract) public contracts;

/// コンストラクタ
function NameRegistry() {
numContracts = 0;
}
//------------------------------------------------------
/// コントラクトの登録
function register(bytes32 _name) public returns (bool){
// 名前が利用されていなければ登録
if (contracts[_name].owner == 0) {
Contract con = contracts[_name];
con.owner = msg.sender;
numContracts++;
return true;
} else {
return false;
}
}

/// コントラクトの削除
function unregister(bytes32 _name) public returns (bool) {
if (contracts[_name].owner == msg.sender) {
contracts[_name].owner = 0;
numContracts--;
return true;
} else {
return false;
}
}
//------------------------------------------------------
/// コントラクトのオーナー変更
function changeOwner(bytes32 _name, address _newOwner) public onlyOwner(_name) {
contracts[_name].owner = _newOwner;
}

/// コントラクトのオーナー取得
function getOwner(bytes32 _name) constant public returns (address) {
return contracts[_name].owner;
}
//------------------------------------------------------
/// コントラクトのアドレス設定
function setAddr(bytes32 _name, address _addr) public onlyOwner(_name) {
contracts[_name].addr = _addr;
}

/// コントラクトのアドレス取得
function getAddr(bytes32 _name) constant public returns (address) {
return contracts[_name].addr;
}
//------------------------------------------------------
/// コントラクトの説明を設定
function setDescription(bytes32 _name, bytes32 _description) public onlyOwner(_name) {
contracts[_name].description = _description;
}

/// コントラクトの説明を取得
function getDescription(bytes32 _name) constant public returns (bytes32) {
return contracts[_name].description;
}
//------------------------------------------------------
/// 関数呼出し前に呼び出される処理であるmodifier(オーナーのみ実行可能)
modifier onlyOwner(bytes32 _name) {
require(contracts[_name].owner == msg.sender);
_;
}
}

データ型のbyte32は固定長の任意型で、任意の値を保管できます。”32”はサイズを指定しています。

今回の処理では、文字列を保管するのに使用しています。

全体的に、値を設定したり取得するだけなのでとても簡単なコントラクトになっていると思います。


次回から、Mist Walletを使ってこのスマートコントラクトの動作を確認していきます。