CordaをUbuntuにインストール&サンプルプログラムを実行してみた。

# Cordaとは？
R3社が開発した分散台帳プラットフォーム。「ブロックチェーンプラットフォーム」と紹介されることも多いが、厳密にはブロックチェーンではないらしい。
↓R3社のHP。
https://www.r3.com/platform/

# 投稿の動機
UbuntuにCordaの開発環境を構築しようとしたが、日本語のインストール手順が見当たらなかったため。
↓は英語版の公式インストール手順。
https://tutorials.ubuntu.com/tutorial/get-started-with-Corda#0

多少英語ができる人なら、問題なくインストールできるはず。

# 環境
Ubuntu：16.04.6 LTS (Xenial Xerus)
※rootが使用できること。
※WindowsからTera-termなどから実行する場合「サンプルプログラム起動」の手順にて、
UbuntuとGUI連携が必要になる。事前にXmingをインストール・起動しておくこと。
(Ubuntu端末を直接使用する場合は不要。)

# Javaのインストール
Java8をインストールするが、自分は環境要件を満たしていたためスキップ。
以下公式の手順

```bash:
sudo add-apt-repository ppa:webupd8team/java
sudo apt update
sudo apt install oracle-java8-installer
```
#Gitのインストール
Gitに関しても、環境要件を満たしていたためスキップ。
以下公式の手順

```
sudo apt install git
``` 
# IntelliJのインストール
IntelliJは、Java、」Kotlinなどの開発に適した統合開発環境。
製作元のJetBrainsは、Pythonの統合開発環境PyCharmの製作元でもある。
(「IntelliJ」と「PyCharm」のロゴがそっくり)

1. サイトからインストール
 https://www.jetbrains.com/idea/download/?fromIDE=#section=linux
 「Ultimate」と「Community」がある。今回は「Community」の「tar.gz」を選択しダウンロード。

2. ディレクトリに格納・展開する。
 今回は、「/opt」配下に展開する。

```
tar -zxvf ideaIC-2019.3.tar.gz
```
 「/opt」配下に「idea-IC-193.5233.102」が展開される。

# Gitからcordaのsampleリポジトリをクローンする。
 これも「/opt」配下に展開する。

 ```
git clone https://github.com/corda/cordapp-example.git
```
 
# サンプルプログラム起動
展開したsampleリポジトリの以下のファイルを実行する。

1. Nodeプロセスの生成
 サンプルプロセスを生成するために、以下のコマンドを実行する。
 
```
/opt/cordapp-example/gradlew deployNodes
```
 コンソールに大量のメッセージが出力されるが、正常終了すると
「BUILD SUCCESSFUL」が表示される。

2. Nodeネットワークの起動。
 「1.Nodeプロセスの生成」で生成したノードを起動する。

 ```
/opt/cordapp-example/kotlin-source/build/nodes/runnodes
```

 以下のコマンドを実行すると、以下の7種類のターミナルが生成される。
・PartyA-corda-webserver.jar
・PartyA-corda.jar
・PartyB-corda-webserver.jar
・PartyB-corda.jar
・PartyC-corda-webserver.jar
・PartyC-corda.jar
・Notary-Corda.jar

※windowsから操作している場合、Xサーバーを起動していない場合、ターミナルが生成されない。
　予め、Xming等Windwos専用のXサーバーをインストールしておくこと。
※ちなみに、「×」ボタンで閉じると、ポートを占有してしまって次回起動時に使えなくなる場合がある。
  必ず「PartyA,B,C-corda.jar」各ノードの端末で「bye」コマンドを実行して終了させること。


# Webブラウザを起動し、Node間のトークンの交換をしてみる。
1. Webブラウザからノードを表示する。

　ブラウザに以下のURLを入力してアクセスする。
　http://[UbuntuのIPアドレス]:[NodeA,B,C]のポート番号/web/example/
　例：IPアドレスが192.168.0.11でNodeのPort番号が「10009」の場合、アクセスするURLは以下の通りになる。
　http://192.168.0.11:10009/web/example/

　※NodeA,B,Cのポート番号の確認方法：「Nodeネットワークの起動」で生成された、
「PartyA,B,C-corda-webserver.jar」に表示されている「Starting as webserver: localhost:」に続く番号を設定すること。

2.トークンの交換を行う。
　ここでは「NodeAからNodeBにValue30を送信する」動作を確認してみる。

　2-1.「NodeA」のブラウザ画面の「Create IOU」ボタンをクリックする。
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/858405fb-ed28-59e4-3cdc-476311f71ffd.png" width=50%>
　
　2-2.「Add new IOU」というポップアップ画面が表示されるので、「Counter-party」に
「O=PartyB L=New York,C=US」、「Value(Int)」に「30」を設定し、画面右下の「Create IOU」ボタンをクリックする。
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/c3f432b9-3776-1d78-935d-f39e90e721c1.png" width=50%>

 2-3.Transactionのコミット画面が表示される。(2-2のクリックから最大数十秒程度かかる)
　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/0886059b-7d70-d7a6-0e61-481456039c0c.png" width=50%>

 2-4 各ノードに取引履歴が記録される。
　NodeAのブラウザ画面。「My IOUs」と「Recorded IOUs」が更新されている。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/9ecba8d0-614b-0819-ef33-880fe139182b.png" width=50%>
　
　NodeBのブラウザ画面。「Recorded IOUs」が更新されている。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/7a8c6fa8-d72d-ea2a-efe8-840336ff3a38.png" width=50%>

ノード間で取引ができていることが確認できた。

# 備考
作られたノードのうち「Notary-Corda.jar」というのは、何なのか。
「Notary」は「公証人」という意味。
すなわち、CordaにおいてNotaryノードは各トランザクションのハッシュ値を確認し、
二重取引の防止を行うことに特化したノードである。


# おわりに
↓次の記事↓
**・[CorDappを自作してみる。(テンプレートクローン～開発環境構築まで) - Qiita](https://qiita.com/kzt_tateyama/items/4ceb46b8e86e1bb8e0e5)**
# 参考サイト
【Cordaデータモデルの特徴】
https://medium.com/corda-japan/corda%E3%83%87%E3%83%BC%E3%82%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E7%89%B9%E5%BE%B4-701d49f02cd