気になったので調べてみました。
結論
メインネットは実時間と比較して、現在約5秒先にずれています。
ネットワーク時計とは
Symbolでは独自のネットワーク時計を持っていて、トランザクションのタイムスタンプなどに使用されます。
Symbol解体新書では16.時刻同期で解説されています。
https://symbol.openapostille.com/apostille/2617CDEDA05679A1FE9F14E826BFAE7D21216041B8BB52F6076EF13BF9792FBB
たとえば、イーサリアムは外部のNTPから実時間を取り入れています。それゆえ、外部の環境に依存してチェーンがクラッシュするというトラブルがテストネットで発生しました。
SymbolではP2P通信によって独自のネットワーク時間を採用しているため、この問題を回避することができますが、ネットワーク時刻が、実時間と同じであるという保証はありません。
Symbolが採用しているのはこの論文です。
A Theoretical Evaluation of Peer-to-Peer Internal Clock Synchronization
「ピア間の内部クロック同期の理論的評価」
https://eudl.eu/pdf/10.4108/ICST.AUTONOMICS2008.4477
アブストラクトを翻訳してみましょう
「同期されたクロックは、多くの分散アプリケーションにおいて前提条件とされることが一般的です。既存の解決策は主に、静的な環境でのみ機能し、明確に定義された特性と制約がある状況でこの問題に対処しています。周囲の環境についての仮定なしに動作する必要がある新興の大規模ピア・ツー・ピアアプリケーションのニーズが、最近この研究領域を再活性化させ、自己組織化能力と動的な設定に強い適応性を備えた新しい解決策の提案によって特徴づけられています。本論文では、大規模アプリケーション向けのクロック同期アルゴリズムの特性について報告します。このアルゴリズムは、ゴシップベースのパラダイムと連成発振子現象から得られた自然発想のアプローチを組み合わせた内部クロック同期メカニズムを実装しています。理論的なアプローチを用いて、論文はアルゴリズムの収束特性に焦点を当て、その同期速度(減衰因子)、最終同期ポイント、およびエラーについて特徴づけています。」
少し難しいですね。イントロダクションを一部翻訳してみます。
この種の問題に取り組む有望なアプローチの一つは、完全に分散型のパラダイムを採用し、ピアが必要なすべての機能を実装する、いわゆるゴシップベースのアルゴリズムを実行する方法です。このアプローチでは、システムの大規模さと地理的な広がりにより、各ピアは直接やり取りできるシステムの一部を表す近隣情報を提供されます。各ピアで実行されるアルゴリズムは、この近隣情報から情報を収集してローカルな結果を計算します。これらの結果は定期的に計算され、システム全体で期待されるグローバルな結果を徐々に導きます。
ご近所さんからローカルな時間を計算して徐々に全体へと反映していく、そのようなアルゴリズムに見えます。
NTPというプロトコルが基本的に参照先の時間を無条件に従うといった傾向があるので、分散型ネットワークにおいてはあまり相性の良く無いプロトコルなのかもしれません。
さらにSymbolではインポータンスが高く、長期運用されているノードのネットワーク時計の時刻が比較的強めに反映されるようにフィルタリングの設定などが施されているようです。
では、実時間とどのぐらい差異があるのか検証してみましょう。
- 比較対象とするNTPサーバ
- jp.pool.ntp.org
計測対象となるノードはメインネットからランダム選択し100回時刻を取得しました。
全ての計測においてNTPサーバ、Symbolノードの順番で応答ありました。
なお、時刻の問い合わせが先方に届く時間差についての考慮が必要と思い、到着するまでの時間差を2で割った時間をSymbolノードが出力した時刻から減算しました。
結果、ほぼ全ての計測において、NTPサーバとSymbolノードの提示する時間の差が
5.004秒±250ミリ秒
に収まりました(上下5件程度は外れ値として除外、最小の誤差が2.04msでした)
まとめ
Symbolのネットワーク時計は精巧に設計されていますが、実時間と比較すると(NTPとの比較)5秒の誤差が生まれています。ただし全てのノード間での差異はほとんどが0.25秒以内に収まっていて、ネットワーク全体としては非常に精密に同期されていると考えることができます。
おそらく大きなインポータンスを持つノードに少し時刻が狂っているものがあるのかもしれません(テストネットでは0.2秒程度の誤差でした)。
分散型のコンピューティングはまだ生まれたばかりです。
Symbolが採用しているアルゴリズムも2009年に提案されたものです。
これからもさまざまな改善方法が提案されるかもしれませんね。