IPFSにファイルを保存してそれをブラウザに表示するまで

# IPFSを使ってみた

分散型のファイルストレージである、IPFSを使ってみたのでその流れについてメモしておく。
IPFSの特徴などは[ここ](https://ipfs-book.decentralized-web.jp/what_is_ipfs/)で確認！！

やったことは、

* ファイルをIPFSに保存する
* Gatawayサーバーを通じて、ブラウザにファイルの内容を表示する

の2つ。

では、スタート。

## IPFSのインストール
[このサイト](https://ipfs-book.decentralized-web.jp/install_ipfs/)に書いてある通りに行った。

まずは[ここ](https://dist.ipfs.io/#go-ipfs)からOSに合ったものをダウンロードする
次に、解凍し`go-ipfs`のフォルダに入り、`install.sh`を実行する。

```
$ tar xvfz go-ipfs.tar.gz
$ cd go-ipfs
$ ./install.sh
```

以上のコマンドを順に実行した後に、

```
$ ipfs help
```
を実行し、helpが表示されると、無事にipfsが利用できるようになっている。ここでIPFSを初期化するために

```
$ ipfs init
```

を実行する。

## ファイルをIPFSに保存する
ここでは、IPFSに保存したいファイルからIPFSオブジェクトを作成し、IPFS上に保存する。
今回保存するのは、`test.txt`という名前のファイルで中身は`hello`とだけ書いてあるもの。

まずは、

```
ipfs add test.txt
```

出力結果

```
added QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN test.txt
 6 B / 6 B [============================================================================] 100.00%
```
ここで表示されたハッシュ値のようなものが、ファイルの識別子となる。

HTTPがロケーション指向型と呼ばれるのに対して、IPFSはコンテンツ指向型と呼ばれるのは、「どこのどのファイル」としてコンテンツを探すのではなく、この識別子だけを頼りに探すため。

**出力されるハッシュ値はファイルにより異なるため、以下の作業は自身のファイルのハッシュ値を利用してください。**


次に以下を実行

```
$ ipfs name publish QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN
```

出力結果

```
Published to QmUymJjNPcPny11LaonPjUSLvm73BQUpvxGFFmFP3MjXfE: /ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN
```

次に、IPFSのネットワークに参加し、自身のファイルを周りのノードに保存してもらう。

```
ipfs daemon
```

出力結果

```
Initializing daemon...
go-ipfs version: 0.4.22-
Repo version: 7
System version: amd64/darwin
Golang version: go1.12.7
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.11.2/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/192.168.11.2/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

```

以上のようになるとOK

このターミナルは閉じずにそのままにしておき、以下の作業は別の画面で行う。

IPFSのネットワークに接続できているか確認するためには、以下のコマンドを実行する

```
$ ipfs swarm peers | head
```

出力結果

```
/ip4/129.204.135.89/tcp/4001/ipfs/QmaeVNMY5ru6uHEFiyDRbV4LWMMmdu7uS9vU7dLYUofkgy
/ip4/138.201.67.219/tcp/4001/ipfs/QmUd6zHcbkbcs7SMxwLs48qZVX3vpcM8errYS7xEczwRMA
/ip4/147.75.195.153/tcp/4001/ipfs/QmW9m57aiBDHAkKj9nmFSEn7ZqrcF1fZS4bipsTCHburei
/ip4/147.75.45.187/tcp/4001/ipfs/QmSPz3WfZ1xCq6PCFQj3xFHAPBRUudbogcDPSMtwkQzxGC
/ip4/147.75.70.221/tcp/4001/ipfs/Qme8g49gm3q4Acp7xWBKg3nAa9fxZ1YmyDJdyGgoG6LsXh
/ip4/147.75.80.110/tcp/4001/ipfs/QmbFgm5zan8P6eWWmeyfncR5feYEMPbht5b1FW1C37aQ7y
/ip4/147.75.90.11/tcp/4001/ipfs/QmVLb8bi8oAmLwrTdjGurtVGN7FaJvhXP5UM3s56uyqfxL
/ip4/147.75.94.95/tcp/4001/ipfs/QmXygeCqKjpcbT9E7jgSbAvcDnPaJp9gQDzEVFZ6zzjVc2
/ip4/147.75.96.47/tcp/4001/ipfs/QmVjLyXj8NtBUt1XoEWLmwwb9NPZJrRUsjppi8a3uw29CZ
/ip4/207.148.19.196/tcp/20074/ipfs/12D3KooWGXBbSZ3ko3UvoekdnnSrdmuFic3XHuNKvGcZyrH1mVxr
```

次に以下のコマンドで先ほどIPFSのネットワークに伝達したファイルを保持してくれてるノードの一覧を取得することができる

```
$ ipfs dht findprovs QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN
```

出力結果

```
QmUymJjNPcPny11LaonPjUSLvm73BQUpvxGFFmFP3MjXfE
QmQzustKyCbyy3BbpetySYk88D8mtS9No8xEJP7B5tV324
Qma8hyz3B3BWgSLyXBdDn6v4hCQv347XgMjszZoQZb1kss
QmYR4jxcGUTQZ7mH5DkfBSxpdJW5Y4CsfgHFfARLAV3goA
```

## IPFSのファイルをブラウザから確認する

IPFS上のファイルをブラウザから確認するためには、IPFSのゲートウェイサーバーを利用する。

以下のURLでアクセスする。

```
https://ipfs-gateway.decentralized-web.jp/ipfs/QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN
```

そうすると、先ほどの`test.txt`の内容である`hello`と表示される。

今回利用したGateWay以外にも、`https://ipfs.io/ipfs/ハッシュ値`で利用できるものもある。
また、個人でGatewayを立てることもできる。

HTMLファイルを保存すれば、Webサーバーの代わりに利用することができる。


## まとめ
IPFS???みたいな状態から初めて使ってみた。具体的なシステムの中身はこれから勉強します。