インタープラネタリー・ファイル・システム (IPFS)
インタープラネタリー・ファイル・システム (IPFS) は、世界中のコンピュータが巨大なピアツーピアネットワークの一部としてファイルを保存し、提供できる分散ファイルストレージプロトコルです。
世界のどこにでもあるコンピュータがIPFSソフトウェアをダウンロードし、ファイルをホスティングおよび提供を開始できます。
誰かが自分のコンピュータでIPFSを実行し、ファイルをIPFSネットワークにアップロードすると、そのファイルは他のIPFSを実行している誰でも見ることができ、ダウンロードできます。
IPFSに追加されたすべてのファイルには、そのファイルの内容のハッシュから派生したユニークなアドレスが付与されます。このアドレスはコンテンツ識別子 (CID) と呼ばれ、ファイルのハッシュと使用されたハッシュアルゴリズムのユニークな識別子を組み合わせた単一の文字列です。
IPFSは現在、デフォルトでSHA-256 ↗を使用しており、256ビット(32バイト)の出力を生成し、その出力はBase58 ↗でエンコードされます。Base58は、ビットコインのために最初に開発されたバイナリからテキストへのエンコーディングスキームであり、特定のフォントで互いに間違えられる可能性のある文字(ゼロと大文字のOなど)が含まれていないという利点があります。
CIDは通常、QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6ucoのように見えます。
ただし、同じハッシュはBase32 ↗や、他のサポートされているハッシュアルゴリズム(SHA-3 ↗や[BLAKE2](https://en.wikipedia.org/wiki/BLAKE_\(hash_function\))でエンコードされることもあります。 ↗
IPFSは基本的にC分散ハッシュテーブル (DHT) ↗であり、CIDからそのCIDでアドレス指定されたコンテンツを持つ人々へのマッピングを行います。ハッシュテーブルは分散されており、ネットワーク内の単一のノードが全体のテーブルを保持しているわけではありません。代わりに、各ノードはハッシュテーブルのサブセットと、他の関連セクションを保存しているノードに関する情報を保存します。
誰かがIPFSにコンテンツを「アップロード」すると言うとき、彼らが本当に意味しているのは(通常)、CIDから自分のIPアドレスへのマッピングをDHTに追加することによって、ネットワークに自分が何らかのコンテンツを持っていることを知らせているということです。データをダウンロードしたい他の誰かは、DHTでCIDを調べ、その人のIPアドレスを見つけ、直接データをダウンロードします。
IPFSの速度と信頼性の利点は、多くの人々が同じデータをアップロードでき、その後ダウンロードがそれらの間で分散されるという事実から来ています。もしそのうちの誰かがオフラインになったり、データのホスティングをやめたりしても、他の人がその負担を引き受けることができます。
個々のファイルだけでなく、フォルダ全体をアップロードすることもできます。たとえば、exampleというフォルダがあり、その中にexample_text.txtというファイルが1つだけ含まれていて、その内容はI'm trying out IPFSであるとします。
そのフォルダをipfs add -r ./exampleというコマンドでアップロードすると、フォルダとその中のファイルはそれぞれ独自のCIDを持ちます。この場合、フォルダはCID QmdbaSQbGU6Wo9i5LyWWVLuU8g6WrYpWh2K4Li4QuuE8Frを持ち、ファイルはCID QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xyを持ちます。
その後、ファイルには2つの方法でアクセスできます:
- ファイルを直接リクエストする:
https://cloudflare-ipfs.com/ipfs/QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy - ディレクトリから名前でファイルをリクエストする:
https://cloudflare-ipfs.com/ipfs/QmdbaSQbGU6Wo9i5LyWWVLuU8g6WrYpWh2K4Li4QuuE8Fr/example_text.txt
ファイルのCIDはファイル自体が変更されない限り変わりませんが、ディレクトリのCIDはその中のいずれかのファイルが変更されたり、ファイルが追加または削除されたりするたびに変わります。
ディレクトリを使用すると、単一のCIDで静的なウェブサイト全体にアドレスを付け、ディレクトリ内の異なるファイルをリクエストすることでウェブサイトの異なるページにアクセスできます。
追加の概念に関するヘルプについては、IPFS ↗のドキュメントを参照してください。