NIS APIを使ってnemのブロックチェーンネットワークにアクセスしてみる

さて始まりました、nemアドベントカレンダー！
下手な前置きはスベるので省略しますが、ご協力いただいたみなさまに感謝です。
このカレンダーを通して、nemに興味ある方はより深く、興味なかったひとは興味を持っていただければ幸いです。

追記：
[nem Advent Calendar 2018 \- Qiita](https://qiita.com/advent-calendar/2018/nem)
2018年版もあります。こちらもご覧ください。

# nemとは？

[仮想通貨のネム（NEM）/ XEMとは？ 概要と最新情報](https://www.cryptostream.jp/nem_xem/)

nem自体の情報はこちらが詳しいので、ざっと見ていただけると良いと思います。

この記事ではnemブロックチェーンネットワークから情報を取得するという基本の基本について記述していますが、
これを期に使ってみようと興味を示してくれるエンジニアが増えてくれれば幸いです。

# チェーン上のデータをリクエストしてみる

nemのネットワークを構築しているノードをnem Infrastructure Server(以下NIS)と呼びます。
nemでは、このNISが提供するHTTP APIを用いることでチェーンへアクセスできます。

早速アクセスしてみましょう。HTTPアクセスなのでブラウザで十分です。
とりあえずPoloniex(海外の暗号通貨取引所のこと)のアドレスでも覗いてみましょう。

```
# Poloniexのnemアドレスです
NBZMQO7ZPBYNBDUR7F75MAKA2S3DHDCIFG775N3D
```

以下のリンクを開いてみてください。

## アドレスの情報をみてみる
http://go.nem.ninja:7890/account/get?address=NBZMQO7ZPBYNBDUR7F75MAKA2S3DHDCIFG775N3D

```
{
  meta: {
    cosignatories: [ ],
    cosignatoryOf: [ ],
    status: "LOCKED",
    remoteStatus: "INACTIVE"
  },
  account: {
    address: "NBZMQO7ZPBYNBDUR7F75MAKA2S3DHDCIFG775N3D",
    harvestedBlocks: 36789,
    balance: 3308014502200,
    importance: 0.0013923152222271428,
    vestedBalance: 428886167230,
    publicKey: "2f69c71a7cd584e5f92ff787fb1d68aab53985c577eff6e9061c15768899433c",
    label: null,
    multisigInfo: { }
  }
}
```

## アドレスのトランザクションをみてみる
http://go.nem.ninja:7890/account/transfers/all?address=NBZMQO7ZPBYNBDUR7F75MAKA2S3DHDCIFG775N3D

```
{
  data: [
    {
      meta: {
        innerHash: { },
        id: 1204055,
        hash: {
          data: "9b11fd4600327ea1254c0981d9fd6eee65f58dc68d5e11bad968c333a3dc4f42"
        },
        height: 1383329
      },
      transaction: {
        timeStamp: 83757784,
        amount: 180228000000,
        signature: "53d8a1baddbd9820331fe5cd2a469103034c7c7b065f162b65a9dec0d782d4b6195a3328431751ae718db48ee55def5a7f6e62543d811922f903cf4ec9a5bc0b",
        fee: 19000000,
        recipient: "NBZMQO7ZPBYNBDUR7F75MAKA2S3DHDCIFG775N3D",
        type: 257,
        deadline: 83844184,
        message: {
          payload: "61346566353862353365633362333530",
          type: 1
        },
        version: 1744830465,
        signer: "003489cdc106831b8ea4ac393dd3d30366b9cf8c5b7dbe566459d2183d0e5d65"
      }
    },
    .
    .
    .
```

それぞれ適当に叩いたときの結果です(他意はありません)
アドレスを見ればお察しいただけると思いますが、`address`パラメタに指定したアドレスの情報を取得しています。
また、`go.nem.ninja:7890`がNISノードのアドレスです。

レスポンスはjson形式で返ってきます。Firefoxには整形機能がデフォルトで入っているのでそれを使うと見やすいかもしれません。

レスポンスの内容については、APIリファレンスを確認していただくとして、
ブラウザで開くだけでブロックチェーン上のトランザクションが取得できました。

また、NISはWebSocket接続も提供しており、こちらを使えばリアルタイムな情報やトランザクションを追うこともできます。

複雑なロジックや実装なしに、パラメタを渡すだけという、普段お使いのWebサービスが提供するAPI感覚で、実用的なブロックチェーンネットワークにアクセス出来てしまうのがnemの良いところです。
(他の技術をあまり確認していないので、同じようなコンセプトのチェーンもあるのかもしれませんが)

送金などのトランザクションの発信は少し複雑なトランザクションの暗号化が必要ですが、外部のNISサーバにリクエストする場合に限ります。
ローカルに立てたNISサーバであれば、暗号化無しに送金することもできます。

# 各種言語のAPIラッパー

各種プログラミングにて、プログラムから利用しやすいようにラッパーが提供されています。
HTTPリクエストさえ叩ければ言語やシステムは問いませんが、生のレスポンスを扱うよりは便利にラップしてくれていたりするので
実際に何かアプリケーションを作る場合はこちらを利用したほうが便利でしょう。

* [NIS Wrappers \| RTFM Documentation](https://docs.nem.io/en/nis-wrappers)

コア開発者の提供するライブラリはJavaScript/TypeScriptのものになりますが、他の言語も有志で開発されているものがあります。
もしお使いの言語のラッパーがなければ、利用者拡大のためにもぜひ作ってみてください。

## JavaScript
* [QuantumMechanics/NEM\-sdk: NEM Developer Kit for Node\.js and the browser](https://github.com/QuantumMechanics/NEM-sdk)
* [aleixmorgadas/nem\-library\-ts: NEM Library Official Repository](https://github.com/aleixmorgadas/nem-library-ts)

以下は一例で、他にも有志で開発されている物が沢山あります。nem公式フォーラムにもまとめていますので是非ご覧ください。
[技術・開発向け参考ソースコードや資料リンク \- Japanese / 技術ネタ \- NEM Forum](https://forum.nem.io/t/topic/19254)


## Java
[NEMPH/nem\-apps\-lib: Semantic Java API Library for NEM Platform](https://github.com/NEMPH/nem-apps-lib)

## Python
[semolex/nis-python-client: Python client for NEM NIS API (https://nemproject.github.io). XEM\NEM\Crypto](https://github.com/semolex/nis-python-client)

## Ruby
[44uk/nem-ruby: Ruby gem for communicating with nem network through the NIS API.](https://github.com/44uk/nem-ruby/)

## PHP
[namuyan/NEM\-Api\-Library: An convenient NIS API PHP Library](https://github.com/namuyan/NEM-Api-Library)
[tomotomo9696/NEMTools\_PHP](https://github.com/tomotomo9696/NEMTools_PHP)
[evias/php\-nem\-laravel: Laravel Wrapper for NEM blockchain API](https://github.com/evias/php-nem-laravel)

## C＃
[NemProject/csharp2nem: C# wrapper around NEM apis](https://github.com/NemProject/csharp2nem)

## Kotlin
[ryuta46/nem\-kotlin: Kotlin library for easy use of NEM API\.](https://github.com/ryuta46/nem-kotlin)

## Go
[nem-toolchain/nem-toolchain: Command line toolchain for NEM blockchain](https://github.com/nem-toolchain/nem-toolchain)


# リファレンスなどへのリンク

[技術・開発向け参考ソースコードや資料リンク \- Japanese / 技術ネタ \- NEM Forum](https://forum.nem.io/t/topic/19254)
オープンソースとして公開されているnem関連のアプリケーションやブログ記事などの情報をまとめていますのでぜひご覧ください。
情報提供もおまちしております。

以下、上記からの抜粋ですがまずはみてみると良さそうなリンクです。

[NEM NIS API Documentation](https://nemproject.github.io/)
公式のAPIドキュメントです。

[New Economy Movement\(NEM\) APIマニュアル和訳 \| NEM\_API\_DOC](https://namuyan.github.io/NEM_API_DOC/)
有志による日本語訳版APIドキュメントです。

[NEMTionary](https://scrapbox.io/NEMTionary/)
開発TipsをまとめているScrapboxサイトです。

[NEM Postman API](https://www.getpostman.com/collections/ab85b667e96b6c1ca48f)
[Postman \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja)
Chromeの拡張をインストールしてリンクを開いてください。

[開発者向け NEMデベロッパーガイド](https://rb2nem.github.io/nem-dev-guide/)
英語ですが、もう少し深い情報だったり、開発に関する情報がまとまっています。

[@DaokaTrade/devnem-jpさんはTwitterを利用しています](https://twitter.com/DaokaTrade/lists/devnem-jp)
nemを用いたアプリケーションを開発している方々のTwitterリストです。


# まとめ

私のようなWebエンジニアからしてみればHTTPが叩ければ使えちゃう、という一点だけでだいぶ気楽に利用できるところが良いと思っています。

また、同じ技術・APIでプライベートネットワークを構築できるmijinもあるため、閉じたネットワークを構築したいという要求にも答えられるという点もメリットだと思います。
(このあたりは商用のため、私の方では利用について具体的な情報を得られていないのですが)
[mijin \| \- the Power of the Blockchain \- ブロックチェーン構築プラットフォーム](http://mijin.io/ja/)
[NEMとMijinそしてCatapultの関係とは？](https://blog.nem.io/jp-outlining-the-relationship-between-nem-mijin-catapult/)

しかし、HTTPがゆえに、HTTP/2への対応、HTTPSでないと使えないブラウザの機能(WebRTC等)との相性、IoT環境でのプロトコル(より軽量なプロトコルが必要なのではないか)とか、いくらかの課題もあるとも思っています。

ほかにも、現状ではイーサリアムのようなコントラクトがない点で、アイディアを実行に落とし込みにくいという話もあります。

そのあたりは、リリース予定のカタパルト(ざっくり言うと次期バージョン)にてトランザクションの承認周りが強化されるものとされているので、また面白いアプリケーションが世にでるかもしれません。

ともかく、Web API感覚でブロックチェーンネットワークを利用できるというのは、既存の技術者に対しての学習負荷の低さ、HTTPが枯れた技術であるという点で既存システムへの組み込みがし易いと思います。

質問や相談などは以下の公式フォーラムやtelegramチャンネル、その他Twitterで[\#nem](https://twitter.com/search?vertical=default&q=%23nem&src=typd)ハッシュタグをつければ誰かしら反応してくれると思います。
[Latest Japanese topics \- NEM Forum](https://forum.nem.io/c/japanese)
[Telegram: Contact @nemjapan](https://t.me/nemjapan)

時価の面ではいまいちパッとしないnemですが、触り始めるハードルは低いので、これを読んで触り始めてみたり、何かアイディアを形にしようと思っていただければ幸いです。

# 技術者ではない方へ
Webエンジニアでもなく、ITに詳しくないけどここへ来ていただいた方へ。
nemを利用するにはそれほど新しい技術を必要としないので、いわゆるWebエンジニアを集めれば、すぐにでもサービスの開発に着手することが可能でしょう。

もし、暗号通貨によるサービスを考えていて、どの暗号通貨ネットワークを利用しようか悩んでいるなら、選択肢に加えるに十分な実績と実用性をもった技術ですので是非ご検討ください。
(もちろん技術以外の流動性や換金の利便性も重要でしょうが、それらを高めるためにも是非採用いただけると、nem自体の活性化にもつながることでしょう)