【初心者向け】NEM LibraryとJavaScriptを使った開発にちょっとだけ入門してみる

![Nem-Logomark.png](https://qiita-image-store.s3.amazonaws.com/0/90682/1a6adf26-fe76-beae-2b9f-3b895668b408.png)


この記事では、NEMを扱うための便利なライブラリである「[NEM Library](https://nemlibrary.com/)」と、その周辺技術（Node.jsなど）について解説します。

## 対象読者

- NEMを使ったアプリケーション開発を行いたい方
- JavaScriptで開発を行いたい方
- JSの今時の開発方法がわからない方

NEM LibraryはJSのライブラリです。他の言語で開発したい方は次に紹介するリンク先を参考にしましょう。

また、現状フロントエンド開発においてソースコードのトランスパイルは必須です。こちらを使うためのツール群に詳しくない方でもついていけるように書いたので、ここらへんが分かる方にとっては若干冗長かもしれません。

とはいえ、この記事自体かなり内容が易しめだと思うので、総じて初心者向けの記事です。詳しく知りたい方は、この記事からリンクしているライブラリのドキュメントを直接見てみてください😂

## NEM Libraryとは？

NEMを扱うためのライブラリは、以下にまとめられています。

[NEM – Distributed Ledger Technology (Blockchain) » Developers](https://nem.io/developers/#panel-w599b86f61d6d1-0-0-2)

JavaScriptを用いて開発するためのライブラリには[nem-api](https://github.com/nikhiljha/nem-api)というものがあるようですが、どうやらNEM Libraryの方が便利っぽい（使いやすい？）です。

詳細が気になる方は以下の記事も参考にしてみてください。

[NEMライブラリープロジェクトの現状報告 - クリプトストリーム](https://www.cryptostream.jp/nem-library-6589/)

## NEM Libraryを使ってみる

それでは、さっそくNEM Libraryを使っていきましょう。

### 開発環境

最低限Node.jsが入っていれば十分です。ちなみに以下のバージョンで動作確認をしています。

- node 8.9.1
- npm 5.5.1
- yarn 1.3.2

### 1. ライブラリをインストール

それでは開発を行いましょう。まずは適当なワークスペースを作り、必要なライブラリをインストールします。

```shell
$ mkdir nem-library-sample
$ cd nem-library-sample
```

この記事では[yarn](https://yarnpkg.com/ja/)を使います。入っていない方は入れておきましょう。

```shell
$ npm install -g yarn
```

以下のコマンドを打ち込み、バージョンが確認できればインストールは成功です。

```shell
$ yarn -v
1.3.2
```

### 2. ライブラリと開発環境を入れる

開発するためのライブラリを入れていきましょう。

まずはNEM Libraryを入れます。

```shell
$ yarn add nem-library
```

次に、JavaScriptの新しい記法で開発するためのツールを入れていきます。NEM Libraryは[TypeScript](https://www.typescriptlang.org/)での開発も良いと思いますが、この記事では簡単のため[babel](https://babeljs.io/)のみ使います。

```shell
$ yarn add -D babel-cli babel-preset-env
```

次に、`.babelrc`というファイルを作り、以下のように記述します。

```:.babelrc
{
  "presets": ["env"]
}
```

そして、`package.json`に以下のように書き加えます。

```diff:package.json
{
  "dependencies": {
    "nem-library": "^0.10.0"
  },
+ "scripts": {
+   "build": "babel src -d lib"
+ },
  "devDependencies": {
    "@babel/cli": "^7.0.0-beta.32",
    "@babel/preset-env": "^7.0.0-beta.32"
  }
}
```

これにて開発準備は完了です。

### 3. 実際にコードを書いてみる

それでは、NEM Libraryのドキュメントを参考にコードを動かしてみましょう。

`src`ディレクトリを作り、その中に`index.js`を作ります。

そして、`index.js`に以下のように書いてみましょう。

```js:index.js
import {AccountHttp, NEMLibrary, NetworkTypes, Address} from "nem-library";

// Initialize NEMLibrary for TEST_NET Network
NEMLibrary.bootstrap(NetworkTypes.TEST_NET);

const address = new Address("TALICEROONSJCPHC63F52V6FY3SDMSVAEUGHMB7C");

const accountHttp = new AccountHttp();
accountHttp.getFromAddress(address).subscribe(accountInfoWithMetaData => {
    console.log(accountInfoWithMetaData);
});
```

上記のように書いたら、これをビルドします。コマンドは`yarn run build`です。

```shell
$ yarn run build
```

すると、`lib/index.js`ができると思うので、こちらを動かしてみましょう。以下のように表示されれば成功です。

```shell
$ node lib/index.js
AccountInfoWithMetaData {
  balance:
   Balance {
     balance: 50482710823914,
     vestedBalance: 50482622997125,
     unvestedBalance: 87826789 },
  importance: 0.005727549928501352,
  publicAccount:
   PublicAccount {
     address:
      Address {
        value: 'TALICEROONSJCPHC63F52V6FY3SDMSVAEUGHMB7C',
        networkType: 152 },
     publicKey: '74375c15c6ce6bdbde59be88a069745a0de34444ea933f8c9f46ef407cf30196' },
  harvestedBlocks: 134648,
  cosignatoriesCount: undefined,
  minCosignatories: undefined,
  status: 'UNLOCKED',
  remoteStatus: 'INACTIVE',
  cosignatoryOf: [],
  cosignatories: [] }
```

### 4. 簡単な解説

では、少しだけコードの解説をしていきます。

NEMでは、開発用の環境ということでテストネットが用意されているので、今回はそれを使うということで最初に`NEMLibrary.bootstrap(NetworkTypes.TEST_NET)`と書いています。

これはNEM Libraryを使うとき、最初に行う必要がある初期化処理です。本番環境ではこれを`MAIN_NET`にします。

以降のコードは、わりと分かりやすいと思います。`new Address("...")`でアドレスを指定して、`accountHttp.getFromAddress()`にてアドレス情報を取得しています。

こういった記法が可能なのは、NEM Libraryが[RxJS](http://reactivex.io/rxjs/)で書かれているからです。

RxJSについては自分もあまり詳しくないので、気になる方は以下の記事あたりを参考にしてみてください。

[RxJS を学ぼう #1 – これからはじめる人のための導入編 – NET BIZ DIV. TECH BLOG](https://tech.recruit-mp.co.jp/front-end/rxjs-intro/)

## さいごに

今回動かしたコードは以下のリンク先のものです。

[AccountHttp usage | Account - NEM Library](https://nemlibrary.com/documentation/account/#accounthttp-usage)

ドキュメントはわりとしっかしているので、今回の記事で雰囲気がつかめた方はそこまで苦労せずに開発に移行できるのではないでしょうか。

NEMを使ったアプリケーション開発は、Webの経験がある方ならすんなりと始められると思います。自分も[NEMessage](http://nemessage.y-temp4.com/)というサイトを公開しています（まぁこれはNEM Libraryではなく[NEM-sdk](https://github.com/QuantumMechanics/NEM-sdk)を使っているんですけどね😅）。

自分はまだあまり開発できていませんが、機会があればNEM Libraryを使って何かNEMの特性を生かしたアプリケーションを作っていきたいです💪