nem2.slackで上がった話題の覚え書き

slackだと消えてしまうのでメモしておきます。検索に引っ掛かりやすいように冗長にまとめています。
詳細は [nem2-slack#japanese-日本語](https://app.slack.com/client/T9EAN12HX/) へ。ぜひご参加ください。

# 最新のステータス（都度更新）

catapult-server 0.9.3.2 - 19-March-2020
symbol-cli (0.18.4)
デスクトップウォレット v0.9.6-beta1
蛇口 http://faucet-01.symboldev.network/
symbol-testnet-bootstrap 0.9.3.2-beta1

public-launch-dependencies
https://github.com/nemtech/NIP/blob/master/NIPs/nip-0008.md#public-launch-dependencies



# 解決済みQ&A

- data/ ディレクトリのブロックデータ(連番ディレクトリ)だけ共有したら、ブロックデータの同期って短縮できんのかな

docker-compose.yaml を見ると

```
  db:
    image: mongo
    command: bash -c "mongod --dbpath=/dbdata --bind_ip=db"
    stop_signal: SIGINT
    volumes:
    - ./utilities/bin/bash:/bin-mount
    - ./data/mongo:/dbdata:rw
```

とあるので、 data/mongo にデータが入ってそうですね。セットで移植すればいけると思います。(他のコンテナの動きが余計なことをしなければ)
あとは、brokerプロセスのコンテナ以外を動かした状態でブロックを同期させると、data/spool の中にデータベースの変更記録が溜まっていくので、それを移植用のデータとして data  だけ移植する手も行けると思います。移植先でbrokerを動かせば data/spool の中身を読み込んでmongoDBをそこで構築してくれます。


- dockerがうまく動かないときの再設定
    - 1. サービスすべてを停止する
    - 2. Dockerイメージのキャッシュクリア（docker system prune -a）
    - 3. 既存のリポジトリの内容を削除
    - 4. 再ダウンロードしてpeer-assemblyまたはapi-harvest-assemblyのいずれかを立ち上げなおす

- 送金時の手数料計算について
    - feeMultiplierがブロックの情報にあるので、これとトランザクションサイズの積が手数料として算出できます。
    - TransactionHttpのgetTransactionして、Transaction.serialize()して、先頭8バイトからサイズを得るか、文字数/2でサイズを得る。



- 昔のトランザクションに書かれたAliasがどこに結びついてるか
ポインティング時間（高さ）で正しいエイリアス解決を取得する唯一の信頼できる方法は、 `Receipt`（解決ステートメント）を使用することです。名前空間の有効期限が切れているか、エイリアスリンクが削除または再リンクされているためです。残りの名前空間エンドポイントを使用すると、現在のリンクのみが提供されます。最新のSDKバージョンでは、 `Transaction.resolveAlias`を実行するか、レシートクラスから実行できます。
カタパルトホワイトペーパー7.2.3を確認してください

- EmptyMessage (じつは空文字) を添付すると、メッセージサイズが1byte、PlainMessage(“A”)を添付すると2byteになっちゃう
    - メッセージは1023byteまでしかセットできない

- ネームスペースの有効期限が指定された通りに設定されていない endHeight
    - endHeightは指定されてdurationに猶予期間を追加して設定されます。(現在8日間)

- stateHashの計算
    - https://mijinc0.github.io/blog/post/20190508_catapult_cache/
    - https://qiita.com/planethouki/items/3f7a235de3fb347bcb4d

- ノードの推奨メモリ(8GBだとすぐにパンパンになってしまう)
    - 経験則として50GBぐらい？
    - プライベートテストネットの作成（HD: 20GB 以上）
        - https://nemtech.github.io/ja/guides/network/creating-a-private-test-net.html

- https の設定フロー
    - Add Https to an NIS Node on Debian
        - https://blog.nem.io/https-nis-node/
    - httpsプロトコルに応答するNISサーバの構築
        - https://blog.44uk.net/2017/10/31/nis-with-https-by-dehydrated/
- UInt64の比較
    - Long モジュールでラップして、その比較メソッドを使う
    - https://github.com/nemtech/nem2-sdk-typescript-javascript/commit/9d16d1bee8fe2e21593b387fb398500e1088a831#diff-7fbee694ff5225a0aed2f6336a71fc24R145

- restのエラーコード
    - 32bit signed integer
        - 参考 https://www.binaryconvert.com/result_signed_int.html
    - コード一覧
        - https://github.com/nemtech/catapult-rest/blob/master/catapult-sdk/src/model/status.js
        - -2143092733
            - case 0x80430003: return 'Failure_Core_Insufficient_Balance';



Failure_Core_Insufficient_Balance

- catapult-service-bootstrap(0.8.0.3)で起動すると以下の4つのイメージ以外はExit
    - docker_peer-node-1
    - docker_peer-node-0
    - docker_api-node-0 
    - mongo
        - Macの再起動、clean-all で立ち上げ直しを何度か繰り返したらうまくいった

- websocketが切断される
    - `setInterval(function(){listener.newBlock()}, 30000);`

- nem2のrest apiを知りたい。ドキュメントの場所は？
    - https://nemtech.github.io/endpoints.html

- maxFeeとは？
    - similar to ETH gasPrice
    - 「高速」、「通常」、および「低速」（最低料金）のビットコインのようなアプローチを採用
        - txを確実に通過させるために高い料金がかかる
    - 集約トランザクションのmaxFeeはブロックに取り込んでもらう優先度の指定だからAlice分を設定するだけでいい。その他のアカウントが支払う手数料は固定という認識。



- transaction merkle proof path の取得方法
    - https://github.com/nemtech/catapult-rest/blob/master/rest/src/routes/routeUtils.js#L280

- mosaicの有効期限
    - nem2-sdkでcreateの時だけ指定できる？

- maxMosaicsPerAccountについて
    - total number of unique mosaics that can be held by a single account

- フォークについて
    - カタパルトのノードでは、フォークを検知した場合に Remote_Is_Forked といったエラーメッセージが出る
    - カタパルトでは、そのフォークブロックから maxRollbackBlocks を超えていると、ロールバック不能と判定して Remote_Is_Forked のエラーになると思います。



# tips


peers-p2p.jsonを作るスニペット
`curl -s http://cat-testnet.44uk.net:3000/node/peers | jq '.[] | {publicKey:.publicKey,endpoint:{host:.host,port:7900},metadata:{name:.friendlyName,roles:"Peer"}}' | jq -s '{knownPeers:.}'`

ブロック高抜く方法

`echo "ibase=16;$(cat data/index.dat | xxd -p | fold -w2 | tac | tr -d '\n' | tr '[:lower:]' '[:upper:]')" | bc `

- httpの取扱は気をつけましょう
    - https://gist.github.com/mijinc0/daf9389d4feed95e8bddeebd0e3f1846
- https対応
catapult-testnet-bootstrap にhttps-portal と組み合わせてみたら
docker-compose で立ち上げるだけでhttpsも対応できるようになりました。
https://github.com/44uk/catapult-testnet-bootstrap/tree/with-https

- タイマー送信
アグリゲートトランザクションにトランスファーとシークレットロックを組み合わせるとそれっぽいのができる
A->Bへの予約送金とした場合。
・A->Bへのトランスファー
・B->Aへのシークレットロック
をアグリゲートトランザクションにする。
シークレットプルーフが送信されない限り、シークレットロックの期限切れ後にBは金額を手に入れることができる。
Aはシークレットロックの期限が来る前にシークレットプルーフを送信することで、予約をキャンセルすることができる。
ただしこの方法では、アグリゲートトランザクションにBの連署が必要。

- 手数料0の設定方法


```
config-network.properties
defaultDynamicFeeMultiplier = 0

config-node.properties
minFeeMultiplier = 0
```


-　手数料算出
    -　https://docs.google.com/spreadsheets/d/13lChbSsJM6vzSKN_-7apTpOBvxnj2y1AKCCVIA95c3A/edit?usp=sharing

- トランザクションのmeta.idからタイムスタンプを取得する方法。
    - `new Date(parseInt("5DCDF3DFD6BF426D103A1C11".substring(0, 8), 16) * 1000);`
    - 参考：https://steveridout.github.io/mongo-object-time/




- 同じfeeMultiplierを設定する同じ内容のアグリゲートトランザクションを、AggregateBonded+CosignatureとAggregateCompleteで作り分けた場合、連署分のサイズが削減できる分、ボンデッドの方がお得

- rxjsの挙動について
    - https://rxmarbles.com/


# issue済み


- nem2-sdk ts (0.14.3) の Convert.d.ts の中に decodeHex 関数が無い
    - https://github.com/nemtech/nem2-sdk-typescript-javascript/issues/317

- トランザクション履歴のフィルタリング機能が欲しい
    - https://github.com/nemtech/catapult-rest/issues/166#issuecomment-546428928

# 検討中

- トランザクションの履歴をhashでさかのぼれない。
    - そもそもhashでさかのぼるべきかどうかという議論。仕様チームで検討中。




# 既知の現象

- 急にbrokerだけ起動しなくなってしまった
- ブロック生成が止まる
    - マルチレベルマルチシグの実験中に再現
- angularにつおい人、webpackの設定をちょこっといじんないとnem2-sdkがビルドできない
- Fushicho2のトランザクションがアナウンスできない
- 手持ちの資産がmaxFeeより少ないとノードからBANされる
- モザイクの順序間違えたときのエラーでbanされる

- fushicho2対応のnem2-sdk (0.15.0)でaggregate compleat txを投げるとunconfirmedAddedとconfirmedのlistenerがパース中にこけているのか切れてしまっている

CPUがAVX2の拡張命令に対応していないと起動できないようです。
intelのCPUではHaswell以前のCPUでは起動できないようです。
例えば AWS m3.medium などが該当します
(Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz)
dmesgにこのようなエラーが出ている場合これに該当すると思われます
[ 2181.578673] traps: catapult.server[11543] trap invalid opcode ip:7f120b7c24e5 sp:7ffdeedef3d0 error:0 in librocksdb.so.6.2.4[7f120b63f000+56a000]