Token SDKの実装について①(Token SDKを使ってみる)

はじめに

本稿について

本稿は、CordaのToken開発キットである「Token SDK」に関して概要や実装方法について説明するものです。Token SDKを正しく使う事で独自Tokenを簡単に生成、使用することができます。

また、本稿はR3が提供しているToken SDKのトレーニング「Use the Tokens SDK」に沿った内容になっています。

 

事前準備

本稿は、以下のgithubのトレーニングプロジェクトを使用します。ご自身で実装しながら、Token SDKの学習を行いたい場合は、ローカル環境へのcloneを推奨いたします。

https://github.com/corda/corda-training-code

 

cloneしたプロジェクトは以下のような構成になっています。本稿では、「010-empty-project」と「030-tokens-sdk」を主に参照・使用します。

corda-training-code
   | - 010-empty-project
   | - 020-first-token
   | - 030-tokens-sdk
   | - 040-accounts-lib
   | - 050-ref-state
   | - 060-time-window
   | - 070-services
   | - 080-oracle

 

トークンとは?

Cordaの文脈におけるトークンは、取引されるオブジェクトを指します。良く挙げられる例としては、
通貨や債券、借用書などがありますが、ゲームアイテムトークンやライブチケットトークンなども
考えられます。

また、トークンには分類があり、「合算分割可能/不可能」(fungible token, non-fungible token)、「状態変化有無」(EvolvableTokenType, FixedTokenType)のトークンに細分化できます。

例えば、日本円をこのトークン分類に当てはめてみます。日本円は、1000円トークンと500円トークンを合算して1500円トークンとして使用することができます。逆に700円トークンと300円トークンに分割してしようすることも出来ます。一方で保有している限り、状態が変化することもありません。(ここでいう状態の変化は外見上の状態や価値の変化ではなく、性質や機能としての状態の変化を指しています)なので、日本円は「合算分割可能」かつ「状態変化無」のトークンであるといえます。

Token SDKの基本的な説明に関しては、以下のCorda Guide記事をご覧ください。

Corda Token-SDK(その1)

Corda Token-SDK(その2)

 

トークンSDK導入

gradleファイルの設定

プロジェクトルートのbuild.gradle内のext設定ブロックにリリースグループとバージョンを追加します。

