NEMアプリ開発の実際

# はじめに

12/10に開催されたCOINAGEさん主催のイベントで「NEMアプリケーション開発の実際」というテーマで登壇させて頂きましたが、その時の内容をベースに加筆・修正、自分の思いを追加した内容となっています。

# ブロックチェーンに出会ったきっかけ

自分がブロックチェーンに踏み込んだきっかけは前職の時に、ブロックチェーンのラボが立ち上がってそこに参加したのがきっかけでした。(2017年5月頃のお話です)
その時は暗号通貨に使われている技術程度の認識しかなかったですが、新しいことができるチャンスだと思い入り込んでいきました。

# スマートコントラクトに未来を感じたが...

ブロックチェーンのラボが立ち上がって、自分が最初に触ったのはEthereumでした。
当時出ていた本や記事を参考にしながら、オレオレトークンセールなどを作って試してました。

○○○を満たしたらxxxに送金するといったコントラクトをチェーン上に載せることで、お金(暗号通貨)を動かすことができることに未来を感じ、一種の興奮すら感じましたが、一方である種の恐怖すら感じました。

その恐怖は、一度チェーン上にデプロイしたコントラクトは**おいそれと修正できない**ことに起因するものでした。
不具合を修正するのが非常に困難なのは、プログラマとしては非常に恐怖で、実際、不具合が原因で億単位のお金(暗号通貨)がロックされて引き出せなくなった事件も耳にしていたので、当時の自分はこれを使って何かするのは恐怖だし、人間には早すぎるではないのかすら思っていました。

# WEB開発とコントラクト開発の違い

前職では主にスマホアプリの開発やWEBアプリの開発に携わっていましたが、これらの開発とコントラクト開発には以下の違いがあると感じました。

|WEB・スマホアプリ開発|コントラクト開発|
|-----|------|
|本番リリース後の修正・機能追加は比較的容易|本番リリース後の修正・追加は困難|
|テストを行ってリリースするが、リリース後も随時機能追加・修正を行う|リリース後の修正は難しいためリリース前のソースの公開・監査・修正を行い限りなく**完璧**にしてリリースする|

コントラクト開発は今までの開発スタイルと比べるとかなりギャップが大きいと感じました。
ここでもコントラクト開発の難しさを感じました。

# NEMとの出会い

Ethereumはすごいけど、これを使ってビジネスやら何かするのは恐怖だし、早すぎると感じていたわけですが、ここで諦めては...と思っていたところで、(自分にとって)**ちょうどよさげな**ブロックチェーンとしてNEMに出会いました。

# NEMの特徴

NEMを使ってアプリを開発するという意味で、NEMに以下の特徴があります。

* コントラクトを書けない
  * できることが*制限される*一方で、その分**堅牢**であると考えられる
* ブロックチェーンを活用する上で、備わっているとよいと考えられる機能が**プロトコルレベル**で備わっている
* 組み込まれている機能はWEBAPIを介して使うことができる

# NEMに備わっている機能

現行のNEMに備わっている機能としては大きく以下の機能があります。
NEMを使ってアプリを作る場合、以下の機能を組み合わせて開発します。

* ネームスペース(ドメイン)機能
* モザイク(トークン)発行・送信機能
* マルチシグアカウント
* メッセージング機能

機能についての以前、詳細に触れた記事を書いたので以下の記事を参考にしてください。

