新着:HeliusがLight Protocolを買収
スパムをQUICに軽減する方法:SolanaとQUICについて知っておくべきこと
ブログ/基礎

スパムをQUICに軽減する方法:SolanaとQUICについて知っておくべきこと

Developer Experience EngineerXの0xIchigoLinkedInの0xIchigoGitHubの0xIchigo
読了時間:12分

この記事では何を解説しますか?

Solanaは、現在市場で最も高速かつスケーラブルなブロックチェーンです。トランザクション速度に優れ、さまざまなユースケースに最適なチェーンとして知られています。こうした実績がある一方で、Solanaのネットワークはダウンタイムに関する恐怖、不確実性、疑念(一般にFUDと略されます)の対象となってきました。このFUDは過去には妥当な懸念でしたが、現在では根拠がありません。なぜでしょうか?Solana Labsのエンジニアが過去1年間にわたり、さまざまなネットワークアップグレードに取り組んできたからです。特に注目すべきなのは、トランザクションの受信に使用していたSolana独自のraw UDPベースプロトコルをQUICに置き換えたことです。

この記事では、ネットワークプロトコル、TCP、UDPの仕組みを確認し、QUICが両者をどのように改善しているかを解説します。その後、Solanaに焦点を移し、QUICがもたらす固有の利点について説明します。この記事の目的は、このネットワークアップグレードがSolanaにとって重要な技術的マイルストーンである理由を包括的に理解できるようにすることです。

Solanaのネットワークアップグレード

2022年12月13日、Solana Foundationは「Solanaのネットワークアップグレード」というニュース記事を公開しました。この記事では、ネットワークに対して進められている複数のアップグレードと、それぞれの進捗状況が説明されています。アップグレードは以下のとおりです。

QUIC

  • Mainnet-betaで稼働中

ステーク加重QoS

  • Mainnet-betaで稼働中

手数料市場

  • Mainnet-betaで稼働中。RPCとウォレットのサポートも近日中に提供予定です
  • 進捗状況はこちらで確認できます

トランザクションサイズの拡大

  • 現在開発中

コンパクトな投票状態

  • Testnetで稼働中

Solanaが過去にダウンタイムを経験した主な理由の1つは、スパムです。例として、以下が挙げられます。

  • 2021年9月14日のGrape IDOスパム
  • 2022年1月6日〜12日に発生したDDoS攻撃
  • 2022年4月30日〜5月1日に発生したNFTミントスパム

QUICの導入以降、Solanaではスパムに関連するダウンタイムは報告されていません。これは、Solanaのネットワークトラフィックとデータ受信を改善した画期的な成果としてQUICを位置付けるものです。QUICについて学ぶ前に、まずネットワークプロトコルの仕組みを確認する必要があります。ネットワークの基礎を深く理解することで、QUICがSolanaのネットワークにもたらす真の影響を把握できます。

ネットワークプロトコルとは?

ネットワークプロトコルとは、同じネットワーク上のデバイス間でデータを送信する方法について定められた一連のルールです。ネットワークプロトコルがあれば、内部構造や設計が異なっていても、接続されたデバイス同士が容易に通信できます。

パリのレストランで、友人と向かい合って座っている場面を想像してください。2人ともフランス語で話すことに決めたため、会話はスムーズに進みます。フランス語で話すという共通の決定は、双方が理解できる文法規則、語彙、発音のセットに合意することです。

ネットワークプロトコルも、接続されたネットワークデバイスに対して同じように機能します。パリのレストランでの会話において、フランス語が「プロトコル」の役割を果たすのと同様です。TCP、UDP、QUICのいずれかを使用するという決定は、情報交換のために確立された一連のルールと規約に合意することを意味します。特定のネットワークプロトコルに従うことで、接続されたデバイス同士が混乱なく互いを理解できます。

TCPとは?