buildscript
{
ext{



tokens_release_version = '1.1'
tokens_release_group = 'com.r3.corda.lib.tokens'
}

また、外部ファイルに値を設定して、build.gradleは参照して設定する方法もあります。
「010-empty-project」直下のbuild.gradleのbuildscriptを以下のように設定してみます。

buildscript
{
ext{



tokens_release_version = constants.getProperty("tokensReleaseVersion")
tokens_release_group = constants.getProperty("tokensReleaseGroup")
}

これらは、corda-training-codeのルートディレクトリにある、constants.propertiesの同名のコンフィグより値を設定します。constants.propertiesはデフォルトでは以下のようになっているはずです。

tokensReleaseVersion=1.1
tokensReleaseGroup=com.r3.corda.lib.tokens

 

次にbuild時にリモートmavenリポジトリから依存関係のあるライブラリを取得するために、build.gradleのallprojectsのrepositoriesに以下のように設定します。

allprojects {

repositories {
maven { url 'https://ci-artifactory.corda.r3cev.com/artifactory/corda-lib' }
maven { url 'https://ci-artifactory.corda.r3cev.com/artifactory/corda-lib-dev' }

 

最後に「contracts/build.gradle」と「workflows/build.gradle」の「dependencies」に依存関係のあるライブラリを追加します。

contracts/build.gradle

dependencies{



// token SDK
cordapp "$tokens_release_group:tokens-contracts:$tokens_release_version"
cordapp "$tokens_release_group:tokens-money:$tokens_release_version"
cordapp "$corda_release_group:corda-finance-contracts:$corda_release_version"
}

workflows/build.gradle

dependencies{



//token SDK
cordapp "$tokens_release_group:tokens-workflows:$tokens_release_version"
cordapp "$tokens_release_group:tokens-selection:$tokens_release_version"
cordapp "$confidential_id_release_group:ci-workflows:$confidential_id_release_version"
}

 

Token SDK実装

トークンの基本的な機能はトークンの発行(Issue)、トークンの移転(Move)、トークンの償還(Redeem)があります。Token SDK用意したメソッドを利用すると簡単に実装することができます。

 

トークン発行(IssueTokens)

mceclip1.png

トークンを発行するには、Flowコードの中で以下の処理を実施します。

①:トークンタイプの定義:TokenTypeにて発行するトークンを設定します。TokenTypeの第一パラメータには、トークンの名前、第二パラメータにはトークンが扱える小数点以下の桁数を設定します。小数点以下を許容しない場合は「0」を指定します。

②:発行するノードを定義:IssuedTokenTypeを使って発行するノードと「①」で定義したトークンタイプを結びつけます。上記のコードは、自ノードがビジネス要件上発行して良いノードなのかを判定しています。(逆に言うと、実行ノードの判定をビジネスロジックに含めないかぎり、どんなノードでも発行可能になります)

③:発行するトークン量の設定:AmountUtilitiesKt.amountにて「②」で定義したノードから発行するトークンの量を指定します。

④:Fungible tokenインスタンスの生成:FungibleTokenにてトークンのインスタンスを生成します。第二パラメータには、発行されるノードを指定します。

⑤:トークン発行:IssueTokensにてトークンを発行します。第二引数には、トークンを発行したことを共有する関係者以外のノード(オブザーバーノード)を設定することが可能です。オブザーバーノードが不要の場合は、空のリストを渡します。

 

※IssueTokensの中で、自ノードでの署名、参加者からの署名収集、確定、vault更新まで行います。

 

トークン移転(MoveFungibleTokens)

mceclip2.png

前提としてトークン移転や後述のトークン償還は、「トークンを保有しているノード」で実行する必要があります。Flowコードの中で以下の処理を実施します。

①:トークンタイプの定義:FiatCurrencyにて移転するトークンを設定します。FiatCurrencyは、主要な通貨やデジタル通貨の通貨コードを設定すると、それに準じたTokenTypeのインスタンスを生成します。上記では「USD」を設定しています。

②:移転先、移転量の設定:AmountUtilitiesKt.amountにて、移転させるトークンの単位を設定します。次にPartyAndAmountで移転先と移転量(Amount)を結びつけます。ここで生成されたオブジェクトはPartyAndTokenの型です。

③:移転対象のトークンの検索:QueryUtilitiesKt.tokenAmountWithIssuerCriteriaにて自身のvaultの中にある「USD」トークンを検索します。また、QueryUtilitiesKt.heldTokenAmountCriteriaにて所有者が自ノードのトークンを検索します。

④:トークン移転:MoveFungibleTokensにてトークンを移転します。第一引数には、「②」で生成したPartyAndTokenのオブジェクトを指定します。(もっと単純に表現すると、アウトプットステートに該当するオブジェクトを渡します)第二引数には、IssueTokensと同様オブザーバーノードを設定可能です。

第三引数には消費するToken(厳密にはそれをvaultから検索するためのCriteria)、第四引数には移転元のNodeを指定します。

 

※MoveFungibleTokensの中で、自ノードでの署名、参加者からの署名収集、Notaryへの署名要求、確定、vault更新まで行います。

 

トークン償還(RedeemFungibleTokens)

mceclip1.png

トークン償還は、トークン移転とほぼ同じ方法で行うことができます。

①:トークンタイプの定義:FiatCurrencyにて償還するトークンを設定します。

②:償還対象のトークンの検索:QueryUtilitiesKt.heldTokenAmountCriteriaにて所有者が自ノードのトークンを検索します。

③:償還量の設定:AmountUtilitiesKt.amountにて、償還させるトークンの単位を設定します。

④:トークン償還:RedeemFungibleTokensにてトークンを償還します。第一引数には、「③」で生成したAmountのオブジェクトを指定します。第二引数には、発行者を設定します。第三引数には、IssueTokens、MoveFungibleTokensと同様オブザーバーノードを設定可能です。第四引数には消費するToken(厳密にはそれをvaultから検索するためのCriteria)、第五引数には償還元のNodeを指定します。

 

※RedeemFungibleTokensの中で、自ノードでの署名、参加者からの署名収集、Notaryへの署名要求、確定、vault更新まで行います。

 

終わりに

CordaのState、Contract、Transaction、Flowの基本的な知識さえあれば比較的理解が簡単だったのではないでしょうか?ご参考になれば幸いです。

 

Created by: Kazuto Tateyama

Last edited by: Kazuto Tateyama

Updated: 2020/10/29

 

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