BitfinexおよびTetherがHypercoreという会社とともにHolepunchというP2Pアプリ構築プロトコルとそれを使ったKeetというアプリケーションをローンチしました。今週ツイッターを見ていて面白かったことの1つが、FTX_AccessというFTXの機関投資家向け営業部門の公式ツイッターアカウントが「どのようにトークンを配布するのか?」と聞く流れが失笑を買っていたことです。https://twitter.com/FTX_Access/status/1551525509363892224...
さて、最近ビットコイン・ライトニングやその周辺でWeb5、ImperviousなどP2Pアプリケーション基盤が乱立していますが、これらと比較してHolepunchの特徴が何なのか、調べてみました。
HOLEPUNCHの概要
Holepunchは比較的シンプルにP2P通信のNAT越えを支援するP2Pプロトコルです。UDP hole punchingというNAT越えの技術があるので、そこから名前を取ったのかもしれません。(単純にNATという障壁に穴を開けるからhole punchingというのでしょうが)
NAT越えとは
多くの一般家庭ではルーターに複数のデバイスが接続されており、1つのグローバルIPを共有しています。NATは外部との通信をどのデバイスに取り次ぐかを扱います。例えばWifiに接続したスマートフォンで取得しにいったデータがちゃんとスマートフォンに送られてくるのはNATのおかげです。
しかし、例えば外部から初めて接続してくる通信などは内部のどのデバイスに対応する通信かわからないため取り次ぐことができません。これをNAT越えの失敗といいます。
P2Pソフトでは初めて接続するノードにちゃんと通信を届けるため、何らかの方法でNAT越えをすることが一般的です。ただし、ビットコインのノードを自宅で運用したことのある方は気づいているかもしれませんが、自分から接続したノードとだけ通信できればいい場合などにはNATがどのデバイスの通信なのか正しく判断できるため、必ずしもNAT越えが必要とは限りません。両者ともにNATの後ろにいる場合にはNAT越えのスキームが必要です。
一般的なNAT越えのスキームは、どこかにあるマッチングサーバーのようなものに両者が接続して、そこを媒介に互いのIP・ポートを知り合ってからP2P通信を行います。Holepunchは中央集権的なマッチングサーバーがないのにNAT越えできることからDistributed Holepunchingと表現されています。
仕組み
仕組みは非常にシンプルで、開発者が2年前に投稿した動画がわかりやすいです。https://twitter.com/mafintosh/status/1259596991857930243
NATの後ろにいないいくつかのブートストラップ用ノードに最初に接続しておいて、それらに接続したい相手の公開鍵を元にIPとポート番号を問い合わせます。そのIP・ポートに対してリクエストを出すと自分のNATはデバイスと通信相手を関連づけられますが、相手のルーターから見ると外部からの初見の通信なのでまだ相手のNATは越えられません。そこで相手がブートストラップ用ノードからの通知を受けとり、あなたのIPとポート番号に対して接続することによってNATを越えた通信が確立するというものです。