目次
はじめに
最近ブロックチェーンを始めとする分散型技術が再度注目されているように感じます。
しかし、分散型の概念はブロックチェーンの専売特許ではなく、以前からP2Pネットワーク技術などの様々な手法を用いて提案されてきました。
今回はそのP2P技術を用いたIPFSという分散型ストレージ技術について、環境構築からWebサイトのデプロイまで試してみたいと思います。
動作環境
- macOS High Sierra 10.13.3
- ipfs version 0.4.14
IPFSとは?
一言でいうならP2Pネットワーク技術を活用した分散ストレージシステムです。
正式名称はInter-Planetary File Systemです。日本語だと惑星間ファイルシステムになります。名前からも分かるように、かなりクレイジーなプロジェクトです笑
イメージ的には分散化されたDropboxみたいなものだと考えて下さい。
このシステムに保存されたファイルはP2Pネットワーク上に分散されて格納されるため、全ノードが全滅しない限り管理者不在のままシステムが維持され続けます。
もちろん一度アップロードされたファイルは完全に削除することはできません。
この辺りはブロックチェーンの特徴に非常に親和性があります。
既存のファイルシステムとの違い
既存のファイルシステムでは、URLのドメインから対象のファイルが格納されている場所を特定してアクセスすることが出来ます。
それに対してIPFSでは、ファイルをアップロードした時にデータをハッシュ化し、そのハッシュ値によってファイルを特定します。
つまり、ファイルのハッシュ値をネットワーク全体に問い合わせ、そのファイルが格納されているノードと直接やりとりすることが出来るのです。
環境準備
具体的なイメージを掴むには実際にやってみるのが一番なので、IPFS環境を構築します。
IPFSを使うためには、まずgo-ipfsをインストールする必要があります。
go-ipfsはIPFSデーモンサーバ、コマンドラインツール、コンテンツをHTTPブラウザに提供するためのHTTPゲートウェイなどが含まれています。
IPFSインストール
darwin Binary
のamd64
をダウンロードします。
ダウンロードが完了したらアーカイブを解凍し、インストールスクリプトが存在するディレクトリに移動します。
1 2 |
$ cd ~/Downloads/go-ipfs/ |
インストールスクリプトを実行します。
1 2 |
$ sudo ./install.sh |
バージョン情報が確認できたらインストールに成功しています。
1 2 3 |
$ ipfs version ipfs version 0.4.14 |
IPFSリポジトリの初期化
以下のコマンドで、自分のアカウントに紐付いたIPFSリポジトリをローカル環境に作成します。
その時にコンテンツに署名するためのキーペアが発行されます。
1 2 3 4 5 6 7 |
$ ipfs init initializing IPFS node at /Users/yuichi/.ipfs generating 2048-bit RSA keypair...done peer identity: QmfNSLVbkJvJNV43o73MAMFKdApXck55A2DT7xXxnjwEuf to get started, enter: ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcaiuga8nUH4uVv/readme |
初期化が成功されていることを確認するためreadme
を実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcaiuga8nUH4uVv/readme Hello and Welcome to IPFS! ██╗██████╗ ███████╗███████╗ ██║██╔══██╗██╔════╝██╔════╝ ██║██████╔╝█████╗ ███████╗ ██║██╔═══╝ ██╔══╝ ╚════██║ ██║██║ ██║ ███████║ ╚═╝╚═╝ ╚═╝ ╚══════╝ If you're seeing this, you have successfully installed IPFS and are now interfacing with the ipfs merkledag! ------------------------------------------------------- | Warning: | | This is alpha software. Use at your own discretion! | | Much is missing or lacking polish. There are bugs. | | Not yet secure. Read the security notes for more. | ------------------------------------------------------- Check out some of the other files in this directory: ./about ./help ./quick-start <-- usage examples ./readme <-- this file ./security-notes |
ipfs cat
コマンドで各マニュアルを参照することができます。
Webサイトを公開
IPFSでは単一ファイルのアップロードももちろん可能ですが、フォルダごとアップロードすることで静的Webサイトをホスティングすることが出来ます。
簡単なサンプルサイトを用意して、実際にIPFSでホスティングしてみます。
サンプルWebサイト準備
相対パス指定でのファイルの読み込みが実現できるのか試したかったので、CSSファイルと画像ファイルを読み込むだけのシンプルなWebサイトを用意しました。
ファイル構造はこちら。
1 2 3 4 5 |
ipfs-sample/ css/style.css images/cat.jpg index.html |
index.htmlファイルではそれぞれ別ファイルを読み込んでいます。
1 2 3 4 5 6 7 8 9 |
<!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="css/style.css"> </head> <body> <img id="cat-image" src="./images/cat.jpg"></image> </body> </html> |
CSSは次の通り。
1 2 3 4 5 6 7 8 9 10 11 12 |
body { margin: 0; display:-webkit-flex; display: flex; -webkit-justify-content: center; justify-content: center; } img#cat-image { width: 100%; height: 100%; } |
IPFSデーモンを起動
公開する前にデーモンを起動させ、世界中のノードと接続します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ ipfs daemon Initializing daemon... Successfully raised file descriptor limit to 2048. Swarm listening on /ip4/127.0.0.1/tcp/4001 Swarm listening on /ip4/192.168.100.110/tcp/4001 Swarm listening on /ip6/2001:268:c035:aa99:4171:a8bb:1495:88be/tcp/4001 Swarm listening on /ip6/2001:268:c035:aa99:708a:94b:34c6:4/tcp/4001 Swarm listening on /ip6/2001:268:c035:aa99:c4f:3cf0:2348:8c72/tcp/4001 Swarm listening on /ip6/::1/tcp/4001 Swarm listening on /p2p-circuit/ipfs/QmfNSLVbkJvJNV43o73MAMFKdApXck55A2DT7BjpnjwEuf Swarm announcing /ip4/127.0.0.1/tcp/4001 Swarm announcing /ip4/192.168.100.110/tcp/4001 Swarm announcing /ip6/2001:268:c035:aa99:4171:a8bb:1495:88be/tcp/4001 Swarm announcing /ip6/2001:268:c035:aa99:708a:94b:34c6:4/tcp/4001 Swarm announcing /ip6/2001:268:c035:aa99:c4f:3cf0:2348:8c72/tcp/4001 Swarm announcing /ip6/::1/tcp/4001 API server listening on /ip4/127.0.0.1/tcp/5001 Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 Daemon is ready |
ローカルのデーモンが起動しました。これでP2P接続されている状態になり、IPFS上へファイルをアップロードする準備が整いました。
ノードの接続状況をGUIで確認が出来るツールも提供されています。
自分が現在どのノードと接続しているか分かったり、ブラウザ経由でファイルのアップロードなどが出来るので大変便利です。
ファイルをIPFSへアップロードする
ファイル単体でアップロードするときはipfs add [File name]
で実行します。
今回はWebサイトをまるごとアップロードしたいので、フォルダを指定して再帰的に追加するオプションで実行します。
1 2 3 4 5 6 7 |
$ ipfs add -r ipfs-sample/ added QmNVSshfzsWwgM6AdJoZ2EADPng5XHUN9g7fiBBnd74JeY ipfs-sample/css/style.css added QmcyVYhDNKQeBjUWw3f6pxc84KpVkSJnYN63V5HsvgDQfa ipfs-sample/images/cat.jpg added Qmb6kMnFJPBL8ZsVHvC3GAEnmNfxt9561rP7aD4tMGNMnj ipfs-sample/index.html added QmcwH4E973cXpf5MSSQ9njUDYmNYwwisNZmwP6F7wEcdBy ipfs-sample/css added Qmd5fpYnWntPeEZ4PP8143xT8CU12696WZydi5mES7yDCe ipfs-sample/images added QmaBhUgkGCC61ERT3yBZwQCEwTeX7occXD8KvreggY3yVb ipfs-sample |
一番最後のフォルダを示すハッシュ値を使ってWebサイトへアクセスすることが出来ます。
ローカルゲートウェイへアクセスする場合は、フォルダのハッシュ値を含めたURLでアクセスします。
http://localhost:8080/ipfs/QmaBhUgkGCC61ERT3yBZwQCEwTeX7occXD8KvreggY3yVb/
パブリックなゲートウェイへアクセスする場合は、以下の通りにハッシュ値を含めたURLへアクセスします。
こちらが試しに公開してみたWebサイトです。
https://gateway.ipfs.io/ipfs/QmaBhUgkGCC61ERT3yBZwQCEwTeX7occXD8KvreggY3yVb/
最後に
IPFSをセットアップして、シンプルな静的サイトをホスティングするところまで試してみました。
少し動作が不安定なときもあるので、実運用する場合は気をつけて下さい。
とはいえかなり面白いプロジェクトなので、これからの開発に期待です。
個人的にはこれにブロックチェーンを絡めればもっと面白いことが出来る気がしてます。
それでは。