Transmission Control Protocol(TCP)は、ネットワーク上の2つのエンドポイント間でデータストリームを送信するための標準化された通信インターフェースです。Vint CerfとBob Kahnは、単一構造のプロトコルであるTransmission Control Programを開発し、それをTCPとInternet Protocol(IP)からなるモジュール型アーキテクチャに分割しました。このスイート全体はTCP/IPと呼ばれます。この記事でTCPという略語を使用する場合、スイート全体ではなく、Transmission Control Protocolを指します。

TCPはコネクション指向です。データを送信する前に、クライアントとサーバー間で接続を確立する必要があります。TCPは、同期(SYN)、同期確認応答(SYN-ACK)、確認応答(ACK)という3段階のハンドシェイクを使用して接続を確立します。SYNは、握手を求めて手を差し出し、相手に話す準備ができているか尋ねることだと考えられます。SYN-ACKは、相手が手を握り、話す準備ができていると伝えたうえで、会話を続けるか尋ねることです。ACKは、こちらも相手の手を握り返し、会話を続けたいと伝えることです。これでセッションが確立されます。双方が互いに接続されていることを認識し、情報を共有する準備ができていることに合意します。

TCPはデータをパケットに分割し、ネットワーク経由で送信します。各パケットには少量の付加データが追加されます。この付加データには、紛失したパケットや順序がずれたパケットを検出するためのシーケンス番号と、パケット内のエラーを検出するためのチェックサムが含まれます。

会話が中断された場合、正しく聞き取れたことを確認するため、相手にもう一度話してもらいます。TCPも自動再送要求(ARQ)を使用して、同じように中断を処理します。問題が発生すると、ARQは送信者に破損または紛失したパケットを再送するよう指示します。その後、TCPはデータ送信速度を落とすようユーザー側に通知し、転送中に存在できる未確認パケットの数を制限します。エラーが解消されると、TCPは輻輳を回避する仕組みを使いながら、徐々に速度を上げます。

TCPはすべてのトラフィックを順序付けるため、あらゆるユースケースに適したプロトコルではありません。そのため、データの一部が紛失または破損すると、それ以降のすべてのパケットが待機する必要があります。しかし、待つ必要がないとしたらどうでしょうか?

UDPとは?

User Datagram Protocol(UDP)は、ネットワーク経由でデータを送信するために使用される標準化された通信インターフェースです。TCPとは異なり、UDPはコネクションレスであり、データパケットの配信、順序、重複の防止を保証しません。UDPにはハンドシェイクのやり取りがないため、データ送信は基盤となるネットワークの不安定さの影響を受けやすくなります。宛先との接続を確立するために時間を費やさないので、UDPはほかのプロトコルより高速です。ただし、この性質から「Unreliable Datagram Protocol」と呼ばれることもあります。

UDPは、ネットワーク経由でデータグラムを送信することで機能します。データグラムは、送信元から宛先へのルーティングに使用される情報を含む、より自己完結したデータの集合です。この情報が含まれているため、ルーティング時にほかのデータグラムへ依存しません。データグラムはヘッダーとデータで構成されます。ヘッダーには、いずれも16ビット長の4つのフィールドがあります。任意の送信元ポート、宛先ポート、長さ、任意のチェックサムです。送信プロセスは以下のとおりです。

  • 送信側アプリケーションがUDPソケットを作成します
  • 送信側アプリケーションが、宛先ポートやその他の関連情報を含むヘッダーとともに、送信するデータをUDPデータグラムに格納します
  • データグラムがルーティングと配信のためにIPレイヤーへ送られます
  • IPレイヤーがデータグラムを受け取ってUDPレイヤーへ転送し、ヘッダーが取り除かれます
  • データグラムが指定されたポートで待ち受けているアプリケーションへ送られます

UDPは、混雑した部屋の反対側にいる人へ話しかけるようなものです。相手に聞こえたかどうかを気にせず、返事も待たずに声を張り上げます。この場合、長いやり取りをせず、メッセージをすばやく伝えることが目的です。相手が話のすべてを聞き取れていない可能性があるためリスクはありますが、非常に効果的な場合もあります。

