Network layer
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 PunchingやSTUNのような他のポリシーと違い、ポートを必要とせず、サーバーへのパブリッシュも不要です。クラウドサーバーなしで、自宅のコンピュータでネットワークにアクセスし、他のノードと通信することができます。
イースターエッグ
コードリポジトリのP2Pネットワークパッケージの中には、/example
ディレクトがあります。そこにネットワークを使ったインスタントメッセンジャーアプリを作成しておきました。そのディレクトリに移動して、go build
でコンパイルしてバイナリを./example
に作成してください。ネットワーク上でチャットができることでしょう。それで遊んでみてください。