LoginSignup
4
2

More than 1 year has passed since last update.

Symbol from NEM のブロック生成を観察する

Last updated at Posted at 2021-01-25

Symbol from NEM のコミュニティによるテストが実施されます。
ぜひ、このイベントのタイミングでブロックチェーンのロールバックとファイナライズをリアルに体感しましょう。とくにNEMでの決済を検討している方は、どのタイミングで送金が確定されるのかを知ることはとても大切なことですので、頭で理解するだけではなくブロックの生まれて、そして一部が消えて、永遠に残り続ける様子を一度は観察しておきましょう。

まず、接続するノードを選択します。
https://symbolnodes.org/nodes/

私が設置しているHTTPS対応ノードは以下になります。
https://node.xembook.net

F12キーを押してコンソールを開いて以下のスクリプトを入力していきます。

ライブラリの埋め込み
NODE = window.origin;

(script = document.createElement('script')).src = 'https://xembook.github.io/nem2-browserify/symbol-sdk-1.0.0.js';
document.getElementsByTagName('head')[0].appendChild(script);

アクセスするノードの指定とbrowserify化したsymbol-sdkを表示したページに埋め込みます。

事前準備
nem = require("/node_modules/symbol-sdk");
op  = require("/node_modules/rxjs/operators");
repo = new nem.RepositoryFactoryHttp(NODE);
nsRepo = repo.createNamespaceRepository();
blockRepo = repo.createBlockRepository();

wsEndpoint = NODE.replace('http', 'ws') + "/ws";
listener = new nem.Listener(wsEndpoint,nsRepo,WebSocket);

(async() =>{
epochAdjustment = await repo.getEpochAdjustment().toPromise();
})();

必要なクラスを生成しておきます。

Blockのリスニング
latest_block = 0;
last_finalized_block = 0;

listener.open().then(() => {
    setInterval(function(){
        listener.newBlock()
    }, 30000);

    listener.newBlock()
    .pipe(
      op.mergeMap(x=>blockRepo.getBlockByHeight(x.height))
    )
    .subscribe(x=>{
      console.log("------------------");
      if(latest_block >= x.height.compact()){
          console.log("■■■ roll back!! ■■■");
      }
      console.log("prevHash:" + x.previousBlockHash);
      console.log("timestamp:" + new Date(Number(x.timestamp.toString()) + epochAdjustment * 1000));
      console.log(x.height.compact() + ":("+ x.totalTransactionsCount  +"txs):"+ x.hash);
      latest_block = x.height.compact();

    });

    listener.finalizedBlock()
    .subscribe(x=>{
        diff_max = latest_block - last_finalized_block; 
        diff_min = latest_block - x.height.compact();
        if(last_finalized_block != 0){
          console.log("================");
          console.log("FinalizedBlock:" + x.height.compact() + ":" + diff_min.toString() +"<" + diff_max.toString() + ":" + x.hash);
        }
        last_finalized_block = x.height.compact();
    })    
});

リスナークラスを利用してBlock情報を取得します。

リスナーを実行すると以下のようにコンソール出力されていきます。

スクリーンショット 2021-01-26 1.30.12.png

prevHashが前のブロックのハッシュ値と一致しているのがわかります。
ロールバックが発生すると以下のように表示されます。

スクリーンショット 2021-01-26 1.36.23.png

ブロック高:49695 で 898txsのブロックがロールバックされて894txsのブロックが次のブロックに引き継がれていくのがわかります。

ファイナライズが発生すると以下のような表示になります。
スクリーンショット 2021-01-26 1.41.05.png

49680のブロックがファイナライズされ、最短で25個、最長で29個前に生成されたブロックが確定されたことを意味します。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2