Edited at

CordaをやってMirda

神がかっていた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プロファイルへサインインしないとダウンロードできない模様

image.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

▼「Kotlin」を検索

image.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

▼「File」>「Project Structure」を選択

image.png

▼「Project」>「Project SDK」でJDKを選択し「Apply」を選択

image.png

▼「Modules」>「+」>「Import Module」

image.png

▼「cordapp-example」>「Open」

image.png

▼「Import module from external model」>「Gradle」>「Next」

image.png

▼「Finish」>「OK」

image.png

▼しばし待つ(Gradleの依存関係のダウンロードのため)

image.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

▼新規に3つタブを開く

※こんな感じで複数タブを開きます

image.png

▼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

image.png

▼「Create IOU」を選択

※IOU(I Owe You)は、借用証明書の意。

image.png

▼「Counter-party」と「Value」を入力し、「Create IOU」を選択

※Valueの上限は「100」の模様

image.png

数秒後、アラートでトランザクション完了の表示

※エラーが発生した時も、このアラートで表示される。

※「Counter-party」を空欄で実行すると、エラーっぽく表示されないけど、クエリとしては失敗している

image.png

image.png

▼各画面リロード

「Counter-party」で選択したノードにも「Recorded IOUs」が追加されている

image.png

※「Create IOU」で少し遊ぶ

A-Bのやり取りは、トランザクションに関与していないCからは見えない。

同様に、A-CはBが、B-CはAが不可視となる。

image.png


おわりに

今回は、Cordaのサンプルを動かしてみました。

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

私が元々Java屋ということもあり、JVM言語で書けるのも、個人的に高評価♪

次回は、もう少し踏み入った事をやってみようと思います。

以上です。

ありがとうございました。

P.S.

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


参考