CordaをやってMirda

神がかっていたOBPCSの無料試用期間が過ぎてしまったので、~~雑食的にCordaを触ってみようと思います（この言い回しは失礼だな）。~~第3世代ブロックチェーンと称される「Corda」を触ってみようと思います。
今回は、公式で提供されている「CorDapp」を動かすところまで実施します。

2019年2月にCorda4がリリースされた影響なのか、他の方々の記事を見ていると、若干ディレクトリ構成が異なっていたりするようなので、この記事が3mmくらい参考になれば幸いです。

## はじめに
* Macユーザを想定しています。
    * Windowsユーザの方、ごめんなさい
    * ~~自分がWinユーザだったら、文句吐き捨てて秒でこの記事を閉じるな~~
    * 公式には Windows/Mac/Ubuntu/Fedora での手順が記載されていますので、そちらをご参考ください
* CordaやCorDapp、ブロックチェーン云々等についての説明は省きます。
* 内容は公式ドキュメントのクイックスタートを参考にしています。詳細はそちらを御覧ください。
    * https://docs.corda.net/quickstart-index.html

## ソフトウェア要件
* Java8
    * Java9以降はサポートしてない
    * →最初、JDKが11のままやろうとしたら、途中でエラー出たので、要件はしっかり守りましょう
* IntelliJ IDEA 2017.x / 2018.x / 2019.x
* Gradle 4.10
* Git

### Javaのインストール
**すでにインストールしてある人はスキップ可**

▼下記サイトから、JDKのZipをダウンロードし、実行する
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
※Oracleプロファイルへサインインしないとダウンロードできない模様
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/06c91508-7602-2bc4-ef37-703962dbd6de.png)

▼確認

```
$ java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
```

### IntelliJ のインストール
**すでにインストールしてある人はスキップ可**

▼下記サイトから、ファイルをダウンロードし、実行する。
https://www.jetbrains.com/idea/download/download-thanks.html?platform=mac&code=IIC

### IntelliJ のセットアップ
▼「Configure」＞「Plugins」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/e7b0d366-a046-949a-928e-a4a83a6b14e1.png)

▼「Kotlin」を検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/50decfce-bc20-4da3-bd8d-709f00c6a7aa.png)

※バージョンが「1.2.71」未満であれば、Updateし、IntelliJを再起動する

## サンプルCorDappsの実行

### サンプルCorDappsのダウンロード
▼適当なディレクトリを作成して移動

```
mkdir corda-sample && cd corda-sample
```

▼サンプルリポジトリの複製

```
git clone https://github.com/corda/samples
```

▼ディレクトリの移動

```
cd samples/cordapp-example
```

### IntelliJで開く
▼IntelliJを開く
▼「Open」＞「cordapp-example」を選択し「Open」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/701c5779-4e0a-dbdf-0a0b-0649bbd19804.png)

▼「File」＞「Project Structure」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/2458501a-d927-ff89-3d75-fd825ed4eecd.png)

▼「Project」＞「Project SDK」でJDKを選択し「Apply」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/28713695-deeb-8957-2985-28bec00f43f6.png)

▼「Modules」＞「＋」＞「Import Module」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/a7a36f4b-2189-a4b6-2cd0-8247a0a45637.png)

▼「cordapp-example」＞「Open」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/58aa3d85-95b6-800c-2ec0-25d4fb3bd036.png)

▼「Import module from external model」＞「Gradle」＞「Next」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/60204d63-4c54-c4ce-5483-908849d9c3bb.png)


▼「Finish」＞「OK」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/46a83935-7ead-9bc8-d5ff-f2854659b15a.png)

▼しばし待つ（Gradleの依存関係のダウンロードのため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/de73c725-678c-d10d-4d26-a6000fdecb26.png)


## サンプルの実行
サンプルを実行する方法は2つ。

* ターミナル経由
* IntelliJ経由

今回は、ターミナル経由で検証します。

### サンプルCorDappの構築
▼cordapp-exampleを開く

```
$ pwd
~/corda-sample/samples/cordapp-example
```

▼ノードの構築

```
$ ./gradlew deployNodes

〜略〜

Bootstrapping complete!

BUILD SUCCESSFUL in 1m 25s
18 actionable tasks: 17 executed, 1 up-to-date
```

▼中身確認

