神がかっていたOBPCSの無料試用期間が過ぎてしまったので、~~雑食的にCordaを触ってみようと思います(この言い回しは失礼だな)。~~第3世代ブロックチェーンと称される「Corda」を触ってみようと思います。
今回は、公式で提供されている「CorDapp」を動かすところまで実施します。
2019年2月にCorda4がリリースされた影響なのか、他の方々の記事を見ていると、若干ディレクトリ構成が異なっていたりするようなので、この記事が3mmくらい参考になれば幸いです。
はじめに
- Macユーザを想定しています。
- Windowsユーザの方、ごめんなさい
自分がWinユーザだったら、文句吐き捨てて秒でこの記事を閉じるな- 公式には Windows/Mac/Ubuntu/Fedora での手順が記載されていますので、そちらをご参考ください
- CordaやCorDapp、ブロックチェーン云々等についての説明は省きます。
- 内容は公式ドキュメントのクイックスタートを参考にしています。詳細はそちらを御覧ください。
ソフトウェア要件
- 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プロファイルへサインインしないとダウンロードできない模様
▼確認
$ 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 のセットアップ
※バージョンが「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」を選択
▼「File」>「Project Structure」を選択
▼「Project」>「Project SDK」でJDKを選択し「Apply」を選択
▼「Modules」>「+」>「Import Module」
▼「Import module from external model」>「Gradle」>「Next」
サンプルの実行
サンプルを実行する方法は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
▼Spring Bootサーバ起動
上記で新しく開いた各タブで実行。
いつになっても100%にならないので、気にしないこと。
タブ1
$ ./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
タブ2
$ ./gradlew runPartyBServer
Starting a Gradle Daemon (subsequent builds will be faster)
〜略〜
<============-> 96% EXECUTING [9m 40s]
> :clients:runPartyBServer
タブ3
$ ./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 |
▼「Create IOU」を選択
※IOU(I Owe You)は、借用証明書の意。
▼「Counter-party」と「Value」を入力し、「Create IOU」を選択
※Valueの上限は「100」の模様
数秒後、アラートでトランザクション完了の表示
※エラーが発生した時も、このアラートで表示される。
※「Counter-party」を空欄で実行すると、エラーっぽく表示されないけど、クエリとしては失敗している
▼各画面リロード
「Counter-party」で選択したノードにも「Recorded IOUs」が追加されている
※「Create IOU」で少し遊ぶ
A-Bのやり取りは、トランザクションに関与していないCからは見えない。
同様に、A-CはBが、B-CはAが不可視となる。
おわりに
今回は、Cordaのサンプルを動かしてみました。
裏側は全く意識せずに本当に上っ面だけしか触っていませんが、環境構築〜サンプル実行までが簡単で、お試しでやるのには良さげです。
私が元々Java屋ということもあり、JVM言語で書けるのも、個人的に高評価♪
次回は、もう少し踏み入った事をやってみようと思います。
以上です。
ありがとうございました。
P.S.
IntelliJの設定とか、今回のサンプル動かすだけだったら、いらなかったんじゃないかと思う今日このごろ。
参考
- 公式ドキュメント
- Cordaとは何か
- R3 / Cordaのご紹介(PDF)
- Cordaとは