TCPのように信頼性の高い選択肢があるのに、なぜUDPのようなコネクションレスの通信プロトコルを使用するのでしょうか?UDPは、時間的制約の厳しいアプリケーションや、ある程度のデータ損失を許容できるケースで非常に役立ちます。友人とビデオゲームをプレイしているときに数フレーム失われるほうが、絶えず停止やバッファリングが発生するよりはるかに優れています。UDPは、VoIP通話、Domain Name System(DNS)クエリ、モニタリング、ロギングにも使用されます。

QUIC:効率性と信頼性の両立

QUICは、2013年にGoogleのJim Roskindが設計した最新のトランスポート層プロトコルです。TCPの信頼性とUDPの低レイテンシという利点を融合し、高速かつ安全な非同期通信に最適化された環境を実現します。QUICは、TCPの特徴である安全なセッションと高度なフロー制御戦略を、UDPが提供する柔軟で高速なフレームワークに組み込んでいる点で独自性があります。

QUICでは、暗号鍵とプロトコルの詳細情報の交換を最初のハンドシェイクに統合することで、接続確立が効率化されています。このハンドシェイクは、常にTransport Layer Security(TLS)によって安全に暗号化されます。このプロトコルはUDP経由の多重化接続を可能にし、複数の独立したデータストリームが互いに影響を与えることなくエンドポイントへ到達できるようにします。QUICは各ストリームのフローを個別に制御するため、1つのストリームでエラーが発生しても、ほかのストリームを妨げません。これにより、TCP接続で頻繁に問題となるヘッドオブラインブロッキング(先頭のパケットが原因で、一連のパケットがキュー内で待機させられる状態)を防ぎやすくなります。

パケットが紛失または破損した場合、QUICはデータをインテリジェントに再送し、通信の完全性と継続性を維持します。さらに、QUICはネットワーク環境の変化に対して堅牢です。各パケットには、送信元にかかわらずサーバーへの接続を一意に識別する接続識別子が含まれています。すべてのパケットにこのIDが含まれ、元の接続が引き続き有効であるため、別のパケットを送信することで接続を再確立できます。たとえるなら、別の部屋へ移動しても会話が途切れず、そのまま続けられるということです。

もう一度、混雑した部屋で友人と話そうとしている場面を想像してください。今回は暗号化されたトランシーバーを持っているため、安全で明瞭なやり取りができます。会話がさまざまな話題に及ぶなか、友人はメッセージを受け取るたびに親指を立てて応答します。困惑した表情を見せたら、理解されなかったメッセージをもう一度伝え、情報が失われないようにします。そして、どちらかが別の部屋に移動しても、会話は途切れません。これがQUICの本質です。堅牢で、適応性が高く、効率的な通信を実現します。

SolanaがQUICを実装する仕組み

QUICはSolanaに次のような利点をもたらします。

  • 接続確立時間の短縮:ハンドシェイクプロセスを最適化することで、QUICはレイテンシを最小限に抑えます
  • 多重化と効率的なパケット管理:ヘッドオブラインブロッキングを発生させずに複数のデータストリームを同時処理できるため、トランザクションのスループットと効率が向上します
  • 適応性と回復力:変化するネットワーク状況に適応するよう設計されています。これは、Solanaのような分散型かつ非中央集権型のシステムに不可欠な要件です
  • ネットワーク最適化に向けたカスタマイズ:QUICは柔軟性が高いため、Solanaの実装のように、特定のネットワーク性能とセキュリティ目標に合わせて調整できます

QUICは、ユーザートランザクションを受信するポートに追加されています。これにより、特定のアクターからのトラフィックを制限し、ネットワークが正当なトランザクションの処理に集中できるようになります。QUICはSolanaで稼働しており、リリース1.13.4でMainnet-betaに全面導入されました。統合後、ネットワークの安定性とスループットは大幅に向上しています。

