このページの目次
NEMホワイトペーパーその3
NEMのホワイトペーパー(テクニカルリファレンス)翻訳第三弾です。長かったですがテクニカルリファレンスの翻訳はこれで最後です。NEMには他にもアポスティーユやカタパルトなど紹介すべき項目がたくさんあります。こちらも追々ご紹介していきたいと思います。
ちなみに、現在日本の取引所でNEMを扱っているのは「Zaif」と「DMM Bitcoin」、「CoinCheck」となっております。
ZaifでNEMを始める方はこちら
※口座開設方法も詳しくご説明しております 簡単口座開設【Zaif編】
ちなみに、今回紹介するNEMのホワイトペーパーはの原文はこちら↓
https://nem.io/wp-content/themes/nem/files/NEM_techRef.pdf
第一弾の記事はこちら↓です
http://bittrader.jp/2018/03/05/introduce_whitepaper05_01/
第二弾はこちらです↓
http://bittrader.jp/2018/04/15/introduce_whitepaper05_01-2/
NEM Technical Reference翻訳3
8 Time synchronization(時間同期)
他の多くの仮想通貨と同様、NEMのトランザクションとブロックはタイムスタンプに依存しています。理想的には、ネットワーク内のすべてのノードの持つ時間は同期されているべきです。最新のオペレーティングシステムのほとんどには時間を同期するシステムが統合されていますが、ノードの中にはローカルクロックがリアルタイムから1分以上ずれているものがあります。そのためこれらのノードは、有効なトランザクションやブロックを拒否し、ネットワークとの同期を不可能にしてしまいます。したがって、すべてのノードが時間通りに一致することを保証する、同期のメカニズムが必要です。これには基本的に2つの方法があります:
- 既存のプロトコル(NTP等)を使用する
- カスタムプロトコルを使用する
NTPのような既存のプロトコルを使用する利点は、実装が容易であり、ネットワーク時間が常にほぼリアルタイムであるという点です。が、これにはネットワーク外のサーバーに依存してしまうという欠点があります。
P2Pネットワークに依存する部分だけ、カスタムプロトコルを使用することでこの問題は解決されますが利益相反する部分があり、ネットワークの時間が常にリアルタイムに近いことを保証することが不可能になります。色々なカスタムプロトコルの概要については、[12]を参考としてください。
NEMでは、外部の要素から完全に独立するためにカスタムプロトコルを使用しています。
8.1 Gathering samples(サンプル収集)
ネットワーク内の各ノードはオフセットと呼ばれる、開始時に0に設定された整数を管理します。オフセットによってミリ秒単位で増加するローカルシステム時間は、ノードのネットワーク時間です。ノードの起動完了後、そのノード(ローカルノードと呼ぶ)は、時間同期のために最大20のパートナーノードを選択します。最低限の重要度を公開しているノードのみがパートナーとみなされます。
図13:ローカルノードとパートナーノードのやりとり
選択された全パートナーに対して、ローカル・ノードは現在のネットワーク時間を要求するリクエストを送信します。ローカルノードは、要求がリクエストされたとき、およびレスポンスが受信されたときのネットワークタイムスタンプを記憶します。各パートナーノードのレスポンスは、リクエストが到着したタイムスタンプと、レスポンスのタイムスタンプをサンプルとして返します。パートナーノードは、自身のネットワーク時間を使用してタイムスタンプを生成します。図13は、ノード間のやり取りを描いています。
タイムスタンプを使用することでローカルノードはラウンドトリップ時間を計算することができます。
そして、2つのノードによって使用されるネットワーク時間の間のオフセット“o”は
として推定されます。これは、ローカルノードのオフセット見積もりリストが出来上がるまで、同期するパートナーごとに繰り返されます。
8.2 Applying filters to remove bad data(フィルターを適用して不良データを除去)
さまざまな理由で不良サンプルができる可能性があります。
- 悪意のあるノードが間違ったタイムスタンプを提供する可能性があります。
- 誠実なノードは、それを知らずにまだ同期していない状態でリアルタイムから離れた時計を持つことがあります。
- ラウンドトリップ時間は、インターネットの問題もしくはノードの1つが非常に忙しいせいで、高い非対称を持つ可能性があります。これはチャネルの非対称性と呼ばれ、避けることができません。
不良サンプルを削除しようとするフィルタが適用されます。フィルタリングは3つのステップで実行されます。
- パートナーからのレスポンスが予想された時間内(i.e. if t4 − t1 > 1000ms)に受信されない場合、サンプルは破棄されます。
- 計算されたオフセットが特定の範囲内にない場合、サンプルは破棄されます。許容範囲はノードの稼働時間が増加するにつれて減少します。ノードが最初にネットワークに参加するとき、ネットワーク内のネットワーク時間にすでに存在する合意を調整するため高いオフセットを許容します。時間が経過すると、ノードは報告されたオフセットに対して許容されにくくなります。これにより、しばらくすると巨大なオフセットを報告する悪意あるノードを無視することを保証します。
- 残りのサンプルは、オフセットによって順序付けられ、次に両端でアルファトリムされます。言い換えると、両側で、サンプルの特定の部分が破棄されます。
8.3 Calculation of the effective offset(実効オフセットの計算)
報告されたオフセットは、オフセットを報告するノードの起動アカウントの重要度で重み付けされています。これは、シビルアタックを防ぐために実行されます。
許容範囲に近いオフセットを報告する重要度の低いノードを大量に発行することで、計算されたオフセットに影響を与えようとする攻撃者は、同じオフセットを報告する累積した同じ重要度を持つ単一のノードより大きな影響を与えないと考えられる。攻撃者による影響はマクロレベルでは単一のノードと影響が同じになります。
また、利用可能なサンプル数とすべてのパートナーノードの累積重要度を組み込む必要があります。そのため、各オフセットにはスケーリング係数が乗算されます。
Ijをj番目のオフセットojを報告するノードの重要度とし、viewSizeは最後のPoIの計算に適当とされたノード数で割ったサンプル数とします。
次に、使用されるスケーリング係数は
これにより、有効オフセットoの式が得られます。
図14:結合係数
viewSizeがスケールを覆っているため、重要度の高いアカウントの影響は人為的に制限されていることに注意してください。このようなアカウントは、NEMを上限が設定されていないアカウントに分割することで、マクロレベルへの影響を高めることができます。しかし、そのようにすると、単一のノードに対する時間同期のパートナーとして分割されたアカウントのすべてが選択される確率は低くくなるため、個々のパートナーへの影響が低くなる可能性が高くなると思われます。
8.4 Coupling and threshold(カップリングと閾値)
ネットワークに加入したばかりの新しいノードは、既に確立されたネットワーク時間にオフセットを素早く調整する必要があります。対照的に、古いノードは悪意のあるノードや新規参入者の影響をあまり受けないように、より厳密に動作する必要があります。
これを可能とする為、ノードは報告された有効なオフセットの一部のみを調整します。ノードは有効なオフセットに結合係数を乗算して最終オフセットを作成します。
各ノードは、実行した時間同期の回数を記録します。これはノード年齢と呼ばれます。
この結合係数cの式は次のとおりです。
これにより、5ラウンドの間に結合係数は1になり、それから指数関数的に0.1まで減衰することが保証されます。
最後に、ノードは絶対値が所定の閾値を上回る場合にのみ、計算された最終オフセットをその内部オフセットに追加します。これは、チャネル非対称性を有するノード間の通信によってネットワーク時間が徐々にふらついていくこおを防止するのに有効です。
9 Network(ネットワーク)
NEMネットワークはNISノードで構成されています。各ノードは、応答を認証するために使用される単一の一次アカウントに関連付けられています。これにより、攻撃者はノードのIPアドレスを偽装することができたとしても、秘密鍵を持たずにノードを偽装することができなくなります。
各NISノードには、次の構成設定があります。
- nis.nodeLimit – ローカルノードが情報をブロードキャストすべき他のノードの数。
- nis.timeSyncNodeLimit – ローカルノードがクロックを同期させるために使用する他のノードの数 セクション8:時間同期
通常、nis.timeSyncNodeLimitは、より良い時間平滑化を可能にするためにnis.nodeLimitより大きくする必要があります。これは時間同期の一部として転送されるデータが比較的少ないため、高負荷ではありません。
9.1 Node Protocol(ノードプロトコル)
NISノードは、デフォルトで独自のバイナリ形式を使用して通信します。この形式は、シリアライゼーションとデシリアライゼーションのコストを削減することによって、要求を圧縮し処理することでネットワーク帯域幅を最小限に抑えます。実際、すべてのNIS APIは、NEM独自のバイナリ形式またはJSON形式でエンコードされた要求をサポートしています。
偽装ベースの攻撃を防ぐために、NISノードは通信するときに2つの部分をハンドシェイクします。
- ローカルノードは、要求データとランダムな64バイトのペイロードをリモートノードに送信します。
- リモートノードはランダムなペイロードに署名し、要求された応答データと共に署名をローカルノードに送り返します。
- ローカルノードは署名をチェックし、リモートノードがランダムペイロードに署名したことを確認できる場合にのみ、応答データを処理します。
図15.ローカルノードとパートナーノード間の通信。
9.2 Node Startup(ノードの起動)
NISノードが起動されると、ノードはブロックチェーンを処理し、メモリ内の一部のデータをキャッシュしてオンラインのパフォーマンスを向上させます。処理が終了してもまだブートされていないため、ノードはネットワークに接続されません。
起動されていないノードはアカウントに関連付けられていません。 これにより応答に署名できなくなり、他のノードがそのIDを確認できなくなります。ノードを起動するには、NEMアカウントの秘密鍵をノードに提供する必要があります。
このアカウントは、ノードに関連付けられた一次アカウントです。実アカウントの秘密鍵をよりよく保護するために、委任されたアカウントを使用してノードを起動することができます。
9.3 Node Discovery(ノード検出)
ノードが起動されると、ノードはNEMネットワークに接続し他のノードと情報の共有を開始します。最初、ノードはよく知られているノードのみを認識しています。これらのノードは、サブセクション6.2 (ローカルの信頼値)で説明されている事前認証ノードと同じです。
時間の経過とともに、ノードはネットワーク内のより多くのノードを認識します。 これは通常、アナウンスメントまたはリフレッシュを介して2つの方法があります。
9.3.1 Announcement(アナウンスメント)
ノードは、定期的に現在のパートナーノードに自分自身をアナウンスし、要求内にローカル経験情報を含めます。ノードがパートナーに認識されていない場合、パートナーはノードをアクティブとしてマークしノードの経験を更新します。ノードがパートナーに知られている場合、パートナーはノードの経験のみを更新しますが、そのステータスは変更しません。
9.3.2 Refresh(リフレッシュ)
ノードは、定期的に現在のパートナーに自分自身に関する最新の情報とネットワークの状態を提供するように依頼します。
最初に、ノードはリモートノードに関する更新情報を要求します。 成功すると、ローカルノードはリモートのエンドポイント(動的IPをサポートするために必要)とメタデータを更新します。次のいずれかが発生した場合、この手順は失敗します。
- リモートノードは、違うノードから有効な要求を返します。
- リモートノードは、ローカルノードと互換性がありません(例えば、リモートノードはテストネットですが、ローカルノードはメインネットです)
成功すると、リモートノードは現在のすべてのパートナーノードのリストを提供するように求められます。悪意のあるノードが正常なノードに関する誤った情報を提供してブラックリストに載らないようにするために、ローカルノードは報告された各パートナーノードに直接連絡を試みます。ノードのメタデータは、そのノード自体によって提供されるメタデータによってのみ更新されることに注意することが重要です。
最適化として、ブラックリストに載っているノードはリフレッシュされません。 致命的なエラーを返すか、ローカルノードが接続できない場合、ノードは一時的にブラックリストに登録されます。定期的にブラックリストに載っているノードはブラックリストから削除され、再度リフレッシュ操作に参加することが許可されます。オリジナルのブラックリストが一時的でないエラーによるものだった場合、そのノードは再びブラックリストに登録される可能性があります。
9.4 Node Selection(ノードの選択)
時間の経過とともに、ノード発見プロセスの結果としてローカルノードはネットワーク内のより多くのノードを認識することになります。最終的には、既知のノードの数(既知のノードとその他のノードの両方を含む)は、パートナーノードの数よりはるかに多くなります。
ノードは定期的にパートナーノードを再計算します。 この再計算が行われると、ビジー状態として検出されたノードを含め、すべての既知のノードがパートナーノードになることができます。デフォルトの設定では、この再計算は信頼値の再計算より頻繁に発生します。 デフォルトでは、15分ごとに信頼値が再計算されます。
既知のノードは、その信頼値によって重み付けされ、それらの中からパートナーノードがランダムに選択される。大きな信頼値(良いノードになる確率が高いノード)は、パートナーとして選択される可能性が高くなります。最小限の相互作用を受けたノードは、通常、0またはそれに近い信頼値を持ちます。
これらのノードに自分自身を証明して信頼を築く機会を与えるために、ネットワークを選択して参加する機会を得るために、信頼性を効果的に向上させます。 信頼度の30%は、相互作用が10未満のノード間で均等に分散します。ネットワークが確実に接続されるように、ランダムなプロセスに対する1つの調整が行われます。 ローカル・ノードがよく知られているノードでない場合はさらに1つの、ランダムでオンラインのよく知られたノードに接続されます。 これにより、すべてのノードが少なくとも1つのよく知られたノードと積極的に提携していることが保証されます。
これでNEMのテクニカルリファレンスの翻訳は終了です。長い間お付き合いいただきありがとうございました。