ブロックチェーンでは、ノード間のスムーズな対話を確保するために、効率的な通信ツールが必要です。また、libp2p は、ポイントツーポイント通信の開発者にとって不可欠なフレームワークであり、強力なモジュール機能を提供し、分散型ネットワークでのメッセージングをより柔軟かつ安全にします。 Substrate では、libp2p の統合により、開発者がさまざまなカスタマイズされたプロトコルを簡単に実装し、ブロックチェーン ノード間の通信プロセスを簡素化し、複雑なネットワーク インタラクションをより直観的かつ効率的に行うことができます。
この記事は PaperMoon によって後援されています kaichao 教師が執筆した Substrate アドバンスト コースの 6 つの技術記事では、ピアツーピア通信の利点、libp2p のアーキテクチャ設計、および Substrate がこれらのテクノロジーを分散型ブロックチェーンの構築にどのように適用するかを深く理解できます。カスタム ブロックチェーン アプリケーションを開発する際に、複雑なネットワーク環境に簡単に対処できます。
ポイントツーポイント通信モデルの台頭と重要性
Web2.0 時代では、インターネット アプリケーションの大部分は、TCP/IPに基づく「クライアント/サーバー」通信アーキテクチャを採用しており、クライアントはデータを収集してサーバーに送信し、サーバーはデータを保存して処理します。その後、これらの処理されたデータを取得して使用します。このモデルは、過去 30 年間のインターネットの活発な発展を支えてきましたが、一方で、次のようなさまざまな問題も引き起こしました。
ユーザーのプライバシーの開示。
ユーザーデータの販売。
サービスプロバイダーは底なしの広告を掲載し、真実を知らないユーザーに取り返しのつかない損失を与えます。
ユーザーが投稿したコンテンツを相談なく恣意的に削除すること。
独占市場と価格設定。
ユーザーの心理を過度に悪用し、ユーザーの時間を制御不能に占領する。
…
クライアント/サーバー通信モデルを以下に示します。
上記の問題の解決策を探しているとき、ポイントツーポイント (ピアツーピア)通信メカニズムがテクノロジーの先駆者たちの視野に徐々に加わりました。インターネットの初期の頃、ピアツーピア通信は主に、音楽共有サービス Napster やストリーミング メディア ダウンロード サービス BitTorrent などのファイル共有に使用されていました。ポイントツーポイント サービスをより広範に適用するには、リソースの著作権問題や現実世界の監視に対処するための特定のガバナンス メカニズムも必要になります。これらについては、この記事の焦点ではないため、あまり紹介しません。
ポイントツーポイント通信モデルは次のとおりです。
ポイントツーポイント ネットワークでは、すべてのノードが平等です。つまり、どのノードもデータを保存および処理できます (サーバーとして)。処理対象のデータをネットワーク内の他のノードに送信したり、処理されたデータを取得したりすることもできます。データ (クライアントとして)。このような通信メカニズムを通じて、次のことが保証されます。
ネットワークはオープンであり、ノードは自由に参加および離脱できます。
単一のサービス ノードに依存しないため、ネットワーク サービスの信頼性と効率が向上します。
ノードによって実行されるプログラム コードは公開され、ルールはより透明になります。
ネットワーク内で送信されるデータと提供されるサービスに応じて、ファイルの保存と読み取り、データ計算、コンテンツ共有、データ トランザクション、その他のサービスを含む、ポイントツーポイント アプリケーションのさまざまなアプリケーション シナリオが登場しています。これらのアプリケーションの開発プロセスでは、次のような技術的な点が関係する可能性があります。
ノード ID は、ネットワーク内のノードとアドレス形式を一意に識別します。
検出メカニズム、集中調整サービスが存在せずに新しいノードを検出する方法。
ルーティング: ローカル ノードはネットワーク内のすべてのノードの情報を保存できないため、ルーティング アルゴリズムを使用して必要なノードを見つけます。
TCP、UDP、WebSocket、QUIC などの複数の通信プロトコル。
暗号化と認証により、メッセージの信頼性とセキュリティが保証されます。
NAT ペネトレーションは、NAT の背後にある内部 IP にアクセスできない問題を解決します。
リソースを節約するための多重化。
ネットワークに負担をかけずに効率的にアップデートを取得するためのメッセージ サブスクリプション。
リレー: 通信を確立する必要がある 2 つのノードに直接アクセスできない場合 (たとえば、両方のノードが NAT ネットワーク内にあり、情報はリレー ノードを介して送信する必要がある)。
…
上記の技術的なポイント/要件は、すべてのピアツーピア アプリケーションに現れるわけではありません。ただし、ほとんどの場合、機能の一部しか使用されません。ただし、車輪の再発明という重大な現象が依然として存在します。繰り返しの開発を避けるために、一部のアプリケーションは既存のオープンソース アプリケーションの機能コードをフォークすることを選択しますが、この方法では元のアプリケーションの技術的負債が発生し、カスタマイズや拡張が困難になります。
複雑で絶えず変化するネットワーク トポロジと拡大するアプリケーションの状況により、ポイントツーポイント アプリケーションの開発、促進、普及が非常に困難になっています。高度にモジュール化されたポイントツーポイント通信開発フレームワークが登場したことは驚くべきことではありません。は次に紹介する libp2p です。
モジュール式ポイントツーポイント通信、フレームワークの誕生 - libp2p
Libp2p は、ピアツーピア アプリケーションを開発するためのフレームワークで、元々は分散ファイル共有サービス IPFS から派生したもので、現在のlibp2pを形成するためにいくつかの成熟した言語バージョンが含まれています。 、go-libp2p、rust-libp2p は、一連の参照仕様を定義しており、異なる言語の実装バージョンがこの仕様に準拠している限り、相互通信を実現できます。
Libp2p が提供するコア機能には次のものがあります。
ノード間に安全で再利用可能なネットワーク接続を確立します。
検証可能なノード ID と接続可能なアドレス。
安全で再利用可能な接続
Libp2p がサポートする基盤となる (トランスポート層) プロトコルには、TCP/IP、UDP、WebSocket、QUIC などが含まれます。言語バージョンによって実装の完成度は異なります。接続のセキュリティは、送信されるコンテンツを暗号化することによって確保され、それに応じてノードの ID が検証されます。
接続の利用率を向上させ、さまざまな形式のファイアウォールや NAT などの複雑なネットワーク シナリオに対処するには、確立された基礎となる接続を多重化する必要があります。これは、多重化を実現できる上位層の接続形式です。 -一方通行か。
QUIC プロトコルには、セキュリティおよび再利用可能なコンポーネントが組み込まれています。このような機能を持たないプロトコルの場合は、 libp2p を使用して元の接続をアップグレードし、再利用できるセキュリティ パッケージと再利用可能なsecioおよびNoiseパッケージを追加できます。パッケージにはyamuxとmplex が含まれます。
アップグレード プロトコルのプロセスは次のとおりです。
さまざまな libp2p 組み込みまたはユーザー定義のアプリケーション層プロトコルをストリームで送信できます。これらのプロトコルは、次のようなノード間の情報交換の方法と内容を定義します。
ping は、ノードがオンラインかどうかを定期的に確認するために使用されます。
アイデンティティ、ノードの公開鍵やネットワーク内のアドレスなどの情報をノード間で交換するために使用されます。
kad-dht : Kademlia アルゴリズムに基づく分散ハッシュ テーブルで、ノード間ルーティングに使用されます。
…
アイデンティティ プロトコルを例に挙げると、そのプロトコル ID (パス形式の文字列) は/ipfs/id/1.0.0
です。メッセージ表現とシリアル化には、プロトコル バッファーが使用されます。
ノードのアイデンティティ
ノードの起動時に秘密キーを指定する必要があります (ランダムに生成することもできます) 。これは主に次の目的で使用されます。
両方のノードの公開鍵を使用して、 Diffie-Helman 鍵交換を通じてメッセージを暗号化および復号化します。
ノードの公開キーをハッシュして、ノード ID である PeerId を生成します。
Libp2p でサポートされる公開キー暗号化アルゴリズムには、RSA、Ed25519、Secp256k1 などが含まれます。 PeerId は、複数のハッシュ アルゴリズムをサポートするmultihashの形式で生成されます。Base 58 エンコード後の形式はQmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N
です。
PeerId とmultiaddrを組み合わせると、ネットワーク内のノードを見つけて ID を検証することができます。たとえば、IP アドレス 7.7.7.7 を持ち、ポート 4242 でリッスンし、上記の PeerId を持つノードの multiaddr (マルチレベル アドレス) は次のようになります。 :
上記では、libp2p が提供する機能の一部のみを示しています。メッセージ サブスクリプション、リレー、NAT 貫通などの詳細については、関連ドキュメントを参照してください。libp2pを使用してポイントツーポイント アプリケーションを開発すると、ほとんどの問題が解決されます。上記の技術的なポイントにより、開発時間が大幅に節約され、システムの保守性と拡張性が向上します。次に、rust-libp2p を使用して単純なカスタム アプリケーション プロトコルを実装する方法を見てみましょう。
簡単なアプリケーション
ここでは、rust-libp2p に基づいた単純なポイントツーポイント アプリケーションを作成します。これは、エコー機能を完了できます。つまり、1 つのノードが文字列を送信し、もう 1 つのノードがその文字列を受信して同じ文字で応答します。カスタマイズするには、アプリケーション層プロトコルEchoProtocol
、libp2p によって提供されるUpgradeInfo
インターフェイスを実装する必要があります。
ここでのprotocol_info
メソッドは、プロトコルの名前と形式を返します。次に、 InboundUpgrade
とOutboundUpgrade
を実装します。両方のインターフェイスはUpgradeInfo。
NegotiatedSubstream
ネゴシエートされたプロトコルによって使用される I/O ストリームを表します。リモート ノードが現在のプロトコルをサポートしている場合は、 upgrade_inbound
とupgrade_outbound
呼び出して、それぞれリスナー側とダイヤラ側でハンドシェイク信号を有効にします。
その後、接続要求を処理するハンドラーを定義します。これは、処理中に使用されるステータス情報を保存する構造体EchoHandler
です。
カスタム列挙イベント列挙型も必要です。
次に、libp2p::swarm で提供されるProtocolsHandler
インターフェイスを実装できます。
ノードがダイヤラーであり、ハンドラーがポーリング( ProtocolsHandler::poll()
)している場合、接続に使用されるプロトコルの開始とネゴシエーションに使用されるEchoProtocol
インスタンスを含むProtocolsHandlerEvent::OutboundSubstreamRequest
を返す必要があります。ネゴシエーションが成功した場合は、 ProtocolsHandler::inject_fully_negotiated_outbound
を呼び出します。ここでは、ハンドラーによって保存されたアウトバウンド ステータスを None からSome(send_echo(stream).boxed())
に更新します。ここで、 send_echo
ネゴシエートされた IO ストリームを受信し、エラーがない場合はこれを返します。という流れが発生します。
次に、 Pr
otocolsHandler::poll
の実装を見てみましょう。 outbound が Some で、 send_echo によって返される今後のポーリング結果がPoll::Pending
である場合、 outbound をself.outbound = Some(send_echo_future)
に更新して、次のポーリングがまだ有効であることを確認します。結果がPoll::Ready
の場合、対応するイベント情報が返されます。
ノードがリスナーであり、新しい要求ストリームが接続に表示されると、 ProtocolsHandler::listen_protocol
が自動的に呼び出され、 InboundUpgrade
のインスタンスを返し、ストリームで使用されるプロトコルをネゴシエートします。ネゴシエーションが成功すると、 inject_fully_negotiated_inbound
が呼び出されます。このメソッドでは、ハンドラーの受信属性ステータスがSome(recv_echo recv_echo
Some(recv_echo(stream).boxed())
に更新されます。方法は。
ここで、汎用S
、 futures_ioによって提供されるAsyncRead
およびAsyncWrite
制約を満たす必要があります。
ピアツーピア ネットワークは群れのようなもので、群れの全体的な動作は単一の個人の動作で構成されます。このようなルールを組み合わせて使用できます。 Rust では、libp2p では、指定された定義でNetworkBehaviour
インターフェイスを実装する必要があります。ここでは、まずルールの状態を保存するための構造体を定義します。
この構造には、Swarm と通信されるメッセージevents
と動作定義に必要な初期設定が含まれています。次に、 NetworkBehaviour
インターフェイスを実装できます。
接続が確立されるか、ノードを呼び出そうとすると、 new_handler
呼び出され、以前に定義したハンドラーEchoHandler
が呼び出されます。接続のバックグラウンド処理スレッドとして、動作とハンドラーはメッセージ パッシングを通じて通信します。 inject_event
メカニズムでは、ハンドラーのメッセージを Behavior に渡すことができます。このビヘイビアーは、メッセージをハンドラーに渡すためにポーリング時にSendEvent
を返します。ここまでで、簡単なエコー ポイントツーポイント通信プロトコルが完成しました。次に、それを main 関数で使用する方法を見てみましょう。
コードの簡単な説明は次のとおりです。
Keypair::generate_ed25519
介してノード間通信暗号化用のキーを生成します。公開キーはノードのPeerId
取得できます。libp2p::build_development_transport
開発で一般的に使用されるトランスポート層を構築し、TCP/IP、WebSocket、暗号化層としてノイズ プロトコルを使用する、yamux および mplex 多重化プロトコルをサポートします。着信パラメータを解析し、通話のノード情報が含まれている場合、それはダイヤラ (クライアント) であり、構築された動作の初期パラメータ
init_echo
true に設定します。上記で構築したトランスポート層、動作、およびノード ID を使用して、
Swarm::new(transport, behaviour, peer_id)
を呼び出し、ネットワークをシミュレートする swarm を構築します。ノードがダイヤラーの場合、受信リモート ノード
Swarm::dial_addr(&mut swarm, remote)?
呼び出して、ノードを swarm ノード プールに追加します。swarm.poll_next_unpin(cx)
を使用して swarm をポーリングします。動作によってトリガーされたメッセージがある場合は、対応するメッセージを処理します。
要約すると、libp2p はポイントツーポイント通信に高度な抽象化を提供します。これらの概念に初めて触れると混乱しやすく、分割されたレベルと一般的に使用されるプロトコルに常に慣れておく必要があります。 Rust-libp2p の実装は、libp2p によって定義されたレベルとプロトコルに基づいて行われます。カスタム プロトコルを開発する際には、これらの抽象インターフェイスとインターフェイス間の通信方法を深く理解する必要があります。一般に、ポイントツーポイント通信の開発は、従来のクライアント/サーバー通信よりもはるかに困難です。libp2p は、これらの問題点の一部を埋めるように設計されていますが、アプリケーション開発者は、Only についてさらに学ぶ必要があります。基礎となるメカニズムを理解することで、アプリケーション プロトコルをより適切に開発できるようになります。現在、 libp2p を使用するアプリケーションには、IPFS、Substrate/Polkadot、Libra、Ethereum 2.0 などが含まれます。次に、Substrate が libp2p をどのように使用するかを学びましょう。
基板ネットワーク層アーキテクチャ、マルチプロトコルのサポート、およびノード検出メカニズムの実装
ブロックチェーン ネットワークは分散型 (ポイントツーポイント) ノードで構成され、メッセージはネットワーク接続を介してノード間で送信されます。そのネットワーク層は、簡単に使用できる Rust-libp2p を使用します。次のようなさまざまな通信プロトコルを拡張します。
トランスポート層は、TCP/IP (アドレス形式:
/ip4/1.2.3.4/tcp/5
)、WebSocket (アドレス形式:/ip4/1.2.3.4/tcp/5/ws
)、DNS (アドレス形式:/dns/
をサポートします。example.com/tcp/5
example.com/tcp/5/ws
/dns/
、および対応する IPv6 形式。暗号化プロトコルノイズはトランスポート層の上に適用されます。
多重化プロトコルYamuxおよびMplex をサポートします。Mplex は段階的に廃止されます。
libp2p 標準ping プロトコル(
/ipfs/ping/1.0.0
) を使用して、ノード間のネットワーク接続がまだ生きているかどうかを定期的にチェックします。チェックに失敗した場合、接続は切断されます。libp2p 標準ID プロトコル(
/ipfs/id/1.0.0
) を使用すると、ノードはこのプロトコルを通じてノード情報を定期的に交換します。libp2p 標準Kademlia プロトコル(
/<protocol_id>/kad
) は、Kademlia ランダム ウォーク クエリを実行します。ここで、protocol_id はさまざまなチェーンを区別するために使用でき、Substrate チェーン仕様で定義されています。カスタマイズされた同期プロトコル(
/<protocol-id>/sync/2
) 。ブロック情報の同期に使用されます。リクエストと返される結果のデータ形式は、 api.v1.protoファイルで定義されます。カスタマイズされたライト プロトコル(
/<protocol-id>/light/2
)ライト クライアントは、このプロトコルを使用してチェーン上のステータス情報を同期します。データ形式はlight.v1.protoファイルで定義されます。カスタマイズされたトランザクション プロトコル(
/<protocol-id>/transactions/1
)は、ノードが受信したトランザクション情報をブロードキャストするために使用されます。その形式は、トランザクション コレクションの SCALE エンコード結果です。カスタマイズされたブロック ブロードキャスト プロトコル(
/<protocol-id>/block-announces/1
)。ノードがブロックを生成または受信すると、そのブロックを他のノードにブロードキャストします。カスタムゴシップ プロトコル(
/paritytech/grandpa/1
)、 GRANDPA は、関連する投票情報を他のノードに通知するために使用されます。カスタムSubstrate レガシー プロトコル(
/substrate/<protocol-id>/<version>
) は、ブロック情報の同期とブロードキャスト、軽いクライアント リクエストの処理、およびゴシップ (GRANDPA の使用によって受信される) も行うことができるプロトコルです。等々。
上記の基盤となるアプリケーション層の通信プロトコルと組み合わせると、次の 3 つの検出メカニズムを通じてサブストレート ノード間の接続を確立できます。
アドレスと PeerId が固定されているブートストラップ ノード (ブートストラップ ノード) は、ネットワークのコールド スタートに適しており、ノードがネットワークに参加したばかりの場合は、ブート ノードを介してネットワークに入ります。
mDNS は、ローカル ネットワーク上で UDP パケットをブロードキャストすることにより、ノードが応答すると接続を確立できます。
Kademlia ランダム ウォークでは、接続が確立されると、現在のノードは
FIND_NODE
を通じてリモート ノードに要求し、現在のネットワーク内のノードの構成に関するリモート ノードの視点を取得できます。
上記のプロトコルは合わせて Substrate のユニバーサル ネットワーク層を構成し、このネットワーク層の使用は、 NetworkWorker
およびNetworkService
構造を通じて実装されます。ノード テンプレート ノード プログラムでの使用例は次のとおりです。
分散型通信モデルは、インターネット アプリケーションに新しいパラダイムを切り開きましたが、libp2p 仕様の登場により、開発者がピアツーピア アプリケーションを開発する際に直面する問題点も徐々に軽減されました。 Substrate は、 libp2p の優れた機能を活用して、一般の開発者がブロックチェーン アプリケーションの分散アプリケーション分野における基礎となる通信メカニズムにあまり注意を払うことなく、複雑なカスタム ブロックチェーンを簡単に完成できるようにします。
カウントダウンが始まります!ポルカドット ハッカソン バンコク ステーションはいよいよラストスパートを迎えます
開発者が Polkadot エコシステムと Web3 を深く探索することを奨励するために、 2024 年 7 月 11 日から OneBlock+ コミュニティによって開催されている Polkadot ハッカソン コンペティションが最終段階に入りました。バンコク駅でのデモデーは 11 月 16 日に開催され、コード提出期限(10 月 23 日正午 UTC+8)まで残りわずかです。このコンテストの 2 番目のイベントとして、バンコクには多くの革新的なチームが集まり、賞金総額63 万米ドルの豪華な賞品を目指して競い合いました。最後のチャンスを掴み、Polkadot エコシステムに参加し、あなたのプロジェクトをステージで輝かせましょう!
🏄♂️ 今すぐサインアップ: https://forms.gle/4pNpmp92pnX2wWSZ8
🧺 エントリーガイド:
バンコク駅: https://dorahacks.io/zh/hackathon/polkadot-2024-bangkok/detail
🛠️ Github コードベース: https://github.com/OneBlockPlus/polkadot-hackathon-2024
🗳️ 技術リソース ライブラリ: https://github.com/OneBlockPlus/Technical-docs/blob/main/Substrate-technical-docs.md
8 番目のサブストレート開発上級コース、詳細な分析とプロジェクトの実践は、ブロックチェーンをリードするのに役立ちます
ブロックチェーンテクノロジーの中核をすぐにマスターして、独自のアプリケーションを構築したいですか? OneBlock+ と Polkadot は、第 8 回「基板開発アドバンストおよびプロジェクト実践」コースを開始し、業界の上級専門家であるWang Dachui、Zhou Jun、Sun Kaichao を招き、学生に専門的な指導を提供しました。このコースでは、Substrateのキーテクノロジーを総合的に分析し、最先端の開発スキルを習得し、実際のプロジェクト実践を通じて実践力を向上させます。ブロックチェーン業界で名を上げたいと考えている場合でも、キャリアで飛躍的な進歩を遂げることを楽しみにしている場合でも、このコースは成功への道を開きます。
🪅今すぐ参加: https://wj.qq.com/s2/14825200/0zv4/
詳細については、アシスタントのエマ (🆔 oneblockEmma) を追加してください。