はじめに
IPFS(InterPlanetary File System)は、分散型のファイルストレージとファイル共有システムです。従来のHTTPベースのファイルストレージとは異なり、IPFSはデータをP2Pで分散させることで、より効率的かつ堅牢なデータアクセスを提供します。
同一コンテンツには同じIDが割り振られ、P2P通信でデータを取得するということはご存知の方は多いと思いますが、裏側ではどのような技術が使われているか少し調べました。
プロトコルスタック
IPFSはいくつかのモジュールプロトコルのスタックであり、各プロトコルの実装は仕様を満たしていれば何を使っていても問題ありません。各レイヤーについて、主に使われている技術を紹介します。
IPFSは以下の5つのレイヤーからなっています。(IPFS specsより引用)
- naming - a self-certifying PKI namespace (IPNS)
- merkledag - data structure format (thin waist)
- exchange - block transport and replication
- routing - locating peers and objects
- network - establishing connections between peers
naming
IPFSはCIDというコンテンツの内容ごとに固有のIDで管理されているのは有名ですが、それでは内容が少し変わっただけで毎回CIDが変わるのが面倒です。これを解決するのがIPNS(InterPlanetary Name System)という公開鍵を使った自己検証的なIDを作成して、ファイルと紐付けることができます。
これはSFS(Self-certifying File System)というものが元になっているのですが、詳細は以下リンクより確認ください。
merkledag
IPFSではデータを分割して保存しているのですが、その分割されたデータ同士の繋ぎ合わせをMerkle DAGを使って表現しています。
このデータ構造はGitにも活用されています。
message MDagLink {
bytes Hash = 1; // リンク先オブジェクトのハッシュ値
string Name = 2; // リンクの名前
uint64 Tsize = 3; // リンク先オブジェクトのサイズ
}
message MDagNode {
MDagLink Links = 2; // 他のデータへの参照の配列
bytes Data = 1; // 分割データ(256kb以下)
}
上記データ構造はSpecより引用しました。
Gitでイメージしてもらうと分かると思うのですが、この形式だと例えばファイルの一部のみ変更があった場合に、そのファイル全体を残す必要はなく、分割されたデータのみ変更を残しておけば良いので全体としてストレージを節約できます。
実際にはIPFSではIPLD(InterPlanetary Linked Data)というものを使っていて、これはMerkle DAGを含めたデータ構造を抽象化したものです。
IPFSではファイルをCIDで識別すると述べましたが、たとえばブロックハッシュなど、ブロックチェーンエコシステムの中でもコンテンツを識別するのにハッシュは様々な使い方をされていますが、IPLDはこれら異なるプロトコルでデータ構造を統一することを目的としています。
exchange
実際のデータのやり取り部分です。
データのやり取りのプロトコルは主にBitswapを用いており、これはBitTorrentを一般化したものです。
この部分はデータのやり取りなので、実際はHTTPでも問題はありません。
routing
ルーティングは2つの種類に分かれています。
- ノードのルーティング
- コンテンツのルーティング
いずれにせよDHT(Distributed Hash Table)が最もよく使われています。
DHTにもいくつか種類があり、Kademilia DHT, Coral DSHT等があります。
システム全体で巨大なDHTを保持しており、各ノードはその一部分を担っています。
例えばコンテンツのルーティングではkeyはCIDで、valueには保存されてるノードのIDやIPアドレスが入っており、この情報を元にデータを保持しているノードにアクセスします。
network
通信はP2Pで行われており、以下の特徴等を持ちます
- NAT越え
- TCP, UTPなどをサポート
- 暗号化
- リンク多重化
ネットワークの構成(ルーティングも含む)に関してはlibp2pが使用されています。
libp2pはProtocol Labsが開発しており、IPFS, Filecoinと同等に重要なプロジェクトとして位置付けられています。
まとめ
IPFS自体の利用はチュートリアルを読めば割と簡単に実装できますし、IPFSにデータをアップロードするサービスもあるのでなんとなくの概念は知っていましたが、どのような技術が使われてるかを深堀りすると、各レイヤーそれぞれ本にしなきゃ説明できないくらいの技術を使っていました。
この先さらに進むのは難しいですが、概要を掴む良いきっかけになりました。