JavaScript
Node.js
Blockchain
NEM

nem-libraryを利用してJavaScriptでlc:jpyを送金する。

TypeScriptを使用せず、nem-libraryを活用するシリーズ2回目です。
今回はNEMモザイクの1つでもあるLCNEMさんが発行されているlc:jpyの送金を行います。

以前までの記事はこちらを参考にしてください。

amazon linuxでNode.jsのNEM開発環境を爆速で整える
nem-libraryを利用してJavaScriptでXEM送金する

使用するライブラリは少し増えます。

require
const nemlibrary = require('nem-library');
const NetworkTypes  = nemlibrary.NetworkTypes;
const Account = nemlibrary.Account;
const Address = nemlibrary.Address;
const TimeWindow = nemlibrary.TimeWindow;
const XEM = nemlibrary.XEM;
const PlainMessage = nemlibrary.PlainMessage;
const TransferTransaction = nemlibrary.TransferTransaction;
const TransactionHttp = nemlibrary.TransactionHttp;

const MosaicId = nemlibrary.MosaicId;
const MosaicHttp = nemlibrary.MosaicHttp;
const Rx = require("rxjs");
require( "rxjs/add/observable/from");
require( "rxjs/add/operator/mergeMap");
require( "rxjs/add/operator/toArray");
require( "rxjs/add/operator/map");

rxjsというライブラリのObservableという機能を使います。なかなかの高機能ですので是非マスターしてください。

メインネットへの接続は前回同様です。

bootstrap
nemlibrary.NEMLibrary.bootstrap(NetworkTypes.MAIN_NET);

そして肝心のlc:jpy送金

node.js
const PRI_KEY = "aaaaaaaaaaaabbbbbbbbbbbcccccccccccccc";
const address = "NXXXXXXXXXXYYYYYYYYYYYYZZZZZZZZZZZZZZ";
const namespace = "lc"
const mosaic = "jpy"
const amount = 1;
const message = "これはテストです";
const account = Account.createWithPrivateKey(PRI_KEY);

Rx.Observable.from([
    {mosaic: new MosaicId(namespace, mosaic), quantity: amount}

]).flatMap(_ => mosaicHttp.getMosaicTransferableWithAmount(_.mosaic, _.quantity))
.toArray()
.map(mosaics => TransferTransaction.createWithMosaics(
    TimeWindow.createWithDeadline(),
    new Address(address),
    mosaics,
    EmptyMessage
    )
)
.map(transaction => account.signTransaction(transaction))
.flatMap(signedTransaction => transactionHttp.announceTransaction(signedTransaction))
.subscribe(
    value => {console.log( "リクエスト結果:\n" + value.message);},
    err => {console.log( "失敗:\n" + err.toString());}
)

XEM送金より少し難しくなっています。それはなぜかと言いますとNEMでは総供給量などを元に手数料が計算されるので、いったんモザイク情報をメインネット問い合わせてからでないと送金処理が行えないのです。そこで活躍するのがObservableです。問い合わせ結果を元にトランザクションを組み立てるといったことが容易にできます。rxjsはnem-libaryをインストールした時に内部に含まれているので、正しくパスを指定することで適切なバージョンをそのまま使用することができます。

NEMでは複数のモザイクを一度に送信できるので、配列やマップ関数を駆使しています。このあたりは公式ドキュメントの手順を参考にしました。

How_to_create_a_Transfer_Transaction_with_Mosaics.ts

まず、送金したいモザイク情報のjsオブジェクトを作成します。

{mosaic: new MosaicId(namespace, mosaic), quantity: amount}

配列にして複数並べることも可能です。これらをmosaicHttp.getMosaicTransferableWithAmountクラスで金額が送金可能かを検証します。結果に対してmosaicトランザクションを組み立てていきます。あとは前回同様で署名トランザクション、アナウンス、結果取得と一連の処理が続きます。

たったこれだけのプログラムでオリジナルトークンの送金が実現できました。
HTMLなどでウォレットを作るとなるともう少しハードルは高くなりますが、SNSなどのAPIを利用すればあと少しで送金システムを完成させることができます。

次は最後の講座、slackのコマンドからユーザごとにアカウントを生成する方法をお伝えします。お楽しみに!