今回の内容とゴール
IPFSの大まかな仕組みを理解し、実際にいくつかのコマンドを使いながらIPFSへのファイルのアップロード/ダウンロードなどの操作を学びます。
この記事のターゲット、こんな人におすすめ
・IPFSを使い始めるまでの環境構築のやり方を知りたい方
・IPFSへのファイルアップロード、ダウンロードなどの操作を学びたい方
・分散ファイルストレージ、ブロックチェーンを使ったストレージに興味がある方
必要となる前提知識
P2Pネットワーク、ブロックチェーンの基礎的知識が必要となります。
また今回までの記事をご覧になっていない方は、ぜひ下記に目を通しておいてください。
第1回 分散型ファイルストレージの概要
http://block-chain.jp/blockchain_study_salon_dojo/what-is-decentralized-distributed-storage/
第2回:IPFSとSwarmとは何か?
http://block-chain.jp/blockchain_study_salon_dojo/what-is-ipfs-and-swarm/
IPFSの環境構築
IPFSの実装には、JS版のjs-ipfsとGo版のgo-ipfsの2種類が存在しています。どちらもembeddedが可能で各言語(JS、Go)で拡張ができます。
この章ではGo版のgo-ipfsを使い、コマンドラインからの簡単な使い方を説明したいと思います。
go-ipfsをダウンロードする
まず、こちらのURLからgo-ipfsをダウンロードしてください。
(右上のボタンから適切なパッケージを取得できなかった場合は、お使いのOSに対応したバイナリを選択してダウンロードしてください。)
go-ipfsのインストール
macOS, Linuxの場合
まずはダウンロードしたgo-ipfsのファイルを解凍しましょう。
必要であれば、解凍したgo-ipfsのファイルを任意の作業用ディレクトリに移動してください。
次に、go-ipfsディレクトリに移動し、インストール用のスクリプト(install.sh)を走らせます。
$ cd go-ipfs
$ ./install.sh
install.shを実行したら、ipfsが使えるようになっているはずです。
上手くいったかどうか、helpコマンドを使って確かめてみましょう。
$ ipfs help
> USAGE:
ipfs - Gloval p2p merkle-dag filesystem.
...
“USAGE ipfs – Gloval p2p merkle-dag filesystem.”というメッセージに続き、色々とコマンド一覧が表示されていれば成功です。
Windowsの場合
解凍したgo-ipfsのフォルダ内にある”ipfs.exe”を任意の作業用ディレクトリに移動してください。
helpコマンドを使って
$ ipfs help
> USAGE:
ipfs - Gloval p2p merkle-dag filesystem.
...
“USAGE ipfs – Gloval p2p merkle-dag filesystem.”というメッセージに続き、色々とコマンド一覧が表示されていれば成功です。
初期化
インストールが完了したら、一番最初に行うことはIPFSを動作させるための初期化です。
このコマンドを実行することで、$HONE/.ipfs(~/.ipfs)にフォルダやconfig、datasotere、keystoreなどのファイルが自動生成されます。
(初期化)
$ ipfs init
daemonの起動
IPFSネットワークにPeerとして参加するためには、daemonコマンドでdaemonを起動させます。
$ ipfs daemon
なお、daemonを停止するコマンドは今のところ無いようなので、control + cで停止させるか、$ kill [pid] などでプロセスIDを指定してkillするなどで対応するようです。
コンテンツの参照
IPFSにアップロードされているコンテンツを参照するには、catコマンドを使います。
IPFSのREAMDMEファイルもIPFSの1つのオブジェクトとしてアップロードされていますので、daemonを通じて確認できます。
なお、下記のreadmeファイルのハッシュ値はこの例のものと異なる場合があります。
アクセスできない場合、initコマンド実行時に表示される”to get started, enter:”というメッセージに続いて記載されているコマンドとアドレスを利用してください。
$ ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/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
readmeの表示内容から、例えば./helpの内容を見るには、次のようにアクセスします。
$ ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/help
コンテンツの登録(アップロード)
IPFSにコンテンツをアップロードするには、addコマンドを使います。
まず、アップロード用のファイルを用意しましょう。ここでは、ローカルPCに以下のようなディレクトリ構造(/demo以下)を用意します。
demo/
├── index.html
└── top/
└── main.html
demoというディレクトリ配下を再帰的に登録するには、addコマンドに-rオプションをつけます。
(コンテンツ単体であれば、addコマンドだけでアップロードできます)
レスポンスにはハッシュ化されたディレクトリやファイルの値、ハッシュ化前の元の名前が返ります。
(コンテンツの登録)
$ ipfs add -r demo
added QmeBWHaefLwKkn7TgGdzyxgtaTTRkPeM3X4RbUY4xr736c demo/index.html
added QmYdgfWR1wDRyD8E6kdd1R5JPjJ6QCG4ww1Y487GmBLx2y demo/top/main.html
added QmYTgEwKE8MzDJM6YH68WHqPJBFUoZrEpLsidBkuBRRkFi demo/top
added QmWC7RG2EL6UP5Yb4Wy4fkKapPiFMFe2DgP7GLp65xT8QG demo
分かりやすくするために、ハッシュ値をさきほどのディレクトリ構造にあてはめてみます。
demo/・・・・・・・・・・・・・ QmWC7RG2EL6UP5Yb4Wy4fkKapPiFMFe2DgP7GLp65xT8QG
├── index.html・・・・・ QmeBWHaefLwKkn7TgGdzyxgtaTTRkPeM3X4RbUY4xr736c
└── top/・・・・・・・・・・・ QmYTgEwKE8MzDJM6YH68WHqPJBFUoZrEpLsidBkuBRRkFi
└── main.html・・・ QmYdgfWR1wDRyD8E6kdd1R5JPjJ6QCG4ww1Y487GmBLx2y
demo/index.htmlにブラウザからアクセスしてみます。
ブラウザからのアクセスの場合、ローカルで起動したIPFS daemon経由、IPFS Gateway経由での2通りのアクセスが可能です。
(Gateway経由の場合は、キャッシュ化されるために、時間がかかるかもしれません)
(ローカルdaemon経由でのアクセス)
http://localhost:8080/ipfs/QmeBWHaefLwKkn7TgGdzyxgtaTTRkPeM3X4RbUY4xr736c
(gateway経由でのアクセス)
https://ipfs.io/ipfs/QmeBWHaefLwKkn7TgGdzyxgtaTTRkPeM3X4RbUY4xr736c
コンテンツのダウンロード
コンテンツをダウンロードするには、getコマンドを使います。
ここでは、先ほど作ってaddしておいたdemo/top/main.htmlのコンテンツをダウンロードしてみます。
getコマンドの引数には、目的のコンテンツのハッシュ値を指定します。
(コンテンツのダウンロード)
$ ipfs get QmYdgfWR1wDRyD8E6kdd1R5JPjJ6QCG4ww1Y487GmBLx2y
Saving file(s) to QmYdgfWR1wDRyD8E6kdd1R5JPjJ6QCG4ww1Y487GmBLx2y
18rmB / 18 B [======================================================] 100.00% 0s
コンテンツが正常にダウンロードされると、ローカルPC上に”QmYdgfWR1wDRyD8E6kdd1R5JPjJ6QCG4ww1Y487GmBLx2y”というファイルが作成されます。
IPfSのネーミングサービス「IPNS」を利用する
IPFSとSwarmの違いの記事で解説した、IPFSのネーミングサービスであるIPNSの使い方について説明します。
IPNSを使うとコンテンツにアクセスするためのエンドポイントのURLを固定することができます。
IPNSなしの場合、コンテンツを更新するたびにハッシュが代わり、エンドポイントのURLも変わってしまう煩雑さがありますが、IPNSを使うことでこの煩雑さから解放されます。