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