InterPlanetary File System

Takami Torao IPFS 0.6.0 #P2P #ipfs
  • このエントリーをはてなブックマークに追加

概要

IPFS (InterPlanetary File System) は Protocol Labs 社を中心に開発されている P2P 技術を使用したファイル配信のための分散ストレージおよびそのプロトコルの名称である。GnutellaBitTorrentといった P2P ファイル共有と同類の技術だが、Web (HTTP) に代わるプロトコルや分散ファイルシステムとなることを目的としている。

暗号通貨、特に Ethereum が登場する前にも P2P 技術を用いた分散アプリケーション開発を目的としたプロジェクトがあった。

なお地球から最も近い火星の探索機であるキュリオシティの信号が地球に到達するまでに約 30 分かかり、速度は有指向性の HGA で 32kbps、無指向性の LGA で 15pbs である。そのような過酷な通信環境に IPFS が適用できるかは分からない。

  1. 概要
  2. 特徴
    1. 分散ハッシュテーブル
    2. アドレッシング
      1. Contents Addressing
      2. IPLD
      3. IPNS
    3. IPFS Internal
      1. Merkle DAG
    4. 技術スタック
    5. 内部の用語
  3. IPFS Desktop
  4. 参考文献

特徴

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 に割り当てることもできるらしい。

Fig 1. IPNS を使用した Web 画面。

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 (コマンドラインツール) もインストールされる。

Fig 2. IPFS Desktop の通信統計とアップロードされたファイル。
% ipfs add hazmat-webserver-1.2.6.zip
added QmVfXMYvzqsk2QCUtfg8ofVjKwP5e6BMuch5Vo1zwLSW9a hazmat-webserver-1.2.6.zip
 60.62 MiB / 60.62 MiB [=============================================================================================================================================] 100.00%

参考文献