はじめに
民泊などの用途のために、スマートロックの需要が高まっています。
スマートロックを解錠する鍵は、メーカーが用意する専用アプリなどで管理することができるようになっていますが、
Blockchainを用いて、鍵を電子化して、宿泊する予定の人に一時的に貸すような仕組みを作ることができます。
このような仕組みはEthereumのTokenなどの仕組みを用いて作ることができますが、
今回はより簡単に特定の支払いによって解錠するスマートコントラクトを作成したいと思います。
Blockchainを使うメリット
「誰が鍵を今持っているか、解錠履歴の情報を改ざんの恐れなく....」
というのは教科書通りの答えで、もちろんメリットになりますが、Blockchainで管理することのメリットは他にも色々と考えることができます。
- 普段使いの財布に鍵を入れることができる
専用のアプリを用意することなくWalletの規格が同じであれば、普段使いのWalletアプリで管理できます。 - 鍵と一緒に朝食券などが渡せる
例えば、ホテルに宿泊したとして、朝食券や関連施設の利用券をもらうことはよくあります。
鍵と同様にTokenで作成し、ユーザーのWalletに送りつけることで実現することが可能です。
利用したキー
今回使ったのはSESAMIという会社のスマートロックです。
Web用のAPIが公開されているため、これを利用します。
解錠までのフロー
1.ユーザーが特定の金額をロックデバイスに対して支払いする
2.鍵が解錠状態になる
3.unlockというコントラクトのメソッドを監視しているプログラムがAPIをCallする
4.APIがSmartLockのWifiモジュールに対して解除命令を送る(WifiモジュールがAPIで鍵のステ-
タスをpollingしながら監視している)
5.SmartLockのWifiモジュールがBLE通信で鍵を解錠する
解錠操作を受け付けるコントラクト事例
最低限の操作を事例として紹介します.
contract SmartLock {
//デバイス (保有者のアドレス、終了期限、ロック状態を変数に持つとする)
struct LockDevice {
address addr;
uint endTime;
bool isLock;
}
address public owner;
address public lockdevice;
mapping(uint => LockDevice) public lockdevices;
uint public paidAmount;
modifier onlyOwner(){
require(msg.sender == owner);
_;
}
//ロックデバイスつまり、サービス側からのみ施錠される
modifier onlyLockDevice(){
require(msg.sender == lockdevice);
_;
}
//スマートロックが保有する変数
function SmartLock(address _lockdevice) public {
owner = msg.sender;
lockdevice = _lockdevice;
paidAmount = 0;
}
//解錠する
function unlock() public payable {
//1回unlockするための金額を設定
require(msg.value == 10000000000000000);
LockDevice storage ld = lockdevices[paidAmount++];
ld.addr = msg.sender;
ld.endTime = now + 3600;
ld.isLock = false;
}
//鍵をかける
function lock(uint _index) public onlyLockDevice{
require(lockdevices[_index].addr != 0);
require(now > lockdevices[_index].endTime);
lockdevices[_index].isLock = true;
}
}
Postmanで設定
SesamiのSmartLockは開発用にPostmanというアプリケーションを用いることができます。
色々なAPIとの組み合わせやオーソライズキーの発行などを行うことができます。
ここでは使用方法などは割愛します。
SesamiのAPI操作
このような形のAPIリクエストで解錠や施錠操作を行うことができます.
#施錠
curl -H "X-Authorization: " \
-H "Content-Type: application/json" \
-X POST -d '{"type":"lock"}' \
https://api.candyhouse.co/v1/sesames/id/control
#解錠
curl -H "X-Authorization: " \
-H "Content-Type: application/json" \
-X POST -d '{"type":"unlock"}' \
https://api.candyhouse.co/v1/sesames/id/control