Edited at
nemDay 17

nem-sdk を使ったアプリケーションを速攻作る。

More than 1 year has passed since last update.

アドベントカレンダー全然間に合わないマンなので、急いでアプリケーションを作りました。

スクリーンショット 2017-12-18 1.05.18.png

取りあえず動くところまで作っただけなので、react としてはクソ適当な実装になってます。週末 redux 入れてきれいにします。

him0/nem-joya: ごーん

まだ完成していないので、年末までには出す。


環境

NodeJS (v8.9.0)

create-react-app (1.4.3)

yarn (1.3.2)


Webpack 使えば、フロントでちゃんと動くよ

$ mkdir nem-application

$ create-react-app nem-application
$ yarn add nem-sdk

ES6 で、NEM-SDK を利用する場合は今感じで、インポートして使う

import nem from 'nem-sdk';

Web API からブロック高を取得するのはこんな感じになる。

Web API を利用する場合は、port 指定で、nem.model.nodes.defaultPort を指定する。

const objects = nem.model.objects.create('endpoint');

const apiEndpoint = objects(nem.model.nodes.defaultMainnet, nem.model.nodes.defaultPort);

nem.com.requests.chain.height(apiEndpoint).then(response => {
this.setState({ blockHeight: response['height'] });
});

Websocket でブロック高をストリーミングで取得する。

Websocket を利用する場合は、port 指定で、nem.model.nodes.websocketPort を指定する。

Websocket が接続されて、新しいブロックが来ると callback が実行される。

address の指定は、transaction のストリーミングをする際に、指定したアドレスに関係するトランザクションのみを取得するために指定する必要がある(負荷対策?)。

const address = 'NBBNC2K72UDIN5HMRAEUWJ4F22RZPQL2LYONUDET';

const websocketsEndpoint = objects(nem.model.nodes.defaultMainnet, nem.model.nodes.websocketPort);
const websockets = nem.com.websockets;
const connector = websockets.connector.create(websocketsEndpoint, address);

connector.connect().then(() => {
websockets.subscribe.chain.blocks(connector, response => callback);
});


初期値は、API で更新は、Websocket でするのが良さそう

ストリーミングの API が流れてくるのは、新しいブロックが確定したときなので、まずは、Web API の方が取得 -> Websocket で流れてきたら、更新するという方針が良さそう。

ブロック高取得している実装を参考にしてもらうと良いかも。


Websocket でトランザクションを検知

2017-12-18 の時点で websocket で unfonfirmed のストリーミングに繋いでみたが全然流れてくる気配が無かった

(NIS のソースコードが公開されていないのでこういうときに推論になってしまうのが、NEM の良くないところ)。

connector.connect().then(() => {

websockets.subscribe.account.transactions.recent(connector, response => callback);
websockets.subscribe.account.transactions.unconfirmed(connector, response => callback));
});

今回は、ブロックに取り込まれたトランザクションがわかればよかったので、chain/heigh のストリームに含まれる、transaction を見る感じで対応した。

websockets.subscribe.chain.blocks(connector, response => {

if (response['transactions'].some(tx => tx['recipient'] === this.address)) {
// いろいろ
}
});


Web サーバにステイトレスにする工夫するとブロックチェーンでやる意味が少し出てくる

サーバで情報保持しようと思ったら自前でストレージ用意するか、AWSか何かにお金をかけることになるのですが、ブロックチェーンだと勝手に利用者がストレージの代金を払ってくれるので良いですね。しかも、永久的に消失しないストレージという点もよいですね。

最終的には、あと何回叩くと108回なのかカウントしたいが、そのあたりをDBで対応するのではなく、nem のブロックチェーンでカウントするようにしたい。具体的には、指定のブロック以降に何回トランザクションがあったのかをそのカウントにベースにしたい。


モザイクで、動くXXXっての出てきてるけど...

結局トランザクションの内容を見ればいいだけの話なのですよねー

開発してる人はわかると思うけど、結局ブロック高取るのと特定のアドレスのモザイクの所持状態取得するの同難易度で、意味ないなーと思うとやる気でない。

やるとしたら、鐘叩いたらもらえる108のトークンとか作って配ってもいいかな?要望あるならやりますけど、どうだろう。

やるなら、サーバサイドでも、ブロックチェーン監視する形になりますね。


遅れてごめんなさい

年末までには、体裁整えて遊べるようにしておきます。煩悩消し去ってこ。

実装更新したら続編書きます。