ライブラリを利用した実際のコードを見せましょう!!
以前NEM Libraryを用いてXEMを送金するコードを実装しました。
今回は独自通貨(モザイク)の残高取得と送金になります。
また事前準備として独自通貨(モザイク)を発行して準備する必要があります。準備方法が分からない方は下記の2つの記事が参考になると思います。
ただしすでに何かしらのモザイクをテストネットで保有している場合は発行する必要はありません。ちなみにXEMもモザイクの1つになります。
テストネットは開発者が新しい機能を追加して、その挙動を検証するテスト環境です。つまり実際のお金を支払わずにXEMを無料で入手して利用することができます。メインネットは、現実のトランザクションが行われ記録されます。
なのでもちろんテストネットで使われる通貨はメインネットの通貨と互換性はありません。
先週NEMのテストネットのXEMが配布されているサイトを新たに見つけたのを思い出した。現在残高が9万XEMもある!
モザイクを使ったサンプルアプリを作ってみようと思ってたけどXEMが枯渇してから諦めてた。100XEMは必要になるので。これで作れそう😌https://t.co/xol6lZpqBM#nem #xem
— まつしん@Railsプログラマ (@matsushin11)
ちなみにもっと早く試してみたかったのですがテストネット環境でもメインネットと同様にモザイクを発行するのに約110XEM(ネームスペースレンタル代で100XEM、モザイクレンタル代で10XEM+手数料が合計0.3XEM)ほど必要になります。
そしてテストネットのXEMが枯渇し入手しにくい状況となっていたので諦めていました。
ではコードを見ていきましょう!
Contents
NEM Libraryでモザイク送金の実装方法
保有しているモザイクを取得する
保有しているモザイク一覧の取得です。ほぼ数行で取得できちゃいます。
1 2 3 4 5 |
import { AccountHttp, Address, AccountOwnedMosaicsService, MosaicHttp, NEMLibrary, NetworkTypes } from 'nem-library'; NEMLibrary.bootstrap(NetworkTypes.TEST_NET); // TestNetへの接続 const address = 'モザイク保有情報を取得したいアドレスを入れてください'; const accountOwnedMosaics = new AccountOwnedMosaicsService(new AccountHttp(), new MosaicHttp()); accountOwnedMosaics.fromAddress(new Address(address)).subscribe((mosaics) => { console.log(mosaics); }); |
例によってテストネットに接続していますが、メインネットに接続させたい場合は上から2行目のコードを以下のように変更してください。
1 |
NEMLibrary.bootstrap(NetworkTypes.MAIN_NET); |
モザイクを送金する
次にモザイク送金のコードです。情報としては送金先アドレス、送金元アカウントの秘密鍵、モザイク名、送金量になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import { Address, MosaicHttp, MosaicId, Account, TimeWindow, TransferTransaction, TransactionHttp, EmptyMessage } from 'nem-library'; import { Observable } from 'rxjs/Rx'; NEMLibrary.bootstrap(NetworkTypes.TEST_NET); // TestNetへの接続 const PRIVATE_KEY = "送金元アカウントの秘密鍵を入れてください"; const address = "送金先アドレスを入れてください"; const mosaicName = "モザイク名を入れてください(例 nem:xem)"; const amount = 1; // 送金量 const account = Account.createWithPrivateKey(PRIVATE_KEY); const mosaicNames = mosaicName.split(':'); Observable.from([ { mosaic: new MosaicId(mosaicNames[0], mosaicNames[1]), quantity: amount }, ]).flatMap((_) => new MosaicHttp().getMosaicTransferableWithAmount(_.mosaic, _.quantity)) .toArray() .map((mosaics) => TransferTransaction.createWithMosaics( TimeWindow.createWithDeadline(), new Address(address), mosaics, EmptyMessage, )) .map((transaction) => account.signTransaction(transaction)) .flatMap((signedTransaction) => new TransactionHttp().announceTransaction(signedTransaction)) .subscribe( (value) => { console.log( "リクエスト結果:\n" + value.message); }, (err) => { console.log( "失敗:\n" + err.toString()); }, ); |
XEMの送金より少し複雑なコードとなっています。
動きとしては総供給量などを元に手数料を計算するためモザイク情報をテストネットに問い合わせています。その問い合わせ結果を元にトランザクションを組み立て署名してから送金を実行するという流れです。そのためにrxjsというライブラリを使うようにしています。
またコードを見てもわかる通り配列を扱っていますので一度に複数のモザイクの送金が可能です。
では次に自分の勉強も兼ねてVue.js + TypeScriptでサンプルアプリを作りましたので動作を見ていきましょう。
保有しているモザイクを取得して表示し、モザイクの送金ができるのみのシンプルな作りとなっています。コードを見るとStoreの利用方法等のVue.jsの基本の勉強にもなるかもしれません。
今回実装したコードはこちらにおいています。
サンプルコードを動作させる
動作環境
動作させた環境は以下になります。
- Mac OS High Sierra v10.13.5
- node v10.0.0
- yarn v1.6.0
- vue v2.5.2
- typescript v3.0.0
- new-library v1.0.9
今回は最近(2018/8/10)バージョンが3系にアップしましたVue CLIを利用しています。
それによって新しいプロジェクトを作成する場合に選択可能なオプションが増え、最初からTypeScriptを選べるようになりました。
セットアップ
リポジトリをクローン
1 2 |
$ git clone git@github.com:Matsushin/nem-library-mosaic-vue-sample.git $ cd nem-library-mosaic-vue-sample |
各ライブラリをインストール
1 |
$ yarn install |
ローカルサーバを起動
1 |
$ yarn serve |
トップ画面(http://localhost:8080/#/)にアクセス。エラーが発生していないければOK。
動作確認
テストネットのアドレスを入力して「保有しているモザイク情報を取得する」をクリック。
保有しているモザイクが一覧で表示されたらOK!
続いて送金のテストをするために送金先のアドレス、取得したアカウント情報に紐づく秘密鍵、送金するモザイク名、と送金量を入力して「モザイクを送金する」をクリック。
送金結果に「成功」と表示されればOK!
少し待って再度トップ画面でアドレスを入力しますと残高が減っていることが確認できます。もちろんNanoWalletからでも確認できます。
また送金時にXEMを手数料として支払っているのでXEMも減っていることも確認できます。
サンプルコードの動作はここまでになります。
まとめ
今回はNEM LIbraryを用いて保有しているモザイク情報の取得とモザイクの送金を実装してみました。
この辺りは以前XEMの送金のコードも書いているので同様に簡単に実現できました。
このモザイクの機能ができるとどういう点で嬉しいかというと、例えばサービス内でモザイクを独自ポイントのような扱いができます。
そうするとすでにNEM側でAPIが用意されていることからポイント機能の実装を時間をかけずに実現できる、別のサービスとの連携が簡単、取引所に上場したら売買できるというようなメリットがあるかと思います。逆にネームスペース・モザイクのレンタル費用がかかる、送金詰まりの可能性がある、送金に手数料がかかる等のデメリットもあります。
NEMを機能実現方法の選択肢の1つとして検討してみると面白いのではないでしょうか。
XEMの送金の実装方法は分かった!!そうすると次は独自通貨(モザイク)も送金してみたくなっちゃったりして・・・。