Ethereum(19) - IoTで利用するスイッチを制御するコントラクト(実装編)

スマートコントラクトはIoTの領域でも活用が期待されています。

カーシェアリングを例にとってみます。

カーシェアリングでは、利用者は車を利用するたびに利用時間に応じた金額を支払う必要があります。

スマートコントラクトを使うと、そのコントラクトに送金することで車が送金状況を確認してドアを自動で開けるようなことが可能になります。

実装

IoTで利用するスイッチを制御するコントラクトを実装します。

[ソースコード]

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
pragma solidity ^0.4.11;
contract SmartSwitch {
// スイッチ用の構造体
struct Switch {
address addr; // 利用者のアドレス
uint endTime; // 利用終了時刻(UnixTime)
bool status; // trueの場合は利用可能
}

address public owner; // サービスオーナーのアドレス
address public iot; // IoTのアドレス

mapping (uint => Switch) public switches; // Switchを格納するマップ
uint public numPaid; // 支払いが行われた回数

/// サービスオーナーの権限チェック
modifier onlyOwner() {
require(msg.sender == owner);
_;
}

/// IoTの権限チェック
modifier onlyIoT() {
require(msg.sender == iot);
_;
}

/// コンストラクタ
/// IoTのアドレスを登録
function SmartSwitch(address _iot) {
owner = msg.sender;
iot = _iot;
numPaid = 0;
}

/// 支払い時に呼ばれる
function payToSwitch() public payable {
// 1 etherでなければ処理を終了
require(msg.value == 1000000000000000000);

// Switchを設定
Switch s = switches[numPaid++];
s.addr = msg.sender;
s.endTime = now + 300; // 300秒⇒5分使用可能にする
s.status = true;
}

/// statusを変更する
/// 利用終了時刻になったら呼び出される。引数はswitchesのkey値
function updateStatus(uint _index) public onlyIoT {
// 対象のindexに対してSwitchが設定されていなければ処理を終了
require(switches[_index].addr != 0);

// 利用終了時刻に達していなければ処理を終了
require(now > switches[_index].endTime);

// statusを更新
switches[_index].status = false;
}

/// 支払われたetherを引き出す
function withdrawFunds() public onlyOwner {
if (!owner.send(this.balance))
throw;
}

/// コントラクトを破棄
function kill() public onlyOwner {
selfdestruct(owner);
}
}

このコンストラクトの仕様は次の通りです。

  • サービスオーナーがコンストラクタでIoTスイッチを登録します。
  • IoTスイッチの利用者はpayToSwitch関数でetherを支払います。
    1etherを支払うと5分間使用できるIoTスイッチを想定しています。
  • IoTスイッチは利用終了時刻になるとupdateStatus関数でstatusを更新してサービスを利用できなくします。
  • サービスオーナーはwithdrawFunds関数をコールし、支払われたetherを引き出すことができます。

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