DMMエンジニアによるブロックチェーン講座

Stellarでおれおれトークンを作る!![第2回]

トークンの発行

 本稿では、ブロックチェーン、暗号資産の概念を理解されている方を対象に進めていきます。実際に、「おれおれトークン」を発行することで、トークンに対する理解を深めていただければと思います。

はじめに

 今回より、StellarのJS SDKを使い、おれおれトークンを作っていきたいと思います。Stellarのトークンは他のブロックチェーンに比べて、簡単に作成でき、JSの基本的なスキルさえあれば、誰にでもすぐに作成が可能です。連載「Stellarでおれおれトークンを作る!!」第2回ではトークンの作成からトークンの送付までを行いたいと思います。

テストネット用のアドレス作成

 まず最初に、Stellarネットワーク上に、テストネット用のアドレスを作成する必要があります。Stellar公式ページにStellar laboratoryという便利ツールを提供してくれているページがあります。その中のAccount Creatorというツールを使って、テストアドレスを作成します。

 Account Creatorを選択しますと、下の図1の画面が表示されると思います。そして、右上の箇所に、「test」「public」「custom」と表示されている箇所のtestを選択してください。これは「テストネットワーク」、「本番ネットワーク」、「カスタムネットワーク」の選択です。

[図1]

 Generate Keypairボタンを押すと、Public Key、Secret Keyが自動生成されます。この2つのKeyは後ほど利用するため、別途テキストファイルか何かで保存しておいてください(Secret Keyを紛失してしまいますと、再度、Account Creatorを使って、作成しないといけなくなりますので注意ください)。

 この状態ではアドレスが作成されただけなので、別途「アドレスの有効化」を行う必要があり、base reserve分の1XLMを保有しないといけません(詳しい説明は第1回の手数料の箇所で書きましたので、そちらを読んでください)。

 そこでStellar laboratoryでは、テストネット用に、無料で10000XLMを配布する仕組みがあります。図2を見ていただきますと、Generate Keypairボタンの次に、Friendbotという項目が出てきます。この機能は、Stellarネットワーク上で、botプログラムが動作していて、テストネットだけに限って、10000XLMを指定のアドレスに送付してくれる機能です。この機能を使って「アドレスの有効化」を行います。

[図2]

 テキスト入力欄に先ほど生成した、Public Keyを入力して、Get test network lumentsボタンを押してください。図3のように、Successfullyが表示されていれば、10000XLMを受け取り、アドレスの有効化が完了しています。

[図3]

 実際に、10000XLMを受け取っているか、ブロックチェーンから確認してみたいと思います。ブロックチェーンを参照するツールも、Stellar laboratoryが提供しています、Endpoint Explorerを利用したいと思います。Endpoint Explorerのリンクをクリックしてください。

[図4]

 図4のようなページが出てきたら、Account IDの箇所にPublic Keyを入力して、Submitボタンを押すと、Submitボタンの下くらいに、JSONが表示されます。そのJSONにbalanceという項目があり、下の注釈のように、balanceが10000XLM振り込まれていることが確認できると思います。

 テストネット用のアドレス作成は、これで無事完了となります。

トークンの設計

 プログラミングに入る前にトークン設計を行わないといけません。テストネット用のトークンですので、設計といっても決めないといけないのは、「トークン名称」「トークン発行者」の2点になります。ここで注意が必要なのは、トークンの名称ルールになります。

ルールとしては、以下の通りです。

  • 英字1〜12文字まで可 ([例] ABC、USD)
  • 数字1〜12文字まで可 ([例] 777777、1234)
  • 英数字混在でも可 ([例] 100YEN)
  • 英字は大文字小文字どちらも可 ([例] AaBaCc)

 これらに沿っていれば、好きな名称をつけることができます(公式ページでは、USD、JPYのように、ISO4217、ISINのような国際規格に沿った名称をつけるべきだと書かれています)。トークン発行者は先ほど作成したテストネット用のアドレスのPublic Keyを指定したい思います。

 今回のおれおれトークンの名称は、

 にしたいと思います。

 読者のみなさんも好きにつけていただいてもかまいませんし、著者と同じ、OREOREにしても問題ありません。Stellarネットワーク上では、「トークン名+トークン発行者のPublic Key」で一意性を担保しているので、別のトークンとして扱われます。

