メインコンテンツまでスキップ
バージョン: 3.3.2

ネットワークレイヤー

P2P (Peer-to-Peer)ネットワークは、ピア間のタスクと作業負荷を分散する非中央集権的な構造です。P2Pネットワーク内では、接続されたコンピュータは対等で、各ノードはリソースやサービス、コンテンツの供給者であり、消費者でもあります。伝統的なクライアントーサーバーネットワークモデルと比べて、P2Pネットワークは非中央集権的で、拡張性、耐攻撃性、プライバシー保護などの利点があります。それらの機能でブロックチェーンシステムの動作は保証され、自由で自律的、非中央集権的なブロックチェーンの基礎になっています。

IOSTのネットワークレイヤー設計

ノードを迅速に発見し、トランザクションやブロックの素早くネット全体へのブロードキャストする非中央集権ネットワークトポロジーを実現しました。同時にネットワーク内の冗長性を制限することで、ノード間のセキュアなデータ伝送を実現します。 調査とテストの結果、ネットワークレイヤーとして、強力なlibp2p ライブラリを採用することにしました。

ノードの発見と接続

基本プロトコルはTCP/IPです。データの盗聴や不用意な操作を防止するため、TCPの最上位のTLSレイヤーでデータをセキュアにすることにしました。すべてのTCP接続を有効に利用できるよう、送受信にストリーム多重化を採用しました。ノード間で複数ストリームを動的に確立し、バンド幅を最大化しました。

ノードでは、Kademlia を使ってゲートウェイテーブルを管理しています。Kademliaアルゴリズムは、ノードのID間でXORを使って、2つの距離を計算します。ノードは他のピアとの距離に基づいたバケットの中に入ります。ノードの照会には、関連するバケットの中で最も近いノードを見つけるだけで済みます。特定の数のクエリでは、情報はノードで見つけることを保証できます。Kademliaは、速度と汎用性で優れています。

Data transmission

データ伝送

バンド幅を減らし、データ伝送を速くするために、すべての構造化されたデータをプロトコルバッファでシリアライズし、Snappyアルゴリズムで圧縮しています。テスト中に、この方法でデータのサイズを80%以上減らしました。

ブロードキャストは冗長なデータ伝送を引き起こし、バンド幅や処理能力を無駄にします。多くのプロジェクトでは、「ホップ」(または再ブロードキャスト回数)を制限して、データの無限の再ブロードキャストを防止しています。この方法による欠点は、特にネットワークが巨大な場合には、一定数の再ブロードキャストではネットワーク全体へのデータの到達を保証できないということです。EOSはこの問題に対応するために、ネットワークレイヤーがすべての隣接ノードのトランザクションとブロックを記録し、データを特定ノードへ送るべきかどうかを判断するようにしています。この設計はある程度は冗長伝送を減らすことができますが、エレガントでなく、ストレージへに負荷もかかります。

IOSTでは、この問題に対して、重複する情報をフィルターするというフィルターアルゴリズムを採用しました。ブルームフィルターカッコーフィルター などを比較した後、ブルームフィルタを採用することにしました。100万パケットのデータを、たった1.7MBのストレージで0.1%の失敗だけで重複をフィルタリングできました。さらにデータ伝送の冗長性を減らすために、ブロック大きなトランザクションのために、そのハッシュを最初にブロードキャストするようにし、ノードはハッシュを使って、不足しているデータをダウンロードするようなポリシーも採用しました。

LANの実現

LANを実現するためには、UPnPプロトコルを使っています。UPnPはUDP Hole PunchingSTUNのような他のポリシーと違い、ポートを必要とせず、サーバーへのパブリッシュも不要です。クラウドサーバーなしで、自宅のコンピュータでネットワークにアクセスし、他のノードと通信することができます。

イースターエッグ

コードリポジトリのP2Pネットワークパッケージの中には、/exampleディレクトがあります。そこにネットワークを使ったインスタントメッセンジャーアプリを作成しておきました。そのディレクトリに移動して、go buildでコンパイルしてバイナリを./exampleに作成してください。ネットワーク上でチャットができることでしょう。それで遊んでみてください。