ブロックチェーン『で』命を賭ける

この記事は クソアプリ2 Advent Calendar 2020 の6日目の投稿です。
昨日は@goosysさんの老舗ゲームメーカーになろうでした。
今日は、20年前のカードゲーム漫画をブロックチェーンに応用してみましょう。


## カードゲーム漫画にて…
悪役　『お前のスターチップは既に一つ。そいつを奪えば、お前は早くも落伍者になるわけかぁ。それじゃあ僕もスターチップを一つ賭けるぜぇ』
主人公『いや、２個賭けてもらう！』
悪役　『なに！？』
主人公『言ったハズだぜ！お前とは潰すか潰されるしかない！オレはスターチップひとつと…』

主人公『命を賭けるぜ！！』

## ごあいさつ
こんにちは。命、賭けてますか？
なんでもトークンと申します。
僕は、ブロックチェーンに全力投球。

価値をインターネット上で扱う技術である『トークン』の研究開発をしています。
結果として、毎月のお給料がブロックチェーンの利用手数料として溶け続けています。
やばいです。

## 価値を扱う技術
ブロックチェーンは価値を扱う、金融に近い領域の技術。
単なるプログラムから、コインを借りられるシステムもあります。
https://app.compound.finance/
でもこのシステム、とある問題があるのです。

## コインがないとコインを借りられない
手元にコインがないと、コインを借りることができません。
つまり、こういうことです。

【できる】
1カ月後に必ず返すから100万円分のコインを貸して！！
約束を守る証拠金として、システムに200万円分のコインを預けるよ！

【できない】
1か月後に必ず返すから100万円分のコインを貸して！！

## 借金の取り立てが出来ない
さきほど紹介したCompound、完全に無人で動いています。
借金を取り立てる怖いお兄さんがいません。
それなら、借りたまま誰も返済しないですね…。

## 命を担保にするのは無理
ブロックチェーンの世界は、担保以上のものを借りるのが不可能なのです。
しかも、現実の物、腎臓、命などは、ブロックチェーン上に存在しないので担保にできません。
お金持ちしかお金を借りることができない。
そんなのずるい。

## クソアプリ作ってみた
『命』を担保にコインを借りられるシステム、作ってみました。
システム構成図は次の通り

![システム構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/0ba27a2d-5718-66fd-5fc2-55ab48078a0b.png)

今回は次の2つを作ります。
・命トークン
・命を刈り取るシステム

作り方を解説していきます。
皆さんも『命』を担保に入れてみてくださいね！

## 命トークン
僕はブロックチェーンが大好きなので、
命トークンの作り方、紹介します！
クソアプリですので、読み飛ばしてもらって大丈夫です。



#### 命トークンのレシピ

材料
・Ethereumブロックチェーン　1つ
・Solidity言語のプログラム　約20行
・Openzeppelinライブラリ　約1500行
・JSONファイル　約300バイト
・命　1つ

![video_cooking_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/7dfdaca2-81ab-8e99-c631-5363fe2ac36c.png)
調理方法
①Etherumブロックチェーンを弱火(20Gwei)で熱します。
②Solidityプログラムを、心を込めて記載します。
③メイン材料であるOpenzeppelinライブラリを結合します。
④JSONファイルを添えると、味にコクと深みが出るでしょう。
⑤命はまだ使わずに手元に置いておいてください。


心を込めて記載した、今回のプログラムを紹介します。

``` Solidity:LifeIsNFT.sol(②で記載した部分)
contract LifeIsNFT is ERC721 {

bool living = true;

function kill() public {
    // 所有者のみが実行可能
    require (msg.sender == ownerOf(1));
    // 命をオフにする
    living = false;
}

function isliving() public view returns (bool) {
    // 命がオンかどうか
    return living;
}

function burnNFT() public {
    // 所有者のみが実行可能
    require (msg.sender == ownerOf(1));
    // 命トークンを消して操作不可にする
    _burn(1);
}

constructor() ERC721 ("LifeIsNFT" , "LIFE") public {
    // 命トークンを1つだけ発行
    _mint(_msgSender() , 1);
    // メタデータの登録
    _setTokenURI( 1 ,  "https://nandemotoken.github.io/LifeIsNFT/LifeIsNFT.json");
    }
}
```

参考：Solidity言語を使ったプログラム全文
https://github.com/nandemotoken/LifeIsNFT/blob/gh-pages/LifeIsNFT.sol