* [NEM/mijinで備わっている基本機能
](https://qiita.com/daoka/items/312cbe98c298e3364810)

# NEMを使ったアプリケーションの開発

NEMを使ったアプリケーションの開発としては、自分は主にApostille(アポスティーユ)を使ったサービスをメインに取り組んでいます。
実際に取り組んでいるものをもとにどういう感じで作っているか紹介してみようと思います。

## Apostille(アポスティーユ)とは

ApostilleはNEMを使ったタイムスタンプ公証です。
ファイルのハッシュ値をブロックチェーンに刻むことで、以下のようなことを証明することができます。

* ファイルが(少なくとも)いつから存在しているか
* 誰の手によって承認されたか
* ファイルがその時から改ざんされていないか

<img width="813" alt="スクリーンショット 2018-12-17 10.00.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/8fd06e2f-f1a6-4f6b-2ff4-0b95d630a666.png">

ユースケースとしては検定の合格証明や契約書・議事録の承認、それらの改ざん抑止が期待されます。

## OpenApostille

[OpenApostille](https://www.openapostille.net/)はNEMのWalletの1つ、[NEMWallet](https://nem.io/downloads/)で作成したApostilleを気軽に公開できるサービスで、2017年9月に個人的に作成したサービスです。

最近は、NEM財団のウクライナチームが、[小児がんの子供のための施設への寄付の書類の公証・公開](https://cryptoheroes.team/en.html)に使うなど公に使われ出しています。

## OpenApositlleの構成

<img width="894" alt="スクリーンショット 2018-12-17 10.15.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/a3c3b039-b39e-dbe6-2570-1f1b72788aad.png">

OpenApostilleは上記の様な構成となっていて、青色の背景部分がOpenApostilleの部分となります。
OpenApostilleは以下の様なことをしています。

* heroku
  * sinatra (ruby製のWebフレームワーク) 
     * Apostilleデータの解析、NEMのネームスペースの取得など 
* AWS
  * S3
     * Apostille済みのファイルの保存、証明書ファイルの保存 
  * DynamoDB
     * メタデータの保存 
  * Lambda 
     * サムネイル・モザイクギャラリー用の画像の作成 

rubyでNEMのAPIを叩いてネームスペースを取得している以外は、ほとんど既存のWebアプリ開発と同じようなことをしています。

## 汎用アポスティーユサービス

現在、自分が開発を進めている汎用アポスティーユサービスでは以下の様な構成にしています。

<img width="897" alt="スクリーンショット 2018-12-17 10.29.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/9315/5582c828-dedb-805a-ff67-8e75da50820f.png">

サーバレスアーキテクチャを採用して、ロジック部分はAWS Lambdaで実行し、API Gatewayを介して他のサービスとの連携などを行うような構成となっています。
NEMのAPIとの連携は、[NEM Library](https://github.com/NemProject/nem-library-ts)というTypeScript製のライブラリを使っています。

NEMのブロックチェーンに載せられないファイルの実ファイル・メタデータなどはS3やDynamoDBで保存しています。

# NEMアプリケーションの実際

実際にNEMを使ったアプリケーションを開発してみて、以下の様なことを感じました。

* NEMの利用部分はAPIやライブラリを使って行うので**その部分の実装はあまり時間がかからない**
* NEMの機能をどう使えるか・どうやって使うのか**検討・設計の方が時間がかかる**
* 既存のWeb開発と**同じ要領で開発できる**のは楽

# どうやってNEMを使っていくのか

実際にNEMを使ったアプリを作ろうとした場合、どういうことを考えればよいかのポイントは以下の様になります。

* どこに適用すると**メリット**があるか考える
* 全てをNEMに任せる必要はない(というかできない)

# NEMを使うとよさそうなところ

他に色々なユースケースがあると考えられ、あくまで一例に過ぎませんが、個人的には以下の箇所に適用するとNEMやブロックチェーンのメリットが生きていくと感じています。

* データの信頼性が必要な所、監査が必要な所
* ものの流れがあるところ

# NEMを使った開発をしたくなったら

NEMを使った開発をしたくなったら以下のリンクを参考にしてみるといいと思います。

- NEM API仕様書(英語): https://nemproject.github.io/
- NEM API仕様書(和訳): http://i-yusuke.com/entry/nem-nis-api-document-japanese/
- NEMテクニカルリファレンス(英語): https://nem.io/wp-content/themes/nem/files/NEM_techRef.pdf
- NEMテクニカルリファレンス(和訳): http://nemmanual.net/NEM_Technical_reference_JA/
- NEMフォーラム: https://forum.nem.io/t/topic/19254
  - 雑多な感じですが、 NEMの開発に関する役立つリンクがまとまっています。また分からないことがあればここで質問すると有志の方が回答してくれるので、何かあれば是非投稿してみてください。

# まとめ

NEMは数あるブロックチェーンの中でも比較的使いやすいものだと思います。
NEMでできることはEthereumでもやろうと思えばできますし、それを使うのも全然ありですが、自分でコントラクトを書き、不具合の怖さを感じながらリリースすることを考えると、楽に安心して使える手段があるならそれを使うのも手の一つだと思います。

既存のノウハウを使って、ブロックチェーン活用できるNEMがあるというのを知って、検討してもらえたらうれしいです。