ウェブスケールソーシャルピアツーピアプロトコル
TLDR:
・Solcialは、Web3の技術を活用しながら、Web2のソーシャルメディアプラットフォームに限りなく近い体験をユーザーに提供するために構築されています。
・ブロックチェーンを利用したプラットフォームが直面する障害のひとつに、ユーザー料金があります。Solcialは、プライバシーとコンセンサスを維持しつつ、トークンに関連しない操作に対するユーザー料金を排除するために、Solanaに固定され、libp2pの上に構築されたピアツーピア(P2P)層を構築し、セルフホスティングとピアレプリケーションによってコンテンツ(フィード、Likeなど)を配信しています。
・また、一般的なデスクトップやモバイルアプリと同じ外部プロトコルを持ち、数万人の同時ピアに対応できるよう最適化された、ビーコンノードと呼ばれる特殊なタイプのノードも開発しました。ビーコンは基本的にピン留めサービスのセットで、クリエイターがオフラインになったときにユーザーのコンテンツを保存し、他のユーザーが利用できるようにします。すべてのユーザーコンテンツはIPFSに保存され、検閲可能なサーバーやゲートウェイに依存せずにP2P層を介してアクセスすることが可能です。
はじめに
この記事は、Solcialプロトコルの内部構造によって、適度なデータ交換性能を維持しながら、どのように独自の検閲耐性が得られるかを説明する一連のノートの最初の投稿です。
ネットワークトポロジー
ノードは公衆インターネット上で通信し、HyparView¹プロトコルの改良版を使ってSolcial専用のオーバーレイネットワークを形成します。
各ノードはアクティブなピアのリストを保持し、そのサイズは
log2(N)+1
ここで、Nはネットワーク全体の推定サイズである。Nの値は、現在までにサインアップしたユーザーアカウントの数を求めてブロックチェーンから引き出され、ユーザー数の増加に応じて定期的に更新される。アクティブなピアへの接続は安定した双方向の持続的なもので、それらはゴシップやその他のp2p活動中に直接通信するノードです。各ノードはまた、パッシブピアのリストを保持し、そのサイズは 6.(log2(N)+1)
アクティブピアのいずれかが切断したり、応答しなくなった場合にバックアップピアとして使用されます。アクティブなピア間の接続のための基礎となるプロトコルは、NOISE 暗号化付きの QUIC² で、すべて libp2p³ で駆動されます。
NAT トラバーサルは、ピアのネットワーク状況に応じて使用される 3 つの方法を使用して達成されます。最初の方法は、NATが不要なため、可能な限りIPv4の代わりにIPv6を使用することですが、統計によると、インターネットの40%未満しかIPv6⁴を使用していないそうです。
代替メカニズムとして、libp2pのIDプロトコルを使用してAutoNATを使用し、ネットワーク内の他のノードに私たちのマシンの可視アドレスを問い合わせることができます。このアドレスは、NATの背後にあるピアによって開始され、すでにターゲットマシンへのルータに登録されていますが、これが動作しない状況が存在する場合、我々は、3番目の最も信頼性の高い、しかし高価なオプションにフォールバックします。
3番目のオプションはlibp2p circuit relay⁵プロトコルを使うことで、NATの後ろにある2つのピア間でパケットをリレーする中間ノードを持って、TURN⁶プロトコルの働きを模倣することです。この役割はビーコンノードと、設定された制限でリレーになることを選んだパブリックIPを持ついくつかのピアによって担われることができます。ビーコンノードについては、この投稿の後半で詳しく説明します。
ピアアイデンティティ
ピアの識別には、Solana上のウォレットアドレスの公開鍵に等しいマルチハッシュ7の形式の公開鍵を使用し、Solcialオンチェーンコントラクトに登録されている。ある公開ピアIDを仮定する唯一の方法は、ED25519キーペアの秘密鍵を持っていることです。
このキーペアは、ピア間のすべてのメッセージの受け渡しのための暗号化されたチャンネルを確立するため、またウォレットの所有者によって生成されたと思われるメッセージの真正性を確認するための方法としても使用されます。
オーバーレイメンバーシップ
チェーンに登録されていない公開鍵を持つピアは、HyparViewネットワークオーバーレイに参加することができず、それによって自動的にSolcialピアツーピアネットワークから排除されます。
Solcial p2pに参加したいすべてのピアは、/solcial/publicトピックで起動ノードの1つ(これらの起動ノードのいくつかはビーコンノードでもあります)にJOINメッセージを送ります。HyparViewへのトピックの導入は、元の論文に対する我々の修正の1つです。
ピアからJOINリクエストを受け取ったノードは、まずマルチハッシュがチェーン上に存在し、Solcialアカウントに関連していることを確認します。そして、アクティブなランダムウォークを3に設定したFORWARDJOINメッセージをアクティブなピアの1つに送信し、そのメッセージはすべてのアクティブピアに伝わり、3ホップになるまで現在のホップ数が1ずつ増加します。これは、起動ノードに対するDDoS攻撃の緩和策であると同時に、ノード間の接続性を可能な限り広げ、ランダム化するための効果的な分散化技術でもある。
最初のJOIN受信者の3ホップ以内にいるノードは、最初のJOIN要求者にNEIGHBORメッセージを送信し、それらの間にアクティブな持続的接続を確立します。
これにより、ネットワーク内のすべてのピアが、アクティブなピアが応答しなくなったときや明示的に切断されたときに、ネットワーク修復の目的でパッシブビューに保存できる他のピアに関する新鮮な情報を常に持っていることが保証されます。
効率的なうわさ話
アクティブなピアだけが、ピア間のメッセージ発信に参加する。アクティブなピアは公衆インターネット上にオーバーレイネットワークを形成し、ノード間の接続性グラフにはサイクルが存在する。ネットワーク上のピア間で効率的にメッセージのゴシップを行うには、まずピア間の重複メッセージの伝わりを最小限に抑え、次にメッセージの最適な経路を見つけることが必要です。
これは、ピアをeager-pushノードとlazy pushノードのグループに分割して、ピア間の最小スパニングツリーを形成するEpidemic Broadcast Trees⁸アルゴリズムを使用することで達成されます。Eager-pushノードは、どのノードが受信してもすぐにメッセージを転送します。
遅延プッシュ・ノードは500msごとに定期的に、現在のノードが見たメッセージIDのバッチを取得する。あるノードがレイジープッシュバッチの中に上流の親ノードから受信していないメッセージIDがあることを確認すると、そのノードは接続を再構築(GRAFT)してアクティブプッシュの状態を回復します。これは、いずれかのノードがダウンし、バラバラなグラフが形成された場合の最小スパニングツリー修復機構を構成する。GRAFTメッセージはネットワーク接続を完全に回復させる。
受信したメッセージが以前にアクティブノードから受信したメッセージと重複していることが判明した場合、そのノードへの接続はグラフ内のサイクルとみなされ、PRUNEメッセージを送信することによりLazy-Pushに変換される。
アクティブな接続を刈り込み、遅延リストからの接続に置き換えるもう一つのケースは、遅延ノードを通して我々に到達するために移動したメッセージのホップ数が、熱心なアクティブなピアからのメッセージよりも4ホップ未満であることを観測したときです。これがブロードキャストツリー最適化アルゴリズムです。
コンテンツの普及
前節で説明したp2pプロトコルでゴシップされるメッセージは、Solcialユーザが制作したコンテンツのCIDを持つIPFS Bitswap⁹メッセージである。SolcialでBitswapとIPFSがどのように活用されているかをよりよく理解するために、まずユーザプロファイルの構造を説明しましょう。
ネットワーク上の各ユーザーアカウントは、プロファイルインデックスと呼ばれるものを持っています。このインデックスは、そのコンテンツの最新バージョンのCIDを指し示すものです。このインデックスはEventually Consistent Sequence CRDTであり、そのアカウントが行った操作の不変のログを形成している。
プロファイルインデックスはリンクリストと考えることができ、各要素は前の要素の CID を指し、それがアカウント所有者の秘密鍵によって署名されている場合にのみ、次の要素としてピアに受け入れられます。この形式でエンコードされて投稿されたプロファイルフィードの高レベルの論理的な例は、次のようになります。
{"author"(作者)。"12D3KooWSoeYKbpkb5UoL2T5eiomWRHdxR9cPC4tk11gKU89fFwT" とする。
"prev "です。"QmYtUc4iTCbbfVSDNKvtQqrfyezPPnFvE33wFmutw9PBBk" となります。
"アクション": "append-feed-post"。
"タイムスタンプ": "2022-01-11t15:58z",
"params "を使用します。{
"コンテンツ": "QmV8cfu6n4NT5xRr2AHdKxFMTZEJrA44qgrBCr739BN9Wb"
"enckey "です。"z2DhMLJmV8kNQm6zeWUrXQKtmzoh6YkKHSRxVSibscDQ7nq"
},
"署名": "2Lpnvt23H6qHswCNPmwCCUSas7YNP[...]jV1dC9qdNPR4zDqsCuBX"
}
このようなエントリーは独自のCIDを持ち、IPFS PB-DAG¹⁰オブジェクトとして/solcial/content HyparViewオーバーレイトピックにブロードキャストされることになります。このエントリーは前のエントリーと追加コンテンツにリンクされており、リンクされたCIDに再帰的に問い合わせることで、ユーザーはアカウント全体の履歴とコンテンツを取得することができます。
このオブジェクトはまず、受信側のピアによって、コンテンツの署名が作者の公開鍵と一致するかどうかが検証されます。署名の検証が失敗した場合、送信者ピアはプロトコルに違反したため、現在のノードから永久に追放されます。署名の検証に成功すると、このアカウントによって作成されたコンテンツに関心のある他のすべてのピアにコンテンツが伝わります。
このような CID がピアに受信されると、その作者の操作ログに追加されます。作成者によって実行されたすべての操作の合計が、プロファイルの現在の状態を構成します。
デフォルトでは、各ノードは自分のアカウント・コンテンツとその友人のコンテンツをピン留めし、シードします。ビーコンノードと呼んでいる、インフラの一部として構築している特別なピアは、すべての人のコンテンツに関心を持ち、現在のシーダーがすべてオフラインの場合に備えて、すべてのコンテンツのソーシャル専用IPFSピン留めサービスのような役割を果たすことを除いて、通常のユーザーピアのようなものです。みんなの友達のようなノードだと考えてください。このノードがなくてもネットワークは機能しますが、このノードがあることで、次のような付加的なレイヤーが生まれます。
アクセスを読む
Solcial p2p overlay 上の誰もが、IWANT と IHAVE Bitswap メッセージを /solcial/content トピックに、そのアカウントのトップレベルのルートインデックスの CID でブロードキャストし、すべてのリンクした CID を再帰的に要求することによって、任意のユーザーコンテンツを照会、ダウンロード、提供することができます。
アカウントの初期同期、またはアカウントの最新エントリーの取得は、/solcial/syncトピックにHEADメッセージをブロードキャストすることで達成され、シーダーである他のピア(ビーコンノードを含む)は、彼らが認識している最新のコンテンツのCIDで応答します。ユーザーハンドルとユーザー公開鍵の変換は、Solanaブロックチェーンに問い合わせることで行われます。
前エントリーフィールドは、競合するHEADを解決し、最新のエントリーを決定するために使用することができます。
書き込みアクセス
アカウントログへの書き込みを行うには、アカウントIDに対応するED25519キーペアの秘密鍵を所持している必要があります。この鍵を持つことで、ユーザーはログに追加するエントリーに、 ネットワーク上の他のピアに拒否されない有効な署名を生成することができるようになります。
特権的なコンテンツへのアクセス
ユーザーが投稿したコンテンツの中には、Tier-1やTier-2の購読フィードのように、一部の受信者グループのみを対象としたものがあります。これらの投稿は、まず対称型 AES-256 暗号化キーを使用して暗号化されます。その鍵のハッシュは、元の投稿のコンテンツ・メタデータに添付されます。
鍵は、libp2p のハンドシェイク中に確立された NOISE キーを介して、資格のあるピアのランダムなサブセットに配布されます。投稿者は、すべてのユーザーにとってプロセスがほぼ瞬時になるように、ビーコンノードもこの鍵交換スキームに参加することを選択できますが、自分のコンテンツが非常に機密性が高いと考える場合は、その必要はありません。資格のあるユーザーがコンテンツを解読したい場合、暗号化キーのハッシュを含むGETKEYメッセージを/solcial/keyexchangeオーバーレイトピックに送ります。
その鍵を持っているオンライン中のすべてのピアが、ブロックチェーンを照会し、ユーザーがコンテンツにアクセスするために必要なトークンを保持しているかどうかを確認することで、その鍵を取得するピアの適格性を確認します。検証に成功した後、鍵はゴシッププロトコルをバイパスする直接のquic/noise接続を使用して要求元のピアに送信されます。
プラットフォーム対応
この検閲を受けないコンテンツのためのピアツーピアプロトコルは、デスクトップとモバイルクライアントでのみ利用可能で、Webインターフェースでは利用できません。これは、ブラウザの制限によるものです。ブラウザは本来、サーバーにホストされているコンテンツの消費者として設計されており、そのセキュリティモデルは、他のマシンからのランダムな接続を受け入れることを禁じています。
ブラウザの仕組みとブラウザタブの寿命が短いことから、ウェブ版はほぼ常に一元管理され、ウェブインターフェースを通じて生成されたコンテンツはビーコンノードによってp2p上にミラーリングされます。ウェブクライアントが消費するコンテンツは、すべてP2Pのコピーとなります。P2Pは真実の源なのです。
基礎となる技術スタックは、Rust、React NativeとTauriへのバインディングを持つlibp2pを使用して実装されています¹¹。
[1] Leitao, Joao, José Pereira, and Luis Rodrigues. 「HyParView: A membership protocol for reliable gossip-based broadcast".
[2] https://en.wikipedia.org/wiki/QUIC
[3] https://libp2p.io/
[4] https://www.google.com/intl/en/ipv6/statistics.html
[5] https://docs.libp2p.io/concepts/circuit-relay/
[6] https://datatracker.ietf.org/doc/html/rfc5766
[7] https://docs.libp2p.io/reference/glossary/#multihash
[8] Leitao, Joao, Jose Pereira, and Luis Rodrigues. "エピデミック・ブロードキャストツリー" 2007 26th IEEE International Symposium on Reliable Distributed Systems (SRDS 2007). IEEE, 2007.
[9] https://docs.ipfs.io/concepts/bitswap/
[10] https://github.com/ipld/ipld/blob/master/specs/codecs/dag-pb/spec.md
Solcialについて
Solcialは検閲を恐れずにユーザー同士が交流し、コンテンツ制作者が市場価値で公正に報われることでユーザーにWeb3の力を与えることを目的とした分散型ソーシャルネットワークです。
お問い合わせ
Telegram: https://t.me/solcial
Twitter: https://twitter.com/solcialofficial
Discord: https://discord.com/invite/3EpaAbcRPp
Blog: https://blog.solcial.io/
Web: https://solcial.io
Email: [email protected]
Linktree: https://linktr.ee/solcial