JS SDKのインストール

 StellarのJS SDKのインストールを行います。JSはNode.jsのパッケージとして公開されていますので、npmでインストールができます(執筆時の最新versionは0.11.0)。

おれおれトークンクラスを作成する

 それではようやく、おれおれトークンを作成し、送付を行う、トークンクラスの作成を開始したいと思います。以下に今回作成するクラス名、メソッド一覧、ファイル名などを列挙しましたので、ご参考ください。

トークンクラスファイル名my_token.js
設定ファイル名config.js
-
クラス名MyToken
初期化処理constructor()
トランザクション生成createTransaction()
トークンの送付send()
トークンの生成※constructor()に対して、引数として外から渡します。トークン生成処理を外部に切り出した理由は後ほど、説明いたします。

設定ファイルの作成

 先に作成したアドレスのPublic KeyとSecret Keyのみが定義されたconfig.jsを作成して、上で作成した、それぞれのキーの値をコピーします。

初期化処理

 最初に、トークンクラスを作成するために必要なjs-stellar-sdkとconfig.jsを呼び出します。

 初期化処理のconstructorは次のようになります。

[初期化メソッド]

 引数の説明

  • assetObject…インスタンス生成時にパラメーターとしてトークンオブジェクトをセットされます。

 返値の説明

  • constructorなので特に無し

ロジックの説明

 StellarSdk.Network.useTestNetwork()でテストネットワークを利用する宣言をしています。本番環境を利用する際は、usePublicNetwork()という指定になります。次にSeverインスタンスを生成する際に、APIサーバーHorizonのURLの指定が必要になります(ここではStellar Foundationが提供している、horizon-testサーバーを利用しています)。

 StellarSdk.Keypair.fromSecret()でconfig.jsに定義したSecret Keyを受け取り、安全性の高い楕円曲線暗号ed25519で、Keypairオブジェクトを生成します。

 メンバー変数のdestinationには、送付先のPublic Keyをセットします。今回は著者が用意しました、このPublic Keyを指定してください。

(著者のPublic Key)GBY4J7D4ERYAVD2IXTIFS6SSSSG343LNF5B57F4BJL5IIEKGUBEBYC37

トランザクションの生成

 次にトランザクションを生成するcreateTransactionメソッドを作成します。

[トランザクション生成メソッド]

 引数の説明

  • accountObject…Accountオブジェクトを外からセットしてもらいます。Accountオブジェクトはその名のとおり、Public Keyに紐付いた、残高情報、アドレス制限などの情報を含んだ、オブジェクトです
  • destination…送付先で、今回は著者が用意したPublic Keyがセットされます。
  • amount…送付先へ送付するトークンの数量になります。

返値の説明

  • 成功すると、TransactionBuilder(トランザクション生成)オブジェクトを返します。

ロジックの説明

 このconfigオブジェクトの作成で注意しないといけないのは、amountが文字列型でなければなりません。

 トランザクション生成関数のメインの処理になります。accountObject(Accountオブジェクト)からトランザクションを生成します。トランザクション種類(送付、トラストライン、アドレス作成)をaddOperationで指定しています。今回はトークンの送付であるため、paymentメソッドを使用しています。

トークンの送付

 トークンを送付するためのsendメソッドの作成です。

[トークン送付メソッド]

 引数の説明

  • amount…送付するトークンの数量

 返値の説明

  • 特に無し

 ロジックの説明

 loadAccountメソッドの引数には、KeypairオブジェクトからPublic Keyを生成して渡します。Public KeyをうけとるとloadAccountメソッドはアドレスに紐付いた残高、送付するための権限、Sequence numberの生成など、トランザクションを生成するために必要な準備を行います。

 signメソッドにKeypairオブジェクト全部を渡してトランザクションに対して自分のSecret Keyで電子署名し、信頼性を担保します。そして最後に、Horizon経由でStellarネットワークに対してブロードキャストを行います。

