InterPlanetary File System
概要
IPFS (InterPlanetary File System) は Protocol Labs 社を中心に開発されている P2P 技術を使用したファイル配信のための分散ストレージおよびそのプロトコルの名称である。Gnutellaや BitTorrentといった P2P ファイル共有と同類の技術だが、Web (HTTP) に代わるプロトコルや分散ファイルシステムとなることを目的としている。実体は BitTorrent における Swarm 相当の P2P 機能に git のバージョン管理機構を取り入れたような構造になっている。
暗号通貨、特に Ethereum が登場する前にも P2P 技術を用いた分散アプリケーション開発を目的としたプロジェクトがあった。
なお地球から最も近い火星の探索機であるキュリオシティの信号が地球に到達するまでに約 30 分かかり、速度は有指向性の HGA で 32kbps、無指向性の LGA で 15pbs である。そのような過酷な通信環境に IPFS が適用できるかは分からない。
Table of Contents
特徴
IPFS はいくつかの既存技術を組み合わせたものであり、俯瞰的には BitTorrent におけるデータ分散とブロック交換の設計に git のデータ構造モデルを取り入れたものと考えて良い。
分散ハッシュテーブル
BitTorrent を引き継いで Kademlia を使用している。
アドレッシング
データの特定に関わる部分。
Contents Addressing
IPFS でのデータの特定は git や BitTorrent と同様にデータ自体の内容をハッシュ化したアドレスに基づいている。これは一般に内容アドレッシング (contents addressing) と呼ばれる方法である。内容アドレスによるデータ指定はデータの内容が変わらない限り変わることがなく、またそのデータがどこで (あるいは何百台のマシン上で) ホスティングされているかを気にする必要がない。
ネットワーク上でデータを特定するアドレスには、例えば URL や Unix パスのような、そのデータをホスティングしているサーバやディレクトリ構造、ファイル名といったロケーションに強く関連付けられたアドレスが用いられてきた (このような方法は location addressing と呼ばれる)。しかし、ロケーションに基づくアドレスは本質的に恒久的ではなく、例えば 1990 年代後半から 2000 年代前半にかけての論文でしばしば見られる http://www.university.edu/~author/... といった URL は既にアクセスできなくなっているものが多い。このため論文などでは登録制の DOI (digital object identifier) を使用して恒久的なポインタを得ているが、内容アドレッシングはそれを自然に行っているとも言える。
IPLD
IPLD (InterPlanetary linked data) は暗号通貨や git など内容アドレッシングに基づくさまざまなシステムで相互運用できるように導入されている自己完結型のアドレス記述方法。意図するところは Web において http, https, ftp などを URL で包括的に記述するスキーマと同じと思われる。
IPNS
IPNS (InterPlanetary name system) は IPFS のノード ID (より正確には Peer 公開鍵のハッシュ値) を簡易的な固定 URL として使用するための機能。
IPFS を用いてあるディレクトリ以下のファイルを Web のように公開したいとき、単純に IPFS にディレクトリを add するだけでもブラウザからアクセスできるようになるが、その URL のハッシュ部分はファイルを修正して add するたびに変わることから同じ URL で最新版を配布したい場合には都合が悪い。そこで IPNS を使用してコンテンツのアドレスを固定的なノード ID にマッピングすることができる。
$ ipfs add -r docroot/
...
added Qm............................................ docroot/stylesheet
added QmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA docroot
341.58 MiB / 341.58 MiB [===========================================================================================================================================] 100.00%J
$ ipfs daemon
Initializing daemon...
...
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready
--- 別の terminal で ---
$ ipfs pin add -r QmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
上記の例では追加したディレクトリ以下のファイルを http://127.0.0.1:8080/ipfs/QmAAAA...
や (反映に時間がかかるが) https://gateway.ipfs.io/ipfs/QmAAAA....
で参照できるようになる。しかしこの QmAAAA...
部分はファイルの内容が変わるたびに変わってしまう。ここで ipfs name publish
を使用してこのノードのコンテンツとして公開する。
$ ipfs name publish QmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Published to QmBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB: /ipfs/QmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
コマンドの実行には数分かかるかもしれないが、完了すれば http://localhost:8080/ipns/QmBBBB...
のようなノード ID を用いた URL でアクセスできるようになる (プレフィクスが /ipns/
になることに注意)。そして、ファイルの内容を変更して再び add と name publish を行えば同じ URL で更新された内容を参照することができる。
Cloudflare には IPFS ゲートウェイが実装されていて IPNS によって公開されているコンテンツをよりわかりやすい URL でホストすることができる。また DNS TXT レコードを使用してドメイン名を IPNS に割り当てることもできるらしい。
IPFS Internal
Merkle DAG
IPFS がバージョン付けられたデータを保存する構造は git の DAG 構造を参考にしている (IPFS では Merkle DAG (directed acyclic graph; 暗号論的ハッシュに基づく有向非巡回グラフ) と呼んでいるが)。git の DAG と多くの点で類似しているが長大なファイルを分割して保存するために List の不変オブジェクトに置き換えられている。
技術スタック
- Self-Certified Filesystem
- Self-Certified Filesystem (SFS) は
/sfs/[location]:[host_id]
hash_id = hash(public_key || location)
SFS ファイルシステムでの名前からそのロケーションと公開鍵が正しく関連付けられていることを確認することができる。 - IPNS
内部の用語
- ブロック
- データの単位となるファイルはチャンク (分割された断片) として P2P ネットワーク全体に保存され、そのハッシュによって断片を検索し元のファイルを復元することができる。
- Bitswap
- ネットワーク内の他のピアとの間でブロック (チャンク化されたファイル) の交換を行うためのコアモジュール。必要なブロックを要求したり、ローカルに保存しているブロックを要求の会ったピアに送信する。
- Switch (Swarm)
-
IPFS は様々な P2P プロトコルを駆使して分散ストレージとして機能するが、それらの接続機能や状態管理を包括的に行うモジュール。
Ethereum では IPFS に相当する P2P の分散ストレージと配信レイヤーを Swarm と呼んでいることから混乱が生じるかも知れない。
- ブートストラップ
- 最初に接続する IPFS ノード。
ipfs bootstrap list
で表示できる。
IPFS Desktop
IPFS Desktop は GUI 上で IPFS のファイル操作や IPFS デーモンの駆動状況を見るためのアプリケーションで。Electron (JavaScript) で実装されており、バージョン 0.12.1 において Mac OS, Windows, Linux 上で利用することができる。同時に CLI (コマンドラインツール) もインストールされる。
% ipfs add hazmat-webserver-1.2.6.zip
added QmVfXMYvzqsk2QCUtfg8ofVjKwP5e6BMuch5Vo1zwLSW9a hazmat-webserver-1.2.6.zip
60.62 MiB / 60.62 MiB [=============================================================================================================================================] 100.00%