Cordaのサンプルを動かしてみる〜bank-of-corda-demo編〜

## はじめに
どーも、のぶこふです。

今回は、[公式で提供されているサンプル](https://github.com/corda/corda/tree/release/4.0/samples/bank-of-corda-demo)を動かしてみようと思います。

## ダウンロード
▼サンプルも色々あるので、特定のディレクトリのみダウンロードします。
※参考：「GitHubから特定のディレクトリだけを直接ダウンロード」
https://qiita.com/raucha/items/1219327df8a9ded494df

```console:Terminal_Githubから特定のディレクトリのみダウンロードする
$ svn export https://github.com/corda/corda/tags/release/4.0/samples/bank-of-corda-demo/
```

▼ディレクトリ移動

```console:Terminal_ディレクトリ移動
$ cd bank-of-corda-demo/
```

▼設定ファイルの作成

```console:Terminal_設定ファイルの作成
$ ./gradlew samples:bank-of-corda-demo:deployNodes

-bash: ./gradlew: No such file or directory
```

「**<font color="red">-bash: ./gradlew: No such file or directory</font>**」
…ﾌｧｯ?!

▼闇に帰す

```console:Terminal_ダウンロードしたディレクトリを抹殺・・・ごめんなさい
$ cd ../ && rm -rf ./bank-of-corda-demo
```

## 改めてダウンロード
▼今度は全部ダウンロードします

```console:Terminal_すべてダウンロード
$ git clone https://github.com/corda/corda.git
```

## 起動
▼設定ファイルの作成

```console:Terminal_設定ファイルの作成
$ ./gradlew samples:bank-of-corda-demo:deployNodes
```
○おそらく、そこそこ時間がかかります。（`BUILD SUCCESSFUL in 5m 43s`）

▼ノードの起動

```console:Terminal_ノードを起動します。タブが5つ開くので待機（1分程度）。
$ ./samples/bank-of-corda-demo/build/nodes/runnodes
```

▼キャッシュ発行リクエストを実行[^1]

```console:Terminal_キャッシュ発行リクエストを実行します。
$ ./gradlew samples:bank-of-corda-demo:runRPCCashIssue
```

▼別のキャッシュ発行リクエストを実行[^1]

```console:Terminal_別のキャッシュ発行リクエストを実行します。
$ ./gradlew samples:bank-of-corda-demo:runWebCashIssue
```

▼Bank of Cordaノードの稼働確認
http://localhost:10007/api/bank/date

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/8883336b-aa3d-95fe-d883-1b52799e6ae9.png)


▼アプリ起動

```
$ ./gradlew tools:explorer:run
```

上記を実行すると、下記アプリが起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/6693329c-9e59-e881-c4cb-8981bca99b7d.png)

▼ログインする（Bank of Corda node）

||Bank of Corda node|Big Corporation node|
|---|---|---|
|Host|localhost|localhost|
|Port| 10006 | 10009 |
|Username| bankUser | bigCorpUser |
|Password| test | test |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/3bfb2d2b-7275-912b-d3ac-81f605ac0458.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/065da985-3dcb-6164-c02c-7b90dc784190.png)

○アプリの詳細は、下記を参考
https://docs.corda.net/node-explorer.html

○一回目はうまく起動できたのに、二回目以降はログイン処理後ずっと起動失敗してる:thinking: 

```console:Terminal_キドウ二シッパイシテルヨー
$ ./gradlew tools:explorer:run

> Task :tools:explorer:run
[INFO ] 16:55:26,655 [JavaFX Application Thread] (ReconnectingCordaRPCOps.kt:188) internal.ReconnectingCordaRPCOps.establishConnectionWithRetry - Connecting to: [localhost:10009]
QUASAR WARNING: Quasar Java Agent isn't running. If you're using another instrumentation method you can ignore this message; otherwise, please refer to the Getting Started section in the Quasar documentation.
[INFO ] 16:55:28,152 [JavaFX Application Thread] (InternalUtils.kt:204) internal.RPCClient.logElapsedTime - Failed Startup took 507 msec
・・・
```
→デモの章の頭（▼設定ファイルの作成）から実施したら起動できた。

## アプリデモ
UTXO方式をとっているので、Input→Outputの流れが普通の算数とはちょい違う。
500USDを持っているとしても、「500USD」なのか「250USD+250USD」なのか「12.3USD+456.7USD+8.9USD+22.1USD」なのかで意味合いは変わってくる。
詳しくは「UTXO」で検索してください（丸投げ）

処理は体感早め。

### 画面

左側のメニューから画面を切り替えられます。

---
#### Dashboard
・その名の通り、ダッシュボード。
　・Transactions：押下するとTransactionsタブに遷移する
　・Treasury：押下するとCashタブに遷移する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/9b94e563-c1a9-9718-f168-5b3ee8eb86a4.png)

---
#### Transactions
・トランザクションの一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/fda5774c-b856-85ae-232f-e4dda32538a5.png)
▼「＋」を押下すると、詳細が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/d270833d-5db3-2fe6-b740-eb54bba25a78.png)

---
#### Cash
・トランザクションの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/ca5f0a49-1c09-fcce-469b-d696f5fbf161.png)
▼「＋ New Transaction」押下でモーダルが立ち上がり、作成するトランザクションの詳細を入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/bab6b53c-5ec8-54d8-c56c-635b3bf38e6f.png)

