NTPに頼らず、Symbol from NEMブロックチェーンで同期された現在時刻を取得する


今回はブロックチェーンとは少し離れた内容です。
Symbol from NEM では内部で独立したネットワーク時刻を保有しています。
これを外部から利用するための方法です。NTPサービスなどにアクセスする必要はありません。

事前準備

NODE = 'https://sym-test.opening-line.jp:3001';

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

ライブラリインポート

nem = require("/node_modules/symbol-sdk");
nodeHttp = new nem.NodeHttp(NODE);
networkHttp = new nem.NetworkHttp(NODE);

Symbol のエポックタイム取得

props = await networkHttp.getNetworkProperties().toPromise()
epoch = nem.UInt64.fromNumericString(
  props.network.epochAdjustment.replace("s","")
) * 1000

Symbol from NEMでは2019 11/11 0時(GMT)がエポックタイムとして指定されているため、その秒情報をネットワークより取得しておきます。

現在時刻取得

nodeTime = await nodeHttp.getNodeTime().toPromise()
console.log(new Date(epoch + nodeTime.receiveTimeStamp.compact()));

ノードより現在時刻を取得してエポックタイムと足し合わせてJavaScriptのDate関数より現在時刻を出力します。

Wed Oct 14 2020 00:10:51 GMT+0900 (日本標準時)

無事出力されました。

ちなみにライブラリを使用したくない場合は以下のエンドポイントより情報を取得できます。

network. epochAdjustment

http://api-01.ap-northeast-1.0.10.0.x.symboldev.network:3000/network/properties

communicationTimestamps.receiveTimestamp

http://api-01.ap-northeast-1.0.10.0.x.symboldev.network:3000/node/time