Mac環境でIPFS入門

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
         

はじめに

最近ブロックチェーンを始めとする分散型技術が再度注目されているように感じます。

しかし、分散型の概念はブロックチェーンの専売特許ではなく、以前から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 Binaryamd64をダウンロードします。

go-ipfs

ダウンロードが完了したらアーカイブを解凍し、インストールスクリプトが存在するディレクトリに移動します。

$ cd ~/Downloads/go-ipfs/

インストールスクリプトを実行します。

$ sudo ./install.sh

バージョン情報が確認できたらインストールに成功しています。

$ ipfs version
ipfs version 0.4.14

IPFSリポジトリの初期化

以下のコマンドで、自分のアカウントに紐付いたIPFSリポジトリをローカル環境に作成します。
その時にコンテンツに署名するためのキーペアが発行されます。

$ 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を実行します。

$ 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サイトを用意しました。

ファイル構造はこちら。

ipfs-sample/
 css/style.css
 images/cat.jpg
 index.html

index.htmlファイルではそれぞれ別ファイルを読み込んでいます。

<!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は次の通り。

body {
    margin: 0;
    display:-webkit-flex;
    display: flex;
    -webkit-justify-content: center;
    justify-content: center;
}

img#cat-image {
    width: 100%;
    height: 100%;
}

IPFSデーモンを起動

公開する前にデーモンを起動させ、世界中のノードと接続します。

$ 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で確認が出来るツールも提供されています。

http://localhost:5001/webui

自分が現在どのノードと接続しているか分かったり、ブラウザ経由でファイルのアップロードなどが出来るので大変便利です。

ファイルをIPFSへアップロードする

ファイル単体でアップロードするときはipfs add [File name]で実行します。

今回はWebサイトをまるごとアップロードしたいので、フォルダを指定して再帰的に追加するオプションで実行します。

$ 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をセットアップして、シンプルな静的サイトをホスティングするところまで試してみました。

少し動作が不安定なときもあるので、実運用する場合は気をつけて下さい。

とはいえかなり面白いプロジェクトなので、これからの開発に期待です。

個人的にはこれにブロックチェーンを絡めればもっと面白いことが出来る気がしてます。

それでは。

参考

IPFS

IPFS入門 : 新たなP2Pハイパーメディア分散プロトコル

IPFS (The InterPlanetary File System) について半日を費やして調べてみた

スポンサーリンク

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。