|Transaction Type|説明|
|---|---|
|Issue|発行|
|Pay|支払い|
|Exit|削除？|

Exitの用途がいまいちわからない。
[公式ドキュメント](https://docs.corda.net/contract-catalogue.html?highlight=exiting#cash)を見ると、Exiting（Destroying）と書いてあるので、*ですとろい*するみたいです。

---
#### Network
・各ノードの（地理的な）場所が表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/c475ee3c-c3dd-847c-79a4-dfeb4ba966bc.png)

---
#### Settings
・設定
▼右上の「Edit」のチェックボックスを外すと、編集が行えるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/dad50137-19de-b17e-2d40-b6860e3202d5.png)

---

▼ターミナルで別タブを新しく開き、アプリ起動（`./gradlew tools:explorer:run`）することで、もう一方のユーザでログインすることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/07c8e783-88b8-0a2e-7ecd-9e4673953d13.png)

### トランザクションの作成

ということで、「BankOfCorda」でトランザクションを作成してみます。

#### 発行（Issue）
▼「Cashタブ」＞「＋ New Transaction」＞「Transaction Type：Issue」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/e18016e4-617c-7977-8537-7527add83fc7.png)
▼「BigCorpration」へ「1000USD」発行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/42e22541-7f7b-2bbb-d16f-32b952b57a7d.png)
○無事終了するとメッセージが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/be284a28-7162-1ac5-bc38-b64692344cb5.png)
○「BigCorporation」側のCashタブを見ると、1000USD発行（保持）されているのが確認できます。反対に、「BankOfCorda」では、自身のCashは保持していないので、表示されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/987989b9-4341-3b26-6e18-9e0f868c047d.png)

▼Transactionsタブへ遷移します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/b3aabc4e-dbd3-bd40-d82d-10f5d781c6c4.png)
▼「＋」を押下すると、詳細が開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/6732c290-abbd-4e23-1603-2e4a5c0c0844.png)

画面左側が「BankOfCorda」、右側が「BigCorporation」です。
流れとしては「BankOfCorda」が1000USDを発行（Issue）して、「BigCorporation」へ譲渡（Move）しているのが、今回の処理の流れです。

#### 支払い（Pay）
「BankOfCorda」はCashを保持していないので、「BigCorporation」で実行します。
※「BigCorporation」は権限の関係上「Pay」しか実行できません
▼「Cashタブ」＞「＋ New Transaction」＞「Transaction Type：Pay」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/3329f9ec-b4d3-6e10-648e-8889b3d330a5.png)
▼「BankOfCorda」へ「750USD」支払い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/00602d20-8abb-113d-9a74-ffaae95f2764.png)
○無事終了するとメッセージが表示されます。画面左側のTransactionsタブを見てもわかる通り、トランザクションが増えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/02aee159-9121-6819-9103-d81a1fba4e80.png)
○Transactionsタブを見てみます。
「BigCorporation」の「1000USD」から「750USD」を「BankOfCorda」へ支払い（Pay＝Output）をして、おつりとして「250USD」を「BigCorporation」へ支払い（Pay＝Output）しています。
簡単ですが、これがUTXOの特徴になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/1bafcd7f-9db1-37d1-1656-09b4967c8904.png)

### ？？？（Exit）
発行したCashを、闇に帰すコマンドです。
用途としては、「発行したCashを別システム等のポイントに変換」などでしょうか。あまりユースケースが思いついていません。
「BankOfCorda」で実行します。
▼「Cashタブ」＞「＋ New Transaction」＞「Transaction Type：Exit」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/112425d7-1189-e4b8-ee63-51df0701149f.png)
▼「BankOfCorda」から「100USD」を焼却
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/cabf8864-8538-fcca-57f8-de3b970359b1.png)
○無事終了するとメッセージが表示されます。画面左側のCashタブを見てもわかる通り、Cashの総額が減っています（750USD→650USD）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/b0953076-4748-ff4a-24ff-fdd973568180.png)
○Transactionsタブでは、「BankOfCorda」側のみ「Exit」のトランザクションが増えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/2059fb9c-6a13-33a3-2e27-7d0ecb901e39.png)

### おまけ（UTXO）
自分自身へ支払い（Pay）をすることで、Cashを分割することができます。
▼「BankOfCorda」から「BankOfCorda」へ支払い（Pay）をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/84d00d17-4c78-3d93-754f-e6cf842d0bb7.png)
○Cashの内訳を見てみると「150USD」と「500USD」に分けられていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/7fc627c7-33b8-d6d5-f020-a53a36608691.png)
○Transactionsタブでも同様に、分割していることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/6b5ac0c2-fa55-30d9-027c-da95ff1750a8.png)

## おわりに
今回は、公式のサンプルを動かしてみました。
~~ほぼほぼサンプルアプリの動作説明になってしまっているが・・・~~
GUIで操作ができると、視覚的にわかりやすいですし、操作も直感的で、とても良いですね。

Corda自身が金融系に特化しているとのことなので、今回のようにお金のやり取りするユースケースがメインとなるのでしょうね。
ユースケースも考えないとなーーー。

今回はこれで以上です。
ありがとうございました。


[^1]: アプリの起動には不要です。