NEMのトランザクション情報を取得してアプリを作る方法



#はじめに

【nemAdventCalendar2019】本家にて
[「ノンプログラマーがNEMブロックチェーン使ってアプリを作ってみた」](https://qiita.com/nembear/items/654173ca03f6c4050349)
という記事を書いたのですが、
実際に私がどの様に作ったのかを、**初心者向け**書いていきたいと思います。
これを見れば、私と同じような**プログラミング経験ゼロ**の方でも、
**「わぉ！NEMって簡単！！」**
となってもらえたら。と願っております。

#自己紹介

日常生活で**コードを触ることも見ることも無い** 仕事をしつつ

[nembear(ねむぐま)](https://twitter.com/nembear)

という名前で、暗号通貨NEM界隈でアート活動をしたりとかイベント開いたりとかしてます。
そんなノンプログラミング人生の人間が、とあることがきっかけで、
**[NEMのブロックチェーンを利用したアプリケーション](https://play.google.com/store/apps/details?id=wallet.nembear.apitest)**を作成しました。

[![header_mdpi - 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/52291268-af51-a39b-4f08-aa29cadc073b.png)](https://play.google.com/store/apps/details?id=wallet.nembear.apitest)



[経緯詳細はこちら(長文注意)](https://nemlog.nem.social/blog/30886)


#作るもの

NEMのブロックチェーン(NIS1)を利用し、特定のアドレスにNEM(XEM)が送金されると
画像が更新されるAndroidアプリの心臓部を作ります。
※心臓部とはつまり、**NEMのトランザクション情報の取得**部分です。
　ここさえ理解すればあとは応用あるのみです。
![F1000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/a02629bd-dc97-6e12-253b-0fa8cec58afb.jpeg)
##準備するもの
● AndroidStudio....Androidアプリの開発環境([AndroidStudioインストールで検索] 
 (https://blog.codecamp.jp/programming-androidstudio-windows))
※AndroidStudioをインストール後、エミュレータを使用可能にしてください。

● NEMウォレットアドレス....自身のNEMを管理するWalletのIDの様なもの
<img width="299" alt="wallet.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/f7a01461-51ae-b701-600d-2db35c0249fe.jpeg">

● NEM(XEM)....[暗号通貨NEM](https://www.cryptostream.jp/nem_xem/)。今回はこちらの送金をトリガーとして画像を切り替えます。


###NEMウォレットアドレスを所持していない場合
**アドレス非所持＝NEM(XEM)非所持**だと思われますので、その場合は
①：[**nemgraph**](https://nemgraph.net/)からアカウントを作成ください。
　（設定後、プロフィール画面からアドレスを確認することが出来ます。）
②：nemgraphは写真をUPするとユーザから「いいね」と同様にNEM(XEM)を貰える可能性が高いので
　 NEM非所持の方はこちらから入手することをおすすめします。(1NEM取得で充分です。)


#アプリ作成開始

ここからは僕の数か月間を1時間以内にまとめます。
沢山の謎が出てくることでしょう。ですがここの正義は素直さです。
これどうなってるの？は後に回して、素直に突き進んでくださいませ！！

##①：AndroidStudioを起動しよう
● 「Start a new Android Studio project」をクリック
<img width="800" alt="1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/96a9401d-e394-16e0-24e2-efab27affe41.jpeg">
● 「Empty Activity」⇒「Finish」をクリック
<img width="800" alt="2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/8aa665d8-9ab8-cc86-8a66-67dc88403184.jpeg">
● 「Name」⇒ ここでこのアプリの名前を入力します（好きな名前でOK）
● 「Language」⇒ 「Kotlin」を選択しましょう
● 「Minimum API level」⇒ 「API25:Android 7.1.1(Nougat)」を取り合えず選択しましょう
⇒上記を設定後に「Finish」をクリック
<img width="800" alt="3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/ca56b121-837d-9188-e565-38f2b99fbfcc.jpeg">
● 「Build Output」⇒ こちらが下記の様になっていれば準備完了
※ここまでは調べればいくらでも出てくるので、うまくいかなかった場合も安心して検索ください
<img width="800" alt="5.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/82b53210-4b9a-937e-88a1-fc16f7266d98.jpeg">

##②：[nem-kotlinライブラリ](https://github.com/ryuta46/nem-kotlin/blob/master/README.ja.md)をセットアップしよう

● `implementation 'com.ryuta46:nem-kotlin:0.5.0'`を
「build.gradle(Module：app)」内に入力します。(**たったこれだけでOKです**)

```kotlin:build.gradle(Module.app)
implementation 'com.ryuta46:nem-kotlin:0.5.0'
```
※実際に入力した位置はこちら

```kotlin:build.gradle(Module.app)
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
//  ↓ここに入力しました。
    implementation 'com.ryuta46:nem-kotlin:0.5.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
```
● 入力後は「Sync Now」をクリックして更新をかけましょう
<img width="800" alt="7.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/5c542323-c02d-a166-a9a5-d63ff823e8aa.jpeg">


##③：androidをインターネットに接続するための設定しよう
● `<uses-permission android:name="android.permission.INTERNET" />`を
「AndroidManifest」内に入力します。

```kotlin:AndroidManifest
<uses-permission android:name="android.permission.INTERNET" />
```
※実際に入力した位置はこちら

```kotlin:AndroidManifest
 </application>
   <uses-permission android:name="android.permission.INTERNET" />
</manifest>
```

##④：NEMのAPIクライアントをセットアップしよう
● `val rxClient = RxNemApiClient("http://62.75.251.134:7890")`を
「MainActivity」内に入力します。

```kotlin:MainActivity
val rxClient = RxNemApiClient("http://62.75.251.134:7890")
```
※実際に入力した位置はこちら

```kotlin:MainActivity
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

//        NEMのAPIクライアントをセットアップする
        val rxClient = RxNemApiClient("http://62.75.251.134:7890")
    }
```
※あれれ？「RxNemApiClient」が赤字になっているよ？ですって？どうやらこの世界は、
　新しいものを使うとき「これを使うよ！」って教えてあげないといけないらしいです。
　方法は赤字箇所で**「Alt+Enter」⇒「import」**です。
　このようにandroidStudioが教えてくれるのでとても助かりますね。
<img width="800" alt="alt+enter.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/08bbf492-29ac-3770-b5f6-bd8a71e39a10.jpeg">

**※ポイント※**
これだけでもう何時でも、**NEMのトランザクション情報その他を取得できます**。
次からは取得方法を一気に記載しますが、何も考えず。結果をお楽しみください。

##⑤：NEMのTransaction情報を取得しよう
● 指定したNEMウォレットアドレスからNEMのトランザクション情報を取得します。
　そして取得したトランザクション情報から「id」を取得します。
**※ポイント※**
`private const val ADDRESS = "準備したNEMウォレットアドレス"`を入力してください。


```kotlin:MainActivity
//        指定したアドレスのNEMトランザクション情報を取得する
            rxClient.accountTransfersIncoming(ADDRESS)
                .subscribeOn(
                    Schedulers.io()
                )
                .subscribe { trasanctionList ->

//        NEMトランザクション情報内の「id」を取得する
                    val id = trasanctionList.get(0).meta.id
                    Log.d("TAG", "${id}")
                }
    }

//        アプリで使用するNEMウォレットアドレスを登録する
    companion object {
        private const val ADDRESS = "NAQQYNBXV7PDGRS3O6IE2A7E4RN2KN2B5SADYUSU"
    }

```
※実際に入力した位置はこちら
**※ポイント※**
先ほどと同様に、赤字で表示されてしまう箇所（`Schedulers`と`Log`）は
**「Alt+Enter」⇒「import」**で導入しましょう。
下記は「import」済み。

```kotlin:MainActivity
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

//        NEMのAPIクライアントをセットアップする
        val rxClient = RxNemApiClient("http://62.75.251.134:7890")

//        指定したアドレスのNEMトランザクション情報を取得する
            rxClient.accountTransfersIncoming(ADDRESS)
                .subscribeOn(
                    Schedulers.io()
                )
                .subscribe({ trasanctionList ->

//        NEMトランザクション情報内の「id」を取得する
                    val id = trasanctionList.get(0).meta.id
                    Log.d("TAG", "${id}")
                })
    }

//        アプリで使用するNEMウォレットアドレスを登録する
    companion object {
        private const val ADDRESS = "NAQQYNBXV7PDGRS3O6IE2A7E4RN2KN2B5SADYUSU"
    }
}
```
##⑥：取得したNEMのTransaction情報を確認しよう
● 下記画像の30行目の隣の部分をクリックしてください。赤丸が出てきたらOKです。
　次に、右上のDebugボタンをクリックしてください。
<img width="800" alt="debug.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/811a884f-b694-7d9e-ff42-0a59a3f08953.jpeg">
● androidStudioのフッター部「Debug」をクリックし、「transactionList」の「▼」をクリックします。
<img width="800" alt="debug2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/ea0cf70e-aeeb-244d-ef21-52ec80d30f0a.jpeg">
**※ポイント※**
おめでとうございます！
あなたが設定したNEMアカウントの**トランザクション情報が過去25件**表示されています。
次に直近のトランザクション情報から「id」情報を見てみましょう。

下記の画像の通り、「0」をクリックし「meta」をクリックします。
すると「id」が表示されてますね。（ここでは「7290178」）
<img width="800" alt="debug3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/5daf53d9-7a17-0c9f-c551-e933e026d138.jpeg">

**※ポイント※**
突然ですが、これで私のアプリの心臓部は完成です。
つまりは、ここで取得した「id(以降id1)」を保存し、再度取得した「id(以降id2)」と比較し
**「id1≧id2」の場合は、更新されていない(入金されていない)**ということになります。
**「id1＜id2」の場合は、更新されている(入金されている)**ということになります。
更新されている時だけ、画像を更新させることで、アプリが完成されるわけです。
凄く簡単な設計ですよね（笑

試しに、指定したアドレスにXEMを0XEMで送金してみてください。
1分後ぐらいに、再度debugをしてみましょう。
直近のトランザクションの「id」が更新されていることが分かると思います。
そのタイミングで画像が更新されるように設計してみてください。
「F-1000」が完成します。
![F1000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/36982f61-bdb5-8a79-b5d3-87a29968e019.jpeg)


#まとめ
いかがでしたでしょうか？
一番ややっこしそうな（検索しても出てこなさそうな）NEMブロックチェーン部分が
たった**6STEP**(STEPというかコピペ)で実装できました。

そろそろ言いたくありませんか？

**「NEMめちゃくちゃ簡単かも！」**と。

その気持ちがあるうちに、NEMアプリ開発を始めましょう！
トランザクション情報には他にも
「送金数」や「メッセージ」その他もろもろ格納されています。

ということは、

秘密のメッセージを送った人だけがみれる画像とか
（これってリアル脱出ゲームとかで使えそう）

指定した送金数の時だけ起動する何かとか

すでにもうその辺を作れるってことです、皆様は！！

あとは発想と行動と好奇心のみです。

今更100万人に愛されるアプリを考えようと意気込むよりも
**自分の周りの10人を楽しませるアプリ**を作ることがこれからの正義です。


長文駄文失礼いたしました。
ご質問はいつでも[**こちら**](https://twitter.com/nembear)でお待ちしております。

ありがとうございました。

#お知らせ

##『NEMberアンケート2019』
締切：2019年12月23日(㈪)
アンケート内容：
①今年のNEM漢字
②今年頑張ったNEMber
[**★アンケートはこちらから☆**](https://forms.gle/fef9hBMxPzo1JNsZ9)

去年に引き続き、NEMberアンケートとなります。
ちなみに去年のNEM漢字は「耐」でした。
今年はどうなるのか？是非是非、ご回答くださいませ！！

##『大熊呑み2019』
開催日：2019年12月23日(㈪)
場所　：原宿某所
主催者：[**ねむぐま**](https://twitter.com/nembear/status/1204334829468151814)
継続こそ力なりってわけで、今年もダラダラやります。
NEMが気になるなら誰でも参加OKな、BBQ＆コワーキング＆LTイベント。
平日なのに11時～24時まで開いてますので。
夕方まではコワーキングスペースで勝手に仕事しててください。
夕方からはBBQを勝手にやってください。
僕はそれを見ているのが好きです。
これを見ているあなた様お気軽にいらしてください！！
<img width="368" alt="IMG_0547.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217292/06ee0dbb-d57f-74ea-c02e-dbd383d0730b.png">

##『nemセミナー2020（仮）』
開催日：2020年1月19日
場所　：都内の素敵な会場手配中
主催者：[**ちゃんかま**](https://twitter.com/kamatsukachan)
何だかものすっごい布陣がNEMのあれこれを教えてくれるイベントだそうですよ！
私もLTやります.....（まさかここまで強い布陣だとはつゆ知らず）