Zuck3r’s Study

エンジニアではありません

IPFSを触ってみた

f:id:Zuck3r:20190713214155p:plain

IPFSって何だろう

IPFSとは、InterPlanetary File SystemでProtocol Labsにより開発が進めれられているP2Pネットワーク上で動作するハイパーメディアプロトコルとその実装の事です。
簡単に言えば、分散型P2Pファイル共有システムです。

私達が、日頃使っているHTTPはロケーション指向型プロトコルです。これは、私が"hogeA.com/abc/hoge.jpg"にアクセスしたとき、””hogeA.comというホストサーバにある、abcディレクトリの内のhoge.jpg””から情報を得るという方式で、つまりはどの場所にあるのか(ロケーション)を指定してアクセスする訳です。

一方で、IPFSはコンテンツ指向型プロトコルとなっています。例えば、私が”Fractures”という曲を聴きたいとします。その時、Youtubeで聴くのとSoundCloudや、iTunesなどを利用して聴くといった違いによって内容が変わるでしょうか?いずれであっても、同じ音楽を聴くことができます。以上のことを踏まえると、同じ内容であれば、どのサーバー上から取得したのか、どんな名前のファイルなのかはあまり重要ではないという事が言えます。このように、"どういった内容なのか"という事に、内容(コンテンツ)そのものの情報に重きを置き、直接アクセスします。ちなみに、このコンテンツにはハッシュを割り振り、そのアドレスにアクセスします

本題

1.まずはgo-ipfsのダウンロードと準備

下記のサイトからダウンロードします。私はUbuntuで動かしたのでLinuxのファイルをダウンロードしました。自分の環境に合わせて変えてください。
https://dist.ipfs.io/#go-ipfs

$ wget https://dist.ipfs.io/go-ipfs/v0.4.21/go-ipfs_v0.4.21_linux-amd64.tar.gz
$ tar xvzf go-ipfs_v0.4.21_linux-amd64.tar.gz
$ cd go-ipfs
$ sudo ./install.sh
$ ipfs version

上記の操作により、準備が完了します。入ったか、最後にバージョンを確認しちゃんと入ったか確認します。

2.実際に動かしていく

次は以下のコマンドを実行しローカルリポジトリを初期化します。

$ ipfs init

すると、ユーザーのhomeディレクトリ直下に、.ipfsディレクトリが生成されます。このディレクトリがIPFSのリポジトリになります。今度は、readmeファイルの内容を取得してみます。

$ ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

では起動してみましょう。自分が立ち上げたノードと接続されたpeerも確認してみます。

$ ipfs daemon
#下のコマンドでpeerの確認
$ ipfs swarm peers

私は、ipfs daemonでエラーが出ました。ポートが他で使っていて駄目なようだったので、ホームディレクトリ直下に作成された.ipfs/configのportとある行の部分を別のポート番号に書き換えるとうまく行きました。

問題なく動いているか確認するためにパブリックなネットワークから猫🐱ちゃんの画像を取得してみましょう。

$ ipfs cat /ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg >cat.jpg

f:id:Zuck3r:20190713233657j:plain

猫の画像がちゃんと開ければ成功です。

3.今度は自分でファイルをアップロードしてみる

今度は画像ファイルを自分で上げてみます。以下のようにコマンドを打って下さい。

$ ipfs add file_name(ファイル名を入れてください)
# added Qmxxxxxxxxxxxxxxxxxxxxxxxxxxx file_name

上のようになると思います。ここで取得したハッシュ値を以下のリンクの部分に入れるとそのファイルにアクセス出来ます。8080の部分は各々が設定したポート番号にして下さい。

http://localhost:8080/ipfs/(ハッシュ値)

ちなみに、本当にコンテンツ指向型なのか確認するために同じファイルを違う名前にしてみてアップロードしてみて下さい。同じハッシュ値が帰ってくるはずです。

終わりたいときは、ctrl+cでOKです。

4.最後に

今回はIPFSを使ってみました。分散型にファイルを扱うのはとても興味深いと思いました。ハッシュ値についても最近、暗号技術について勉強したばかりで理解が深まったので良かったです。