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

# はじめに

NEM2(Catapult)の技術的な情報の多くは[NEM Developer Center](https://nemtech.github.io/ja/)に取りまとめられています。
これを読むと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)`を使うと、用意にアカウントの保有するモザイクの量を小数点ありの相対残高で取得することが可能です。

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

```typescript
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またはネームスペースで指定しています。
どちらも同じ取引内容ですが、ネームスペースを使うことで分かりやすく取引を行うことができます。

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

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

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

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

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

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

```typescript
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);
});
```

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

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

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

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


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

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

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

nem2-slackにまだ参加していない方はこの[招待リンク](https://join.slack.com/t/nem2/shared_invite/enQtMzY4MDc2NTg0ODgyLWZmZWRiMjViYTVhZjEzOTA0MzUyMTA1NTA5OWQ0MWUzNTA4NjM5OTJhOGViOTBhNjkxYWVhMWRiZDRkOTE0YmU)から参加してみてください

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