nem.core カスタマイズについて

Takanobu ()
そろそろみなさん、mijinを自由自在に扱いたくなって nem.coreに手を出し始めているころだと思います。
私たちも「ミジンコ(R)」というというnem.coreラッパークラスを開発し、送金テストを始めています。
(このプログラムについては外部協力者がいるので、当面のあいだ公開は遠慮させてください。)

このスレッドではnem.coreを使ってmijinと通信するにあたり、不明な点、TIPSなどを共有できればと思います。

Takanobu ()
mosaic の所有と定義について

おそらく、手数料の計算とか面倒になってきて、nem.coreで計算したい人も多いかと思いますが、
悩まされるのが、mosaic の定義と所有の違いです。

/account/mosaic/owned で検索すると nemの情報も出てくるのですが、
/namespace/mosaic/definition/page で検索しても nem の情報は出てきません。

ここは大きな違いになります。
将来mosaic と一緒にxemを送金したいと思うようになる(ハズ)なのですが、
供給量のデータを持つ /namespace/mosaic/definition/page でnem が出てこないために、
nem.core のライブラリをそのまま使うことができません。
供給量が分からないと手数料の計算ができないのです。

どこかに定義されてないのでしょうか?

見つけました。

package org.nem.core.model.mosaic;
MosaicConstants

このクラスに誰かさんの アカウントから xem の定義を引っ張ってくる情報が載っています。
ただし、コメントに
// TODO 20150813 J-*: we need to make these accounts multisig before moving to mainnet

と書いてあるので、将来的に情報が変更になる可能性もあります。

ご参考まで。

Takanobu ()
所有mosaicへのアクセスについて

現在、mosaic 残高を参照するプログラムを書いていますが、
nem APIによると、所有モザイクは配列で返ってきます。

namespaceId mosaicId と固有なアクセス手段があるにもかかわらず、
直接参照ができず、配列で取得したものを順次探索しなければなりません。

今後たくさんのnamespaceやmosaic を作成した場合に、
所有するmosaicをリストでしか受け取れないのは
サーバ側にも負荷がかかってくる話かと思いますが、
技術的に何か理由があるのでしょうか?

Takanobu ()
NEM API 、便利なんですけど コマンドたたく前に手数料計算、暗号化、署名、シリアライズとやることが多すぎてそのあたりで挫折してしまう方が多いのでは?と思います。
(バリバリのアーキテクト系ではなく、アイデアはあるのにというアナリスト、ストラテジスト系の方を想定してます。)

ミジンコ(R) はそういった方のために、String、Listベースの組み合わせで mijinにアクセス出来てしまう超便利なnem.coreラッパーライブラリです。
直近での公開はまだ予定しておりませんが、同じようなものを作ろうとしてハマっている等などありましたら、ご相談ください。

Takanobu ()
node間における所有mosaicのズレを確認

自明ではあるのですが、とりあえずの確認ということでやってみました。
実証実験用に与えられた4つのノード(IPアドレス)に対し、1秒ごとに
/account/mosaic/owned
で残高を確認。その間、mosaicの送受信を高速に行いました。
結果、およそ最長1秒間にわたり、異なる残高を表示することを確認しました。
最長1秒ではありますが、提供されている環境で発生したのはごくまれです。

上記APIでの残高確認はトランザクションを発生させないので、
得られるデータの内容には差異が出て当然ですが、念のため。

Takanobu ()
今日は実証実験のための簡単な検証を行います〜。無料プランでどこまで負荷に耐えられるか(汗。報告できる ようになったらまたお伝えします。

Takanobu ()
nem.coreの制約が思いのほか強いことに今さら気づく。
基本的な実装は完了しているのに、発展させようとするとインターフェイスを全部書き換えないといけない。

そこが良いところなのかもしれないけれど。。。アイデア実践レベルではちょっとカロリー高めの作業が多いです。
でも手数料計算とか署名、シリアライズ、とかは楽チンなんですけどねぇー。悩ましい。

実証実験終了まであと1ヶ月。
ピ、コ、ピ、コ…

Takanobu ()
マルチシグ作成時にかかる秒数について

マルチシグを生成・追加するとき、たまに
org.nem.core.connect.BusyPeerException: java.net.SocketTimeoutException
が発生します。

これは、nem.core 内でsocketTimeout が10秒に設定されているためです。
ブロックタイムと関係あるのかどうか分かりませんが、マルチシグを生成・追加する場合は10秒以上かかることもある、
と考えておいたほうがよいかもしれません。

Takanobu ()
手数料計算や暗号化、トランザクション処理など便利な機能がそろっているnem.coreですが、
クライアントとして利用するためにはどうしても邪魔なロジックが一か所あります。

/nem.core/src/main/java/org/nem/core/model/VerifiableEntity.java の 160行目あたり。

Signature.writeTo(serializer, "signature", this.getSignature());
この部分をコメントアウトすることで、nem.coreをmijinクライアントとして利用することができます。
お試しください。