```
$ ls -1 workflows-kotlin/build/nodes/
Notary
Notary_node.conf
PartyA
PartyA_node.conf
PartyB
PartyB_node.conf
PartyC
PartyC_node.conf
runnodes
runnodes.bat
runnodes.jar
```
```
$ ls -1 workflows-kotlin/build/nodes/PartyA
additional-node-infos
certificates
corda.jar
cordapps
drivers
logs
network-parameters
node.conf
nodeInfo-<HASH>
persistence.mv.db
persistence.trace.db
```
※nodesフォルダ内の説明は公式参照

### 実行
▼ノードの起動
**コマンド実行後、複数タブが開かれますが、作業が完了するまでタブをいじってはいけません。**

```
$ workflows-kotlin/build/nodes/runnodes
```

▼新規に３つタブを開く
※こんな感じで複数タブを開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/42dfb3e9-f54d-51bb-0cd8-a927af558de4.png)


▼Spring Bootサーバ起動
上記で新しく開いた各タブで実行。
**いつになっても100%にならないので、気にしないこと。**

タブ１

```
$ ./gradlew runPartyAServer
Starting a Gradle Daemon (subsequent builds will be faster)

> Task :clients:runPartyAServer
[INFO ] 14:01:56.247 [main] ServerKt.logStarting - Starting ServerKt on MacBook-puro.local with PID 36267 (/corda-sample/samples/cordapp-example/clients/build/classes/kotlin/main started by nobkovskii in /corda-sample/samples/cordapp-example/clients)

〜略〜

<============-> 96% EXECUTING [9m 40s]
> :clients:runPartyAServer
```

タブ２

```
$ ./gradlew runPartyBServer
Starting a Gradle Daemon (subsequent builds will be faster)

〜略〜

<============-> 96% EXECUTING [9m 40s]
> :clients:runPartyBServer
```

タブ３

```
$ ./gradlew runPartyCServer
Starting a Gradle Daemon (subsequent builds will be faster)

〜略〜

<============-> 96% EXECUTING [9m 40s]
> :clients:runPartyCServer
```

### 動作確認
▼ブラウザにアクセスする
http://localhost:port番号/
各情報は、デフォルトであれば、下記の通り
 
|Server|Port|O|L|C|
|---|---|---|---|---|
|A|50005|PartyA|London|GB|
|B|50006|PartyB|New York|US|
|C|50007|PartyC|Paris|FR|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/4c9df2c4-f3ac-73f1-0a85-06f23ef94114.png)

▼「Create IOU」を選択
※IOU（I Owe You）は、借用証明書の意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/bd4208e8-2b09-1774-68c9-9d337755c53d.png)

▼「Counter-party」と「Value」を入力し、「Create IOU」を選択
※Valueの上限は「100」の模様
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/26670ca2-6998-65a6-463d-b35e582b12dd.png)

数秒後、アラートでトランザクション完了の表示
※エラーが発生した時も、このアラートで表示される。
※「Counter-party」を空欄で実行すると、エラーっぽく表示されないけど、クエリとしては失敗している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/ce53c00e-1827-fdb4-d7b5-2de988638d46.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/2e5b875c-6cb3-6f75-0699-264718292051.png)

▼各画面リロード
「Counter-party」で選択したノードにも「Recorded IOUs」が追加されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/d1594ef8-0bd0-df2c-aed5-ff1d3a63ec1d.png)

※「Create IOU」で少し遊ぶ
A-Bのやり取りは、トランザクションに関与していないCからは見えない。
同様に、A-CはBが、B-CはAが不可視となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/86f5218d-0fdf-ed6e-a95a-f258d1aba089.png)

## おわりに
今回は、Cordaのサンプルを動かしてみました。
裏側は全く意識せずに本当に上っ面だけしか触っていませんが、環境構築〜サンプル実行までが簡単で、お試しでやるのには良さげです。

私が元々Java屋ということもあり、JVM言語で書けるのも、個人的に高評価♪
次回は、もう少し踏み入った事をやってみようと思います。

以上です。
ありがとうございました。

P.S.
IntelliJの設定とか、今回のサンプル動かすだけだったら、いらなかったんじゃないかと思う今日このごろ。

## 参考
* 公式ドキュメント
    * https://docs.corda.net/index.html
* Cordaとは何か
    * https://bit.ly/2PRimmx
* R3 / Cordaのご紹介(PDF)
    * https://bit.ly/2UVlX8J
* Cordaとは
    * https://qiita.com/uguisu/items/6878308503be14be4b72