インメモリトークン(In-Memory Token)

前提

 本稿は、Token-SDKにおける、インメモリトークンを使用したパフォーマンスの向上についての記事のため、Token-SDKに対して基本的な知識があることが前提になっています。Token-SDKに関して、概要を知りたい人は以下の記事をご覧ください。

Corda Token-SDK(その1)

Corda Token-SDK(その2)

 

概要

トークンの移転処理や償還処理を行う場合、適切なトークンをインプットとして選択することは非常に重要です。トークンSDKにおいて、トークンおよびその選択肢に関しては、2種類あります。
・データベースに蓄積されているデータ
・メモリ上に配置されたデータ

メモリ上に配置されたデータを使用したトークンは、データベースに配置されたデータを使用する場合よりも高いパフォーマンスを実現できるため、適切に使用することでCorDappのパフォーマンスを大きく向上させることができます。このように、メモリ上のデータで生成されたトークンのことを
インメモリトークンと呼称します。

本稿では、インメモリトークンを使用したFungibleTokenの移転処理や償還処理を紹介します。
また、CordaとToken-SDKは以下のバージョンを想定しています。
・Corda:4.5
・Token-SDK:1.2

CorDapp コンフィグ設定

インメモリトークンを使用するには、「VaultWatcherService」が必要ですが、これはToken-SDKに包括されているため、別途インストールする必要などはありません。「VaultWatcherService」に記録されているトークンを検索する際に、どのようなインデックスを使用するかをCorDappsビルト時に、「indexingStrategies」項目に設定する必要があります。本稿では、このインデックスのことを
「インデックスストラテジー」と呼称します。

インデックスストラテジーには2つのタイプがあります。
External_ID - 指定された一意のユーザ ID に接続された多数の公開鍵からStateをグループ化することができます。Accounts を使用する場合は、Accounts に属するトークンのクエリを高速に実行できるので、このストラテジーが理想的です。
Public_key - 公開鍵ごとにトークンの「バケット」を作ります。

stateSelection {
inMemory {
indexingStrategies: ["EXTERNAL_ID"|"PUBLIC_KEY"]
cacheSize: Int
}
}

以下は、「EXTERNAL_ID」の例です。

IndexingStrategies.png

 

CorDapp実装 トークン移転処理

Token-SDKで実装したFungibleTokenに移転処理をするためには、MoveFungibleTokensFlowをトリガーとしたり、addMoveFungibleTokenを関数を使用して移転用Transactionの一部に組み込む実装が
一般的です。

もし、メモリ内のFungibleTokensを選択したい場合は、「LocalTokenSelector 」を使用しインメモリトークンを使用することを明示的に表現する必要があります。

 LocalTokenSelector.png

上記のコードでは、TransactionBuilder(および他のいくつかのパラメータ)をパラメータとして受け取り、LocalTokenSelectorを作成します。それに包括されているgenerateMoveメソッドを使用して、移動対象となるトークンを選択し、inputs stateとoutputs stateを生成し、最終的にaddMoveTokens()に渡します。

TokenSDK の addMoveFungibleTokens() のソースコードと比較すると、プログラムの構造は非常に
似ています。違いは、DatabaseTokenSelection の代わりに LocalTokenSelector を使用していることです。

また、selector.generateMove()を呼び出す際にuuidを渡しています。これはインデックスストラテジーとして「EXTERNAL_ID」を採用しているためで、LocalTokenSelectorにパラメーターとして渡されているuuidと同じEXTERNAL_IDを持つトークンのみを選択するように指示していることになります。

また、インメモリ選択には VaultWatcherService が必要です。上記のコードでは、VaultWatcherService のインスタンスを取得し、それを LocalTokenSelector のコンストラクタにパラメーターとして渡しています。しかし、これは任意のパラメーターではなため、渡さない場合は LocalTokenSelector が暗黙的に処理します。

よって、LocalTokenSelector の生成部分を次のようなコードに書き換えることも出来ます。

val selector = LocalTokenSelector(serviceHub)

 

CorDapp実装 トークン償還処理

インメモリトークンの償還処理は、トークン移転処理と似たような考え方で実装可能です。

Redeem1.png

上記のコードでは、移動または償還可能なトークンを TransactionBuilder に追加する方法を示していますが、以下のようにRedeemTokensFlowに直接対象のトークンを渡して、Flowを開始することも
出来ます。

Redeem2.png

 

単体テスト時のインメモリトークン有効化

単体テストにてインメモリトークンを有効化するには、MockNetwork内で疑似的に生成するNodeのCorDappsのwithConfigに設定します。以下、実装例です。

EnableTesting.png

 

最後に

Token-SDKの基本的な知識があれば、比較的簡単に実装できると思います。
トークンアプリのパフォーマンス向上に是非ご活用ください。

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています