今回の内容
本稿では、分散型ストレージの具体的な例として”IPFS”と”Swarm”という2つのプロダクトを取り上げ、両者の特徴やそれぞれの違いなどに触れながら理解を深めていくことを目指します。
ゴール
IPFS、Swarmの大まかな仕組みを理解します。
ターゲット
分散ファイル、ブロックチェーンを使ったストレージに興味がある方。
前提知識
P2Pネットワーク、ブロックチェーンの基礎的知識が必要となります。
加えて、前回の記事を読み、分散型ファイルストレージについての理解をしておくことが望ましいです。
IPFSとは何か?
IPFSとは、InterPlanetary File System(惑星間ファイルシステム)という壮大なネーミングの略称です。
テキスト、動画、画像、グラフィックデーターなどをP2Pネットワーク内で、分散ファイルシステムを利用して保存することを可能にする技術です。
IPFSの公式ページには、「IPFS is the Distributed Web」と明記してあり、
– A peer-to-peer hypermedia protocol to make the web faster, safer, and more open.
(webをより早く、安全に、そしてオープンなものにするためのPeer-to-peer通信のプロトコルである)– IPFS aims to replace HTTP and build a better web for all of us.
(IPFSはHTTPに取って代わり、私たちすべてにとってより良いwebを作ることを目指すものである)(カッコ内の訳は編集部によるもの)
とあるように、分散ファイルストレージそのものというよりは、その下のレイヤーでシステムを支えるP2P分散プロトコルと位置づけられます。
既存のWebサービスのように特定の管理されたサーバーにリクエストが集中することなく、世界中にあるIPFSのP2Pネットワークに参加しているノードにリクエストが分散されるのが特徴です。
単一障害点がなく、ノード間で信頼関係も必要ない(トラストレス)ため、誰でもIPFSネットワークに参加が可能です。
そのメリットとして、例えば動画ファイルを配信する場合において帯域幅を60%コストダウンできるとの事例も挙げられています。
使用方法、操作方法の例
IPFSネットワークにコンテンツをアップロードするときの動作を簡単に説明します。
なお、一度IPFSのネットワークにアップロードしたコンテンツは削除できません。公開されて困るもの(機密情報、個人情報、その他公開したくないプライベートなもの)をアップしないよう気をつけてください。
White paperには「Permanent Web」と書かれており、一度アップロードしたコンテンツは削除することはできません。アップロード後、ローカルにあるコンテンツを削除しましても、他のノードに分散されキャッシュ化されているともう取り消すことができません。
コンテンツに対して暗号化がされていませんので、プライバシーに関係するものや機密性が高いコンテンツをそのままアップロードすることは控えたほうがよいです。
Swarmとは何か?
SwarmとはEthereumのブロックチェーン上に組み込まれている分散ファイルストレージの仕組みです。
SwarmもIPFSと非常によく似ており、P2Pネットワーク、停止時間ゼロ、DDOS耐性、フォールトトラント耐性、インセンティブシステム(※Swarm個有)など、多様な機能を提供しています。
下記にEthereum Web3.0 Stackのイメージ図を作成しました。
Contractは契約を含めたロジックを、Whisperはコミュニケーションのためのメッセージングを、Swarmはストレージおよびコンテンツ配信を行うための機能を提供してくれます。
SwarmはContract、Whisperと 並んで、Ethereum web3.0のベースレイヤーという位置づけになっており、Ethereumブロックチェーンと深く統合されています。
そのため、Swarmのコマンドはgo-ethereum(Geth)のリポジトリ配下に含まれて配布されています。
Swarmでも同じようにアップロードするときの動作を簡単に説明します。
注意点として、Swarmも一度ネットワークにアップロードしたコンテンツは削除できませんので、プライバシーに関係するコンテンツや機密性が高いコンテンツはアップロードを控えたほうがよいでしょう。
IPFSとSwarmの違い
よく似ているIPFSとSwarmですが、その中でも異なっている点について以下にまとめてみました。
IPFSとSwarmの開発状況
現時点で、IPFSは開発中ステータスで、α版と捉えたほうがよいです。
Swarmに関してもPoC (Proof of Concept) version 0.2ということで、実証実験中です。
両者ともに安定版の提供はまだ先になると思います。
アーキテクチャ
SwarmはEthereumのブロックチェーンと密結合されています。
一方、IPFSは下記の5つのモジュール構造で設計されています。
- ネットワーク
- ルーティング
- エクスチェンジ
- データー構造
- ネーミング
IPFSはSwarmとは逆に、コンポーネントが疎結合で構成されているので、モジュールを入れ替えられる柔軟性があります。
ネットワーク
IPFSはlibp2p、Swarmはdevp2p(※devp2p公式wikiがあるのですが、記事が古く参考にしないほうがいいかもしれません。)と、それぞれ異なるライブラリ(フレームワーク)を使用しています。
機能的にこの2つは
- 通信の暗号化
- フォワーディング
- パーシステンス
など、同じような機能を提供しています。これにより何百、何千というノードとP2P接続を可能としています。(※実際には、もっと多彩な機能をもっています)
ファイルシステム
IPFSのファイルシステムはMerkle DAG(リンクハッシュ型の有向非巡回グラフ)と呼ばれるアルゴリズムを使用し、コンテンツの暗号、ハッシュ、キャッシュ、永続化、階層化を行っていきます。
Gitのオブジェクト構造に似たディレクトリ構造でコンテンツを格納していきます。
DAGの利点を活かし、コンテンツが増えてきた時のスケーリングに力を発揮します。
一方、SwarmのファイルシステムはSwarm hashと呼ばれ、Ethereum本体のブロックチェーンを利用して、ハッシュしたコンテンツを格納していきます。
コンテンツをアップロードするとSwarm Hashはchunksという小さい塊にコンテンツを分割していきます。そのときに1chunkのサイズは4Kbyteになるように決められているのが特徴です。
ネーミングサービス
先の説明でIPFS、Swarmはコンテンツの内容でハッシュを決定しているのはご理解いただけと思います。
ここで問題なのが、コンテンツを更新した場合にハッシュが変わってしまい、パーマネントリンクも書き換わってしまうことです。
このままでは、同じコンテンツにアクセスしたいのに、更新する度にURLが変更されます。
そこでIPFS、Swarmでは、ネーミングサービスを提供することでURLの変動に対処できるようにしています。
IPFS
パーマネントリンクに使用するリンクの一部をコンテンツのハッシュではなく、ノード固有のIDで置き換えてくれます。このネーミングサービスをIPNSと呼びます。
IPFSと名前が似ていて紛らわしいのですが、コンテンツ更新の度に変更されるハッシュ値ではなく変わりにくいノードのIDを使い、パーマネントリンクを作成します。
(コンテンツハッシュ)http://localhost:8080/ipfs/QmbFMke1KXqnYyBBWxB74N4c5SBnJMVAiMNRcGu6x
↓
(ノードID)http://localhost:8080/ipns/QmRPrEwYjF8r6SJa13s7ptM9Ut97TFWMee9sXyHqY1
上の例では、青色のコンテンツハッシュから緑色のノードハッシュに置き換られています。このIPNSによりコンテンツを更新しても、パーマリンクが変更されることなく一意性を保つことが可能となります。
Swarm
SwarmではENS(Ethereum Name Service)を使いパーマネントリンクに一意性をもたせます。(※ENSはSwarm専用というわけではなく、ethereumのwallet addressのaliasなどでも使用可能です)
ENSを使うことにより、Swarmのパーマネントリンクは
(コンテンツハッシュ)
http://localhost:8500/bzz:/0xc777819a8eaa98d61615d94be49cd3bfaa95a2ccbe0225a3c3cf354777f33
↓
(ENS)
http://localhost:8500/bzz:/swarm.eth/
のようになります。「.eth」ドメインを使用することができ、パーマネントリンクが覚えやすくなり、IPFSのIPNSよりヒューマンフレンドリーです。テスト用途むけに、「.test」というドメインも用意されています。
パブリッシュ
IPFS、Swarmともに、コンテンツをブラウジングする場合は、ローカルに起動したデーモンを通じてアクセスする必要がありました。
ただしIPFSに関しては、パブリッシュ機能(グローバルへの公開)がデフォルトで提供されています。パブリッシュコマンドを使うことにより、IPFSが用意した、https://ipfs.io (または、 https://gateway.ipfs.io)URLでコンテンツを公開することができます。
https://ipfs.io/ipfs/QmQio5XVkXYeSanS6HM27sF5ZZj8znpY3MbBAGBTLxzp1U
実際にサンプルファイルをパブリッシュしてみました。アクセスすると「IPFS published」と表示されると思います。
参加者へのインセンティブシステム
IPFSとSwarmを比較したとき、一番の違いがインセンティブシステムになります。
インセンティブシステムの背景には貢献者(ノード)に対してインセンティブを払うことにより、利用者に安全に迅速にコンテンツ提供するという考えがあります。
このインセンティブシステムは、IPFSには存在していない機能になります。
SwarmのインセンティブシステムはPoC4アップデートで実装されるということで、現時点(PoC2)では動作していません。
なので、SwarmのOrange paperの内容を自分なりに解釈してみました。
インセンティブシステムには帯域インセンティブとストレージインセンティブの2種類が存在しています。
帯域インセンティブでは、利用者がたくさんのコンテンツをダウンロードした場合には、コンテンツを提供してくれたノードに対して帯域使用料を支払うというものです。
これは逆に言えば、人気のあるコンテンツをホストしていたノードはそれだけ多くの手数料をもらうことが出来るということです。
対して、ストレージインセンティブでは様々な条件に対してインセンティブの支払いが行われます。
例えば、無事にchunkの配信に成功したノードや、コンテンツを長い期間保存していたノードに対するインセンティブの支払いを行うなどすることで、Swarmの参加者に対してコンテンツの保存・配信を正当に行うことを奨励するようなデザインとなっています。
終わりに
今回の記事では、IPFSとSwarmという非中央集権型(分散型)ファイルストレージシステムについて、それぞれの特徴や概要を説明したうえで、両者の違いについて述べました。
完全版の記事はオンラインサロン「即戦力!ブロックチェーン技術者養成道場」で公開中です。
続きを見るには、即戦力!ブロックチェーン技術者養成道場(DMMのページに移動します)をご覧ください!