こうした進歩にもかかわらず、最近のネットワーク輻輳を受けて、Solanaが以前採用していたUDP実装と比較したQUICの計算効率について議論が起きています。批判的な立場からは、raw UDP方式ではバリデーターがハンドシェイクスパムや暗号化の管理ではなく、トランザクション処理だけに集中できたと指摘されています。さらに、Solanaの実装では、鍵の交換と検証は最初のハンドシェイクに含まれていません。Solanaは、IPアドレスを検証するために「チャレンジパケット」を送信するQUICのオプションを使用しています。このチャレンジの目的は、ハンドシェイクの最初の段階で証明書を検証するのではなく、IP検証後の後半で実行することです。SolanaでスパムやDDoS攻撃に関連するダウンタイムが発生したかどうかについては、2月に発生したSolanaのネットワーク停止はサービス拒否と見なせる可能性があるため、依然として議論の余地があります。

ネットワークが進化するなかで、ネットワークに導入された実装を継続的に見直し、改善することが重要です。QUICはTCPとUDPが抱える多くの問題の解決を目指していますが、振り返ってみると、その有効性には議論の余地があります。重要なのは、ハードウェア上でどのように動作するかを考慮することです。TCPはシンプルであるため、ハードウェア上ではQUICよりはるかに効率よく動作します。AES命令セットを使用すれば、TCPベースのプロトコルはQUICより高いスループットを実現し、TPSの面でも効率的になると十分に主張できます。

特筆すべき点として、Jump CryptoのチームはQUICの限界を押し広げています。同チームは、Solana向けの新しいバリデータークライアントであるFiredancerの開発中に、独自の堅牢でスケーラブルな実装を作成しました。Firedancerのネットワーク機能は、ハードウェアアクセラレーションによる負荷分散の一種である受信側スケーリングを活用できるよう、ゼロから設計されています。この並列アーキテクチャにより、各CPUコアが受信トラフィックの一部を効率的に処理できます。同チームは次のように投稿しています。

Firedancerが達成したQUICの技術的マイルストーンに関するデモとスレッドは、こちらで確認できます。

まとめ

お疲れさまでした!この記事では、ネットワークプロトコルの基礎を取り上げ、TCPとUDPの役割、そしてQUICへの発展を解説しました。また、SolanaのQUIC実装について確認し、ネットワーク強化における重要な役割を紹介しました。QUICによって、スパムやDDoS攻撃に対するSolanaネットワークの回復力は向上しました。一方、ネットワークの成長に伴い、計算効率や実装の細かな違いを巡る課題と議論も明らかになっています。

QUICは、高スループットかつ低レイテンシのネットワークを実現するというSolanaの中核的な目標を体現しています。多重化とパケット損失からの復旧機能により、Solanaはパフォーマンスとスケーラビリティに関する議論の最前線に立っています。Firedancerチームの実装はQUICの適応性を示しており、変化するネットワーク要件に対応するための独自最適化の可能性を明らかにしています。

Solana開発者がQUICを理解すれば、アプリケーションアーキテクチャからトランザクションエラーまで、さまざまなテーマについてより適切な判断を下せるようになります。Solanaは絶えず進化しており、QUICも同様です。Solana上で高性能なアプリケーションを構築するには、最新のネットワーク変更を把握し続けることが最善の方法です。開発者でなくても、QUICを技術的に深く理解することで、なぜSolanaが高速性とスケーラビリティで知られる高性能なブロックチェーンなのかを理解できます。

ここまで読んでくださった皆さん、ありがとうございます!Solanaの最新情報を見逃さないよう、以下にメールアドレスを入力してください。さらに詳しく知りたいですか?Heliusブログの最新記事を読み、今すぐSolanaの旅を続けましょう。

その他のリソース/参考資料

Heliusを購読

Solana開発の最新情報や新しい記事の公開通知を受け取れます

拡大画像