トークンの生成

 最後に「トークンの設計」で決定した内容を元に、トークンの生成を行います。トークンの生成にはAssetクラスのインスタンスを生成します。

[トークンの生成処理]

 引数の説明

  • トークン名…OREOREを指定
  • トークン発行者…config.jsに定義したPublic Keyを指定

返値の説明

  • 特に無し

ロジックの説明

  • Assetクラスの引数に、トークンの条件をセットすることで、Assetオブジェクトが実質的にトークン生成を行っています。トークン生成 = Assetオブジェクト
  • MyTokenクラスからトークン生成の処理を外に切り出したのは、Assetオブジェクトの生成により多様性をもたせたかったからです。少し脱線しますが、StellarのNative通貨である、XLMを送付する場合はAssetクラスのconstructorに何もわたさずに、nativeメソッドを呼ぶだけで、XLMを送付できます。

[XLMの指定]

 以上でトークンの生成、送付までの処理が完了しました。
とても簡単だと思いませんでしょうか?

トークンクラスの全コード

 今まで作成した、トークンクラスの全コードと著者のほうで確認した、動作環境情報をのせておきます。

[my_token.js]

[動作確認環境]

  • js-stellar-sdkのAPIリファレンスはこちら
  • my_token.jsのソースコードはこちら

コマンドラインから送付を行う

 さっそく、CLIから以下のように実行して送付してみたいと思います。

 そうすると、たぶん以下のようなエラーが表示されて、送付に失敗するはずです。

 これは送付先のアドレス(筆者のアドレス)側でOREOREトークンに対してトラストライン(詳しい説明は第1回のトラストラインを確認ください)が設定されていないためにエラーが発生しました。トラストラインを設定するには、送付先側で秘密鍵による署名が必要になります。秘密鍵を公開することはテストネット用のアドレスといえども、あまりよくないので、トラストラインを設定するためのWebツールを著者のほうで用意しました。

 以下のURLをクリックしてください(Google chrome、Firefoxで動作確認済み)。

 そうすると、Webツール図1のページが表示されると思います。

[Webツール図1]

 Trustlineという項目に、「トークンコード」、「トークン発行者のPublic Key」を貼り付けて、Permitボタンを押してください。特に問題がなければ、Success trustline!!と表示されます(Error No expected statusと表示された場合、ブラウザのDeveloper toolにて、エラー原因を確かめてください)。
このWebツールはこの後の送付確認でも利用しますので、ページは閉じずにこのままの状態でお願いします。
 これでトラストラインは確立されたましたので、さきほどのNode.jsのcliから再度コンドを実行してみてください。

 ターミナル上でSend successが表示されれば、送付に成功です。実際に送付されているかどうか、先ほどの、Webツールで確認すると、Webツール図2のように、Received Tokenの項目に1行レコードが表示されていると思います。

[Webツール図2]

 これで、無事送付できたことが確認できました。もしReceived Tokenに送付したトークンが表示できなかった場合は、ブラウザをリロードして再度、ターミナルから送付コマンドからやり直してみてください。

 送付元のPublic Keyの項目にブロックチェーンエクスプロラーとURLリンクを設定しておきましたので、Stellarのブロックの詳細な中身を詳しくしりたい方は調べてみてください。

次回

 今回は、トークン発行について説明をさせていただきました。次回はトークンの発行制限や、プライオリティ設定などトークン発行の応用編を解説したいと思います。

高地 明

合同会社DMM.com CTO室 エンジニア。R&D、他事業部の支援活動を通して、暗号通貨のプロダクト開発プロジェクトに参加。好きな暗号通貨ブロックチェーンはStellar、好きなプログラミング言語はCrystal。