IPFSは(まとめ ①)で紹介した技術を統合し、進化させたものである。本章からIPFSについてまとめていく。
IPFSの設計
IPFSプロトコルは以下のサブプロトコルに分解することができる。
1.Identities ノードIDの生成と検証を管理
2.Network 通信プロトコルを利用して他ピアとの接続を管理
3.Routing 特定のピアやオブジェクトのロケーション情報を管理して情報を返す
4.Exchange 効率的な新型ブロック交換プロトコルであるBitSwap
5.Objects コンテンツアドレス型の不可変でリンクをもつMerkle DAG
6.Files Gitに影響を受けたバージョン管理ファイルシステム
7.Naming 自己証明可能かつ変更可能な名前空間システム
サブプロトコル
各ノードをNodeIdによって識別する。NodeIdはS/Kademliaで交換される公開鍵を暗号学的ハッシュ関数によりハッシュ化したものである。よって各ノードは公開鍵と秘密鍵を保持する。ノード管理者はノード起動する際に毎回新しいNodeIdを取得することも可能だが、それを行うと未払いのネットワーク報酬を受け取れなくなるということがあり同じIdを使い続けるインセンティブ設計がなされている。
IPFSのノードは常に100以上の他ノードと通信している。IPFSのネットワークスタックには次のような特徴がある。
・トランスポート トランスポート層のプロトコルが利用可能である。
・信頼性 IPFSはuTPやSCTP(この辺詳しくないです)を用いて下層ネットワークプロトコルが信頼性を持たない場合でも信頼性を確保できる
・接続性 IPFSはICE-NAT-traversalを利用している
・整合性 ハッシュ関数のチェックサムを利用することでメッセージの整合性を行うことが可能
・メッセージ認証 送り主の公開鍵とHMACを利用してメッセージ認証を行うことが可能
IPFSでは任意のネットワークが利用可能であり、必ずしもインターネットプロトコルにアクセスすることを想定してはいない。つまりオーバーレイネットワークとして利用が可能である。
IPFSは2つのルーティングをする必要がある。1つは他のノードのネットワークアドレスへのルーティング、もう1つはオブジェクトのホストする場所へのルーティングだ。IPFSはこれらのルーティングをKademiliaとCoralを基礎としてDSHTを用いることで実現している。
1KB以下のオブジェクトの場合そのオブジェクトは直接DHT上に保存し、それを超える場合はそのオブジェクトへの参照をDHT上に保存する。
IPFSでのデータ配布はBitSwapプロトコルに準拠したピア間のブロック交換によって行われる。BitSwapはBitTorrentに強く影響されたプロトコルでありBitTorrentと同様に各ピアは自分が取得したいブロックのリストと自分が提供できるブロックのリストを保持している。BitSwapはその上でそのブロックがどのファイルの一部かに関係なくブロック交換を行う一種の永続的なブロックの交換市場のように振る舞う。
BitSwapのピアは様々なブロックの交換戦略を取ることができる。ネットワーク全体のブロック交換効率はその交換戦略に依存することとなる。(戦略の紹介には複雑な数学的計算が含まれてるのでパス)
分散ハッシュテーブル(DHT)やBitSwapプロトコルによりデータブロックがP2P上で交換することが実現されている。IPFSではこれらの基盤上にMerkle DAGを構築する。これはオブジェクト間を暗号的ハッシュ値によるリンクで結びつけたものである。
メリット
1.コンテンツアドレッシング 全てのコンテンツがマルチハッシュのチェックサムを元に同定されリンクされる
2.耐改ざん性 コンテンツを改ざんする際はコンテンツに向けたリンクも改ざんせねばならないので耐改ざん性が向上する
3.重複除去 同じコンテンツからは同じリンクが発生するので重複しない。
またIPFSオブジェクトは文字列パスAPIでたどることができ、このパスは従来のUNIXファイルシステムやWebと同じように機能することができる。
IPFSはバージョン管理システムを作るためにオブジェクトセットを定義した。これはGitによく似ている。(以下の翻訳は変なのでGitを知ってる方はそっちをイメージしてほしい)
1.ブロック 可変なサイズのデータブロック
2. リスト ブロックのコレクションまたはその他のリスト
3.ツリー ブロックのコレクション、リスト、またはその他のツリー
4.コミット ツリーのバージョンのスナップショット
動的に変更できるnamingがないと、IPFSのリンクを送信したとしても全ての新しいコンテンツにおける通信は帯域外で行われることとなってしまう。
Merkle DAGから外れるIPFSの特性を検討すると、それらのオブジェクトは
(a)ハッシュを介して取得され (b)整合性がチェックされ (c)他のユーザーとリンクされ (d)無期限にキャッシュされる
このようなプロトコルの元にIPFSは成り立っていると言うわけです。詳しいプログラムや数学的考えのところはしっかりとwhitepaperをご参照ください。
まとめ
今回はIPFSのプロトコルがどのようになっているのかを中心にまとめてみました。皆様の何かの参考になれば幸いです。
<参考文献>
・IPFS入門(https://ipfs-book.decentralized-web.jp/ipfs-whitepaper-jp/)
Whitepaper(https://ipfs.io/ipfs/QmR7GSQM93Cx5eAg6a6yRzNde1FQv7uL6X1o4k7zrJa3LX/ipfs.draft3.pdf)