NEM-sdkを使ってみる

NEMで何らかのサービスを作るにあたり、Node側からもAngular側からも同じように使えるライブラリを作ろうと思っていたのですが、NanoWalletとかにガンガンコミットしている方が作ったNEM-sdkというのが既にあるらしいので使ってみます。

github.com

インストー

普通にnpmモジュールになっているので、npm installでインストールします。

Angular側から呼んだ際にajvでエラーが出たので、ajvを最新バージョンでインストールしなおしておきます。 (Nodeから直接実行するときは特にエラー出なかったので、Angular側の問題かもしれません。)

$ npm install nem-sdk --save
$ npm install ajv --save

オブジェクト

オブジェクトの種類は主に以下で、必要に応じて組み合わせて使います。

  • common パスワード、秘密鍵
  • endpoint SNのホスト名、ポート番号
  • mosaicAttachment 送金するモザイク
  • mosaicDefinitionMetaDataPair モザイクの基本情報
  • invoice 請求書用?
  • transferTransaction 送金トランザクション
  • signatureTransaction マルチシグの署名トランザクション

空のオブジェクトを作成するには、nem.model.objects.getを利用します。

let transferTx = nem.model.objects.get("transferTransaction");

以下のようなオブジェクトが生成されます。

{
  "amount":0,
  "recipient":"",
  "recipientPublicKey":"",
  "isMultisig":false,
  "multisigAccount":"",
  "message":"",
  "isEncrypted":false,
  "mosaics":[]
}

パラメータのセットされたオブジェクトを生成するには、nem.model.objects.createを利用します。 この関数は関数を返すのでその関数に引数を渡します。

let transferTx = nem.model.objects.create("transferTransaction")("NDY4RHUZ3CZOZ53O5HNEXTEM7UF5X3MMDGH4IMAD", 1, "soon");

以下のようなオブジェクトが生成されます。このままではまだ使えません。

{
  "amount":1,
  "recipient":"NDY4RHUZ3CZOZ53O5HNEXTEM7UF5X3MMDGH4IMAD",
  "recipientPublicKey":"",
  "isMultisig":false,
  "multisigAccount":"",
  "message":"soon",
  "isEncrypted":false,
  "mosaics":[]
}

トランザクション作成

先ほどのトランザクショントランザクションタイプやタイムスタンプなどを付加するには、nem.model.transactions.prepareを利用します。 送信サイドの情報が必要なので、先にcommonオブジェクトを作成します。(privateKey部分は生の秘密鍵文字列。)

let common = nem.model.objects.create("common")("", "privateKey");
let transactionEntity = nem.model.transactions.prepare("transferTransaction")(common, transferTx, nem.model.network.data.mainnet.id);

必要情報が付加されました。

{
  "type":257,
  "version":-1744830463,
  "signer":"099132a49ed0c15936a464cf6ef43120f01fa88835803593571882feea6161db",
  "timeStamp":68485327,
  "deadline":68488927,
  "recipient":"NDY4RHUZ3CZOZ53O5HNEXTEM7UF5X3MMDGH4IMAD",
  "amount":1000000,
  "fee":2000000,
  "message":{"type":1,"payload":"736f6f6e"},
  "mosaics":null
}

送信

トランザクションの送信には、nem.model.transactions.sendを利用します。実際にネットワークへ送信するので、endpointオブジェクトを作成しておきます。

実行するとnem.model.transactions.prepareで準備したトランザクションシリアライズして署名し、ネットワークへ送信します。

let endpoint = nem.model.objects.create("endpoint")(nem.model.nodes.defaultMainnet, nem.model.nodes.defaultPort);
nem.model.transactions.send(common, transactionEntity, endpoint)
  .then(res => console.log(JSON.stringify(res)));

以下の通りSUCCESSが返りました。

{
  "innerTransactionHash":{},
  "code":1,
  "type":1,
  "message":"SUCCESS",
  "transactionHash":{
    "data":"2b1b0b95ec2f6181991e1f71c4501b56b51b9f2841f4840602590e867b480693"
  }
}

 

ということで、このライブラリを使うと本当に手軽にXEMやモザイクの送信が可能です。当然、Node側からもHTML側からも同じように呼べますし、モザイクを使ったWEBサービスやゲームなども簡単に実装出来そうです。

また、今後このライブラリがNanoWalletに統合されるようなことも書いてあるので、どうやらもう車輪から自作する必要はなく、すぐに作りたいものを作るフェーズから開始すれば良さそうです。

よし、何か作ろう。(soon)


※筆者のモチベーション向上のため、以下NEMアドレスへxemなりシットトークンなりの寄付を受け付けています。

NDY4RH-UZ3CZO-Z53O5H-NEXTEM-7UF5X3-MMDGH4-IMAD