search
LoginSignup
1

More than 3 years have passed since last update.

posted at

NEM Developer Centerに載っていないけど、よく使いそうなTips

はじめに

NEM2(Catapult)の技術的な情報の多くはNEM Developer Centerに取りまとめられています。
これを読むとNEM2(Catapult)に備わっている機能や基本的な使い方を学ぶことができます。

一方で実際にNEM2(Catapult)を使って何か開発をしようとするとNEM Developer Centerに書いてある情報だけだと足りないことがあります。
しかし、実際にはNEM Developer Centerに書かれていないだけで、SDKでカバーされているケースもあります。

ここでは、NEM Developer Centerにはないけれど、知っておくと役立つことを少し紹介してみようと思います。

アカウントが保有するモザイクの相対残高を取得する

NEM2(Catapult)のモザイクは、総発行量を定義するとともに、可分性(小数点の桁数)を設定することができます。
しかし、アカウント保有するモザイクの情報を取得するAPIでは、小数点なしの絶対残高で返ってきます。
画面の表示などで小数点ありの相対残高で扱う場合、モザイクの情報を取得するAPIを叩いて、そのモザイクの可分性を取得する必要があります。

これを自分で一からコードに落とすと少し面倒くさいですが、JavaScript/TypeScript版のnem2-sdk(以下SDK)には、この一連の流れをひとまとめにしたメソッドがあり、MosaicService.mosaicAmountViewFromAddress(address)を使うと、用意にアカウントの保有するモザイクの量を小数点ありの相対残高で取得することが可能です。

以下のコードはそのサンプルです。

import * as dotenv from 'dotenv';
import { MosaicHttp, Account, NetworkType, MosaicService, AccountHttp } from 'nem2-sdk';
import { mergeMap } from 'rxjs/operators';

dotenv.config();

const endpoint = process.env.API_ENDPOINT;
const accountHttp = new AccountHttp(endpoint);
const mosaicHttp = new MosaicHttp(endpoint);
const mosaicService = new MosaicService(accountHttp, mosaicHttp);

const account = Account.createFromPrivateKey(process.env.ACCOUNT_PRIVATE_KEY,
 NetworkType.MIJIN_TEST);

mosaicService.mosaicsAmountViewFromAddress(account.address).pipe(
  mergeMap((_) => _),
).subscribe((x) => {
  console.log('-- mosaic info --');
  console.log(`mosaic id : ${x.mosaicInfo.id.toHex()}`);
  console.log(`divisibility: ${x.mosaicInfo.divisibility}`);
  console.log(`Absolute Amount: ${x.amount}`);
  console.log(`Relative Amount: ${x.relativeAmount()}`);
}, (err) => {
  console.log(err);
});

アドレスやモザイクと紐付いているネームスペースを調べる

ネームスペースとは?

NEM2(Catapult)上のネームスペースはWebで言うところのドメインのようなものに当たります。
ネームスペースをアドレスやモザイクと紐付けることで、モザイクの送信をやりやすくすることができます。
以下は、nem2-cliというコマンドラインツールでモザイクの送信を行った際の例です。
-rで受け取り先のアドレスまたはネームスペースを指定し、-cで送信するモザイクの種類と量をIDまたはネームスペースで指定しています。
どちらも同じ取引内容ですが、ネームスペースを使うことで分かりやすく取引を行うことができます。

ネームスペースを使わなかった場合のモザイク転送

% nem2-cli transaction transfer -r SDXO5N-DUPOWX-HWV7TX-Z2VUKR-CBB4F3-WNVQHH-C627 \
-c 1949B2D8551FCA5E::1000000

ネームスペースを使った場合のモザイク転送

% nem2-cli transaction transfer -r @daoka -c @cat.currency::1000000

モザイクに紐付いているネームスペースを調べる

先ほどの例は、取引の際にネームスペースを使うと楽に送信できることを示しましたが、アカウントの残高表示などでモザイクIDの代わりに紐付いているネームスペースを表示したいケースもあります。
以下は、モザイクに紐付いているネームスペースを取得するためのサンプルコードです。

import * as dotenv from 'dotenv';
import { NamespaceHttp, MosaicId } from 'nem2-sdk';
import { mergeMap } from 'rxjs/operators';

dotenv.config();

const namespaceHttp = new NamespaceHttp(process.env.API_ENDPOINT);
const mosaicId = new MosaicId('1949B2D8551FCA5E');

namespaceHttp.getMosaicsNames([mosaicId]).pipe(
  mergeMap((_) => _),
).subscribe((x) => {
  console.log(x);
}, (err) => {
  console.error(err);
});

アドレスに紐付いているネームスペースを調べる

同様にアドレスに紐付いているネームスペースを取得するサンプルも載せておきます。

import * as dotenv from 'dotenv';
import { Address, NamespaceHttp, add } from 'nem2-sdk';
import { mergeMap } from 'rxjs/operators';

dotenv.config();

const namespaceHttp = new NamespaceHttp(process.env.API_ENDPOINT);
const address = Address.createFromRawAddress('SAIARB-AF6JDU-2ZGWTT-GMPF3X-3DHJLL-UG2EU7-EEPT');

namespaceHttp.getAccountsNames([address]).pipe(
  mergeMap((_) => _)
).subscribe((x) => {
  console.log(x);
}, (err) => {
  console.error(err);
});

トランザクションのサイズを調べる

NEM2(Catapult)の手数料は、トランザクションのサイズに依存しており、手数料をどのくらい準備するかを考慮する上でトランザクションのサイズを把握しておく必要があります。
トランザクションのサイズは以下の方法で調べることができます。

TransferTransaction.create(
  Deadline.create(),
  distAddress,
  [NetworkCurrencyMosaic.createRelative(0)],
  EmptyMessage,
  NetworkType.MIJIN_TEST,
  ).size;

NEM Developer Centerに載っていないことを調べるには?

今回紹介したような相対残高の取得やネームスペースの逆引きといったTipsはSDKのリファレンスを参照したり、NEMの開発者が集まるnem2-slackで質問したりして調べました。

nem2-slackには日本語のチャンネルもあり、海外の開発者も見ており、時々レスをくれることもあります。英語によるコミュニケーションになりますが、#helpに質問してみるとより回答が返ってきやすいかもしれません。google翻訳レベルでも意外に伝わったりするのでトライしてみるといいと思います。

nem2-slackにまだ参加していない方はこの招待リンクから参加してみてください

一緒にnem2(Catapult)を使ったアプリやサービス開発していきましょう!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1