はじめに
本稿について
本稿は、CordaのToken開発キットである「Token SDK」に関して概要や実装方法について説明するものです。Token SDKを正しく使う事で独自Tokenを簡単に生成、使用することができます。
また、本稿はR3が提供しているToken SDKのトレーニング「You use the Tokens SDK」および「Refactor Solution」に沿った内容になっています。
事前準備
本稿は、以下のgithubのトレーニングプロジェクトを使用します。ご自身で実装しながら、Token SDKの学習を行いたい場合は、ローカル環境へのcloneを推奨いたします。
https://github.com/corda/corda-training-code
cloneしたプロジェクトは以下のような構成になっています。本稿では、「020-first-token」を主に参照・使用します。
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
課題
エアマイルのトークンを発行・移転・償還できるようなCorDappsを生成します。「020-first-token」に現存するソースを取り除いて、新しいCorDappsを追加します。
・エアマイルトークンタイプを表現する適切な方法を見つけてください。
・TokenStateを削除して、代わりにFungibleTokenを使用してください。
・TokenContractを削除して、代わりに利用可能なContractを使用してください。
・Contractユニットテストを更新して、トークンContractに関するユニットテストになるようにしてください。
・IssueFlowを変更して、Token SDKが用意している発行Flowを使用するようにしてください。
・MoveFlowを変更して、okens SDKが用意している移転Flowを使用するようにしてください。
・RedeemFlowを変更して、Tokens SDK が用意している償還Flowを使用するようにしてください。
・Flowテストを修正して、Flowが正常に動作することを確認します。
ヒント
役に立つFlow
・IssueTokensはトークン発行用のFlowです。開始フロー(IssueTokens)とレスポンダフロー(IssueTokensHandler)を内包していて、開始フローはIssueTokensFlow、レスポンダフローはIssueTokensFlowHandlerをサブフローとして実装しています。
・MoveFungibleTokensは「合算分割可能」トークン移転用のFlowです。開始フロー(MoveFungibleTokens)とレスポンダフロー(MoveFungibleTokensHandler)を内包していて、開始フローはMoveFungibleTokensFlow、レスポンダフローはMoveTokensFlowHandlerをサブフローとして実装しています。
※類似のFlowとしてMoveTokensFlowがあります。これは任意のタイプのトークンの移転を実現します。
・RedeemFungibleTokensは「合算分割可能」トークン償還用のFlowです。開始フロー(RedeemFungibleTokens)とレスポンダフロー(RedeemFungibleTokensHandler)を内包していて、開始フローはRedeemFungibleTokensFlow、レスポンダフローはRedeemTokensFlowHandlerをサブフローとして実装しています。
※類似のFlowとしてRedeemTokensFlowがあります。これは任意のタイプのトークンの償還を実現します。
build.gradle
Token SDKを使うには、依存関係あるライブラリを取り込む必要があります。
依存関係の情報はbuild.gradleに直接設定しても良いですが、別途設定ファイルを用意してそこから読み取らせることも出来ます。今回は別途「constants.properties」という設定ファイルを用意して、以下の項目を設定します。
tokensReleaseVersion=1.1
tokensReleaseGroup=com.r3.corda.lib.tokens
confidentialIdReleaseVersion=1.0
confidentialIdReleaseGroup=com.r3.corda.lib.ci
Token SDKに関する設定は「tokensReleaseVersion」と「tokensReleaseGroup」ですが、Token SDKは匿名化したパーティーも使えるため、Condidential Identityに関する情報も併せて設定します。
次に「build.gradle」タスクの「buildscript.ext」には以下の設定を追加します。
tokens_release_version = constants.getProperty("tokensReleaseVersion")
tokens_release_group = constants.getProperty("tokensReleaseGroup")
confidential_id_release_version = constants.getProperty("confidentialIdReleaseVersion")
confidential_id_release_group = constants.getProperty("confidentialIdReleaseGroup")
次に「buildscript.ext」は、あくまでbuild.gradle内のプロパティなので、「dependencies」に以下を設定します。
// Token SDK dependencies.
cordapp "$confidential_id_release_group:ci-workflows:$confidential_id_release_version"
cordapp "$tokens_release_group:tokens-contracts:$tokens_release_version"
cordapp "$tokens_release_group:tokens-workflows:$tokens_release_version"
cordapp "$tokens_release_group:tokens-money:$tokens_release_version"
cordapp "$tokens_release_group:tokens-selection:$tokens_release_version"
ローカルでノードを立ち上げる場合は、「deployNodes.nodeDefaults」にも以下の設定を加えます。
cordapp project(':contracts')
cordapp (project(':workflows')) {
config project.file("res/tokens-workflows.conf") // About this in an moment
}
// Token SDK dependencies.
cordapp "$confidential_id_release_group:ci-workflows:$confidential_id_release_version"
cordapp "$tokens_release_group:tokens-contracts:$tokens_release_version"
cordapp "$tokens_release_group:tokens-workflows:$tokens_release_version"
cordapp "$tokens_release_group:tokens-money:$tokens_release_version"
cordapp "$tokens_release_group:tokens-selection:$tokens_release_version"
今回、Notary Nodeはnon validatingモードで実行したいためCorDappsの配布は不要です。Notaryのコンフィグには以下の設定を加えます。
cordapps.clear()
上記で設定、変更したbuild.gradleはプロジェクトのルートディレクトリの物ですが、contractsディレクトリとworkflowsディレクトリの配下にもbuild.gradleがあり、各々のjarを作るために必要なライブラリをdependenciesに追加します。
contracts/build.gradleのdependenciesには、以下の設定を追加します。
cordapp "$tokens_release_group:tokens-contracts:$tokens_release_version"
cordapp "$tokens_release_group:tokens-money:$tokens_release_version"
workflows/build.gradleのdependenciesには、以下の設定を追加します。
cordapp "$confidential_id_release_group:ci-workflows:$confidential_id_release_version"
cordapp "$tokens_release_group:tokens-workflows:$tokens_release_version"
cordapp "$tokens_release_group:tokens-selection:$tokens_release_version"
おわりに
いかがでしょうか?次の項で実装例を見ていきたいと思います。
Created by: Kazuto Tateyama
Last edited by: Kazuto Tateyama
Updated: 2021/02/19