#### 命トークンをEthereumテストネットに構築
今回はクソアプリですので、テスト用環境に構築します。
環境はRinkebyネットワークにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/57e710f2-3945-2e0d-a337-1de61c1b0103.png)

…もし本番環境で作成する場合は、法律チェックが必要です。
……このクソアプリは、法律はともかく倫理的にアウトですね…



#### 命トークンの確認
構築したので命トークンが出来ています。
競売サイトで確認しましょう。
OpenSea有名です。
https://opensea.io/

テストネット上の自分のトークンが確認できるURLにアクセスします。
https://testnets.opensea.io/account

![inochi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/0b71e319-5387-2559-0b97-fe7a32e5a352.png)


ありました。
今回作成した命トークンは、次のURLで確認できます。
https://testnets.opensea.io/assets/0x6c63483eacac253e65a3445829621d37c5bfc7fc/1/

#### 命トークンの使い方
①Aさんが命トークンを作成。
②ブロックチェーンの競売システムに出品。
③富豪が買い取る。
④Aさんは利子をつけて借金返済。
⑤返済期限をオーバーしたら、kill関数でAさんを殺す。

システム構成図(再掲)
![システム構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/0ba27a2d-5718-66fd-5fc2-55ab48078a0b.png)
命を担保にできます！

#### 命の出品
OpenSeaを操作して、命を出品していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/a89974e8-7964-9301-f9e1-1684633309c2.png)

NFTのページにアクセスし、SELLボタンを押します(命の所有者のみが出品できます)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/bd06134d-b46f-eece-674a-47830797b618.png)

価格などを設定して出品しましょう。
今回は100ETH(約500万円)にしてみました。
期間を限定したオークションなども開催できますよ！




## 命を刈り取るシステムの作成
Kill関数により、living変数がfalseになった場合、借り主が死ぬ必要があります。
どのように実現しましょうか…

#### 命を刈り取るシステム：Raspberry Pi
Raspberry Piによる電子工作で実現することにしました。
次の2つの機能で、現実とブロックチェーンを紐付けます。
①電子回路の制御機能(GPIO)⇒現実の装置を操作するために利用
②Web通信機能(Linux)⇒ブロックチェーン上のデータ確認に利用
お値段は約5000円

![E55F45E3-023E-4F8B-A491-609BE79FB5D7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/8013d80c-2f28-56d8-3b88-7fe5d167b9ff.jpeg)

#### 命を刈り取るシステム(電子部品の用意)

今回はシンプルにサーボモーターで刃物を動かすシステムとします。

![0F8EB27B-AEBC-4EDC-BF07-0BF6A40164C5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/7f25d48f-0475-f10c-dda7-813b880efe87.jpeg)


部品
・Raspberry Pi  1式
・サーボモーター 1個
・ジャンプワイヤ 10本
・電池BOX(単3×4) 1個
・ブレッドボード  1枚



#### 命を刈り取るシステム(電子部品の組立)

![2CCE0787-56AA-4558-A05B-A008AEC9F969.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/e9853f60-9218-2fb1-dfa5-5066c0f99ddf.jpeg)

これが命を刈り取るシステムのエンジン部分です。
サーボモータの信号線は右から6番目のGPIO18ピンに接続しました。

#### 命を刈り取るシステム(電子回路制御プログラム)
電子回路を制御するプログラムを書きましょう。
Raspberry PiのGPIO18ピンから制御信号を出します。

```javascript:GPIO18ピンからサーボモーターを制御するプログラム
//raspi-pwmを使用する。
const raspi = require('raspi');
const PWM = require('raspi-pwm').PWM;

raspi.init(function() {
//GPIO18を制御する
  const  pwm = new PWM('GPIO18');
  setInterval(function(){
//生存判定の結果、duty比を0.03もしくは0.09にする。
  pwm.write(living ? 0.03 : 0.09)
  } , 60000)
});

```

なお、Raspberry Pi上で次の準備が必要です。

```bash:raspi-pwmのインストール
npm install raspi-pwm
```
今回のサーボモータはduty比を0.03から0.09にすると約90度回転します。
サーボモーターに刃物を着けると、命を刈り取ることができます！

#### 命を刈り取るシステム(ブロックチェーン読取)
ブロックチェーンから『isliving』関数を読み取ります。
Node.jsを利用して実装していますので、infura.io経由で関数を読み取ると良いでしょう。


```javascript:ブロックチェーン確認
//remixのボタンを押して取得したABIを貼り付け
const abi = "(省略)"

//web3.jsを読み込む
const Web3 = require("web3")
//Infra.ioに登録して取得したAPIキー
const MyInfuraioApiKey = "8cbeaxxxxxxxxxxxxxxxxxxxxx"

async function setup(){
//metamaskの準備
web3js = await new Web3( new Web3.providers.HttpProvider("https://rinkeby.infura.io/v3/"+ MyInfuraioApiKey ));
//スマートコントラクト読み込み
mycontract = await new web3js.eth.Contract(abi, "0x6c63483eacac253e65a3445829621d37c5bfc7fc");
}

//ブロックチェーンの呼び出しは、非同期処理に注意して実装する
async function checkLiving(){
//ブロックチェーン上のisliving関数を呼出
let fromblockchain1 = await mycontract.methods.isliving().call();
console.log(fromblockchain1);
return fromblockchain1;  
}

setup();
let living = checkLiving();
```

なお、Raspberry Pi上で次の準備が必要です。

```bash:web3jsのインストール
npm install web3
```


命を刈り取るプログラムの全文はこちら。
https://github.com/nandemotoken/LifeIsNFT/blob/gh-pages/LifeIsNFT.js




#### 命を刈り取るシステムの装着方法を考える

命を刈り取るシステムは確実に装着されている必要があります。
次の2つの観点で、装着方法の検討が必要でしょう。
①取り付けたあと、取り外すことがない。
②取り付けたあと、日常生活に支障がない。

つまり、指輪、ネックレス、時計のような位置づけが良さそうです。
しかし、首輪や指輪などは、大きなサイズだと違和感がありますね。

我々が身に着けていて最も違和感のないものは何でしょうか…？
そう。デュエルディスクです。
![yu_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/750262dd-e13b-8211-1d43-68e6ded1921e.jpeg)
参考画像：腕に着けてカードを入れるやつ




#### 命を刈り取るシステムのデュエルディスクを作る

![E51B7642-9A82-4AD5-B7E0-4A7BF725FAD2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/eed0508a-2559-9a2a-6e43-dd2bf1a52e30.jpeg)

家にあった材料でデュエルディスクを作りました！
上の参考画像とほとんど同じですね。

なお、今回取り付けてあるナイフは手品用。
本番運用では殺傷力の高いものを選定してください。


#### 命を刈り取るシステムの装着
![FFD5A06D-F37E-4A40-8D5E-C6389ACADA77.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/306146fd-3a7e-5ac4-c2d7-76e66afdc860.png)

日常生活をする上で、全く違和感はありませんね

#### 命を刈り取るシステムを動かす

命を刈り取るシステムを動かしてみましょう。
https://nandemotoken.github.io/LifeIsNFT/LifeFarming.html


富豪のアカウントで上記専用サイトに接続し、Kill関数を呼び出します。
命トークンを持っていた場合だけ、kill関数が動作します。
するとブロックチェーン上に設置したliving変数がfalseになります。
(命トークンを持っていない人が呼び出しボタンを押してもエラーになるだけです)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/570b649e-b98e-42be-94fc-2213d5f91d7e.png)




#### 命を刈り取る

動かしてみましょう。

次の仕組みで命が奪われます。
●Aさんがコインの返済義務を守らない
⇒富豪がkill関数を呼び出す
⇒ブロックチェーンに反映(約15秒)
⇒Raspberry piがブロックチェーンのデータを読み出す(約1分)
⇒Raspberry piのGPIO18番から制御信号送信
⇒Aさんの『命』をシステムが奪う

実際の動作

![ezgif-4-42846591aa1f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533970/4feb1faf-0da3-ad9c-3c3f-7b788cbb6c83.gif)

ナイフの動きが殺意に溢れています。
手品用のナイフでなければ、私の命が奪われていたはずです。

## ブロックチェーン『に』命をかける
最近、ブロックチェーン界隈の知り合いが、どんどん会社を辞めています。
ブロックチェーンで生きていくそうです。
たしかに、この分野は革新的で、命を賭ける価値があるでしょう。
僕もプロのブロックチェーンエンジニアになりたい…。


## おわりに
世界のトークン化をめざす、なんでもトークンでした。
Twitterでブロックチェーンの情報発信をしております。
https://twitter.com/NandemoToken



明日は @yaju さんによる『英語の歌を歌いたい』！
楽しみです！