Visual Studio Code Corda Extension
Cordaでvscodeが使えるようになりました。vscode-corda拡張機能は、CordaでCorDappsを開発するためのツールを提供します。
機能
コマンドパレットから以下の機能にアクセスできます。
⇧⌘P (Windows, Linux Ctrl+Shift+P)
- Corda Clean Project(以前のビルドファイルを削除)
- Corda Assemble Project (w/oテストのビルド)
- Corda Build Project(既存のgradleを使ったCorDappのビルド+テスト)
- Corda Run Tests(ユニットテスト)
- Corda Deploy Nodes (gradle ファイルから模擬ネットワークを設定)
- Corda Run Node(ノードをオンラインにする)
- Corda Stop Running Nodes (noddesが実行中の場合に利用可能)
- Corda Show Node Explorer
必要条件
- NodeJS 12+
- Oracle JDK 8
- Gradle 5.5+
- Corda 4.0+
拡張機能の使用
vcode-corda 拡張機能は、IDE のルートフォルダとして Corda プロジェクトを開いたときに有効になります。プロジェクトを検出するためには、プロジェクトフォルダ内に有効な build.gradle ファイルが存在している必要があります。検出されると、ステータスバーに表示されます。
利用可能なコマンドはコマンドパレットからアクセスできます。⇧⌘P (Windows, Linux Ctrl+Shift+P)
ここから、実行設定を手動で設定しなくても、Clean/Build/Test/Deploy/RunNodesを実行することができます。
しかし、この拡張機能が本当に優れているのは、シミュレーションされたネットワーク上でIDEテストをライブで行うことができるインタラクティブなビューです。
Corda 拡張インタラクティブビュー
まずは、今までにどのようにノードと通信していたかを再度みてみましょう。
昔のノードとのやりとりの方法
CorDappsを開発する際には、ノードと通信したり、モックネットワーク上でアプリをテストしたりするために、一般的に3つの方法があります。
- テストクラスを作成し、net.corda.node.testingパッケージを使ってカスタムモックネットワークのインスタンスを作成する。そして、コードを通してフローとクエリを実行する。
- gradle タスクを使って deployNodes を実行し、生成された runNodes スクリプトを使ってノードを起動し、Corda CRaSH シェルを使ってコンソールコマンドを入力してフローとクエリを実行する。
- RPC 接続アドレスを有効にするためにメソッド 1 または 2 を使ってモックネットワークを作成し、REST API サーバや Java RPCClient ドライバと組み合わせて CordaRPCConnection と CordaRPCOps を使用して RPC を介してフローやクエリを実行する。
これら従来の CorDapp のテスト方法はそれぞれ少し面倒です。
最初の方法は、実行したい特定のユニットテストがある場合に最適ですが、いじったり、即興でトランザクションをテストしたりするには時間がかかります。また、フィードバックはあまり提供されず(コード化しない限り)、ステートは永続的ではありません(すべてがメモリ内にしかありません)。
2 番目の方法は、一般的な方法として多くの新しいCorDappの開発者に使われていると思います。これは永続性を提供します(deployNodes を再びデプロイしたり build/nodes ディレクトリを削除したりしない限り、ノードのvaultはそのままの状態を維持します)。しかし、shellに手動で引数を入力するのは非常に面倒です。また、いくつかの引数(オブジェクトなど)は、インスタンス化できなかったり、ターミナル入力で渡すことができないため、機能が制限されています。
3つ目の方法は、初期段階のテストでは一般的ではありませんが、エンドポイントサーバーを使ってカスタムUIを構築し、CorDappをテストすることができます。問題は、多くのセットアップが必要なことです。
ノード相互作用の新しい方法
以下は Corda Transaction Explorer ビューです。このビューでは、プロジェクトの build.gradle で定義されている任意のノードを探索することができ、ノードinfoとすべてのステートを俯瞰的に見ることができます。さらに、各ノードに登録されているすべてのフローをスキャンし、ボタンをクリックするだけでフローを開始することができます。
Corda Transaction Explorer — Start Flow
Flowを始める
上のスクリーンショットでは、インストールされているフローを選択できるドロップダウンリストが表示されています。フローを選択すると、必要な引数の入力が自動的に表示されます。これは完全に動的で、実際のフローのコンストラクタ・メソッドから派生するので、設定は必要ありません。引数にネットワークPartyや元帳上のStateRefのようなServiceHub APIから派生したオブジェクトを渡す必要がある場合、入力フィールドはその引数のために自動提案されます。CRaSH Shellを使ってみましょう。
最後に、「Run Flow」ボタンをクリックして確定します!
取引の検討
Transaction Explorerでは、選択したノードのVault内のすべてのトランザクションのリストが表示されます。基本情報には、タイムスタンプ、TxHash、アウトプットが含まれます。トランザクションをクリックすると、フィールドが展開され、すべてのアウトプットステートとそのプロパティが表示されます。
トランザクション内のステートのビュー
便宜上、各ステートのStateRef(TxHashとIndex)には、クリップボードへのコピーボタンがあります。
トランザクションリストは自動更新されるので、トランザクションフローを実行した直後に結果がここに表示されます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Corda Vault Query View は、選択されたconstrain(制約)に基づいてノードのVault内のステートをフィルタリングするためのものです。クエリを実行することは、拡張機能の UI を通して大幅に簡単になります。
CRaSH Shellでの基本的なVaultクエリは、run vaultQuery contractStateType. <youpackage>.<yourstate> (毎回これを入力する必要があります)。しかし、Vault Query API は非常に強力で、多くの異なるフィルタリング基準を可能にしており、CRaSH Shellは高度なクエリを受け入れるように設計されていません (必要な QueryCriteria オブジェクトを構築することができません)。
以前は、Vault クエリをフルに活用するには、各クエリに固有のコードを生成する必要がありました。例として、以下のコードは、ステートのリストを返します。
- ステートは UNCONSUMED
- ステートのタイプは myState.class または myState2.class
- ステートはMyNotary1 または MyNotary2に署名された状態
- ステートのステータスはRELEVANT
Vault.StateStatus = Vault.StateStatus.UNCONSUMED;
Set<Class<ContractState>> contractStateTypes =
new HashSet<>(Arrays.asList(myState1.class, myState2.class));
Party notary1 = currentNode.getServices().getNetworkMapCache().getNotary(new CordaX500Name(“MyNotary1”,”London”,”GB”));
Party notary2 = currentNode.getServices().getNetworkMapCache().getNotary(new CordaX500Name(“MyNotary2”,”Vancouver”,”CA”));
List<AbstractParty> notaries = Arrays.asList(notary1, notary2);
Vault.RelevancyStatus rs = Vault.RelevancyStatus.RELEVANT;
QueryCriteria userCriteria = new QueryCriteria.VaultQueryCriteria()
.withStatus(stateStatus)
.withContractStateTypes(contractStateTypes)
.withNotary(notaries)
.withRelevancyStatus(rs);
Vault.Page<ContractState> result =
proxy.vaultQueryByWithPagingSpec(ContractState.class, userCriteria, new PageSpecification());
Vault クエリをより便利に
まず、上記のコードブロックを見ると、特定のクエリ/フィルタを実行したいときに毎回述語型をインスタンス化するのは本当に面倒なことになります。第二に、この方法では、適用したいフィルタの詳細を実際に知っている必要があります。必要な全てのNotaryのCordaX500Nameを知っていますか?現在のノードに興味のあるContractStateタイプをすべて知っていますか?
Corda Vault Query ビューでは、有効なクエリ述語が自動的に決定され、クリックするだけでフィルタリングを行うことができます。
Vault QueryビルダーのUI
ContractStateType、Notary、および Participants フィールドのオプションは、ノードのVaultの中身とネットワーク・プロパティから自動的に派生します。この例では、すべてのVaultの中身は bootcamp.TokenState のタイプですが、他のタイプが存在する場合は、オプションとしてここにも表示されます。利用可能なNotaryは 1つで、ネットワーク上には 3 つのパーティがあります。クエリの結果は、任意の選択に即座に表示されます。
上記のすべてのフェッチ、インスタンス化、および QueryCriteria の構築は、裏でダイナミックに行われています!
デモビデオ
結論
VSCode-Corda 拡張機能は、Visual Studio Code で Corda 開発をしたい人には必須の機能だと思います。まだリリースされて数週間しか経っていないので、近い将来にバグ修正やより革新的な機能が追加されることを期待しています。このプロジェクトはオープンソースなので、新しい機能を提供したり、内部の仕組みに飛び込んだりする機会があります。さあ、CorDappsを作ってみましょう!