12th LAB

コマンドからIPFSを理解する

前回はIPFSの特徴や全体アーキテクチャの説明しました。

今回は実戦形式で手を動かすということを主眼において解説していきます。

IPFSのインストール

下記を参考にしてテスト、学習目的でサクッと使える状態にします。

コンテンツの操作

コンテンツの追加

コンテンツをIPFSネットワークに登録します。登録することでコンテンツが分割されIPFSネットワークで閲覧できるようになります。

つまりブラウザから ipfs://xxxxxでアクセスできるようになったり、IPFSとHTTPのゲートウェイを通して http://xxxx でアクセスできるようになります。

ipfs add コマンドで追加します。

コマンド実行後に QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ という文字列が生成されています。これはコンテンツID(CID)です。このコンテンツにアクセスするときに、このコンテンツIDを使います。

## ファイルをIPFSに登録
$ ipfs add ipfs-text.txt 
added QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ ipfs-text.txt
 12 B / 12 B [===========================================================================================================] 100.00%ubuntu@ip-10-0-0-248:~/ipfs-file$

コンテンツの閲覧

コンテンツを見るにはコンテンツIDが必要です。

$ ipfs cat QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ
hello, ipfs

コンテンツの取得

IPFSネットワークにあるコンテンツを取得(保存)します。

$ ipfs get QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ
Saving file(s) to QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ
 12 B / 12 B [========================================================================================================] 100.00% 0s
ubuntu@ip-10-0-0-248:~/ipfs-file$ ll
total 20
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 19 03:12 ./
drwxr-x--- 7 ubuntu ubuntu 4096 Apr 19 03:07 ../
-rw------- 1 ubuntu ubuntu   12 Apr 19 03:12 QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ
-rw-rw-r-- 1 ubuntu ubuntu   12 Apr 19 03:05 ipfs-text.txt
-rw-rw-r-- 1 ubuntu ubuntu   12 Apr 19 03:07 test-file.md
ubuntu@ip-10-0-0-248:~/ipfs-file$ cat QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ 
hello, ipfs

コンテンツの内容を変更する

IPFSネットワークに登録したコンテンツを変更することもできます。しかし、これを行うとコンテンツIDが変わってしまいます。

## ファイルの中身を見る
$ ipfs cat QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ
hello, ipfs

## ファイルをIPFSに登録
$ ipfs add test.txt 
added QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ test.txt
 12 B / 12 B [===========================================================================================================] 100.00%

## ファイルを編集
$ vi test.txt 
hello, ipfs modify

## ファイルをIPFSに再登録
$ ipfs add test.txt 
added QmYMX7T6fa6edsZtvz7uaEKUzjrsUS9n9gYcdQbR1cimmc test.txt
 19 B / 19 B [===========================================================================================================] 100.00%

ファイルの中身が同じでファイル名が違うという条件だとCIDは同じになります。

それを確認してみましょう

$ cat ipfs-text.txt 
hello, ipfs

$ cat test-file.md 
hello, ipfs

## ファイルをIPFSに登録
$ ipfs add ipfs-text.txt 
added QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ ipfs-text.txt
 12 B / 12 B [===========================================================================================================] 100.00%ubuntu@ip-10-0-0-248:~/ipfs-file$

## ファイルをIPFSに登録
$ ipfs add test-file.md 
added QmWCrE2Cb6DS6i8UJCx3yuZJz7o7a7bUzKMshADHkiMZNJ test-file.md
 12 B / 12 B [===========================================================================================================] 100.00%ubuntu@ip-10-0-0-248:~/ipfs-file$

IPNS

ファイルを編集するとCIDが変わってしまい、アクセスするときの名前も変わってしまいます。

これは運用上大変なため、IPNSという仕組みを使って同じ名前でアクセスできるようにします。

## ディレクトリ配下のファイルを追加する
$ ipfs add -r test-page/
added QmcC9oDaHU74QgXGxdVcfa3UZVu4cWbGk8JQQRATHNHmRF test-page/index.html
added QmXi2mj3KbP6HREi9Vj5keYwTmE1VUrnVxchVyqRWBz3wL test-page

## IPNFS二登録する
$ ipfs name publish QmcC9oDaHU74QgXGxdVcfa3UZVu4cWbGk8JQQRATHNHmRF
Published to k51qzi5uqu5dgdbdg16gbu0t26l8lrjs6q30pi48209xy56aybx59gyaohcwcn: /ipfs/QmcC9oDaHU74QgXGxdVcfa3UZVu4cWbGk8JQQRATHNHmRF

ゲートウェイ経由でアクセス

前回、k51qzi5uqu5dgdbdg16gbu0t26l8lrjs6q30pi48209xy56aybx59gyaohcwcn が生成されました。これを使ってアクセスします。

$ curl http://127.0.0.1:8080/ipns/k51qzi5uqu5dgdbdg16gbu0t26l8lrjs6q30pi48209xy56aybx59gyaohcwcn
<html>
<head><title>test-page</title></head>
<body><center>
<h1>It's a Nice Day!!</h1>
</center></body>
</html>

ブラウザでアクセスする

image block

ファイルを編集した後に同じことを繰り返します。

$ ipfs add -r test-page/
added Qmait5a9gaeFcxV4da7F4kny2NsdCfH1Gjs7YrthizZk23 test-page/index.html
added QmZpEhNpd7MCrFrMLKHnvwXSxcjMDYwcGJgkfjg9Z7yy42 test-page
 142 B / ? [-------------------------------------------------------------------------------------------=------------------------]

$ ipfs name publish Qmait5a9gaeFcxV4da7F4kny2NsdCfH1Gjs7YrthizZk23
Published to k51qzi5uqu5dgdbdg16gbu0t26l8lrjs6q30pi48209xy56aybx59gyaohcwcn: /ipfs/Qmait5a9gaeFcxV4da7F4kny2NsdCfH1Gjs7YrthizZk23

生成されたk51qzi5uqu5dgdbdg16gbu0t26l8lrjs6q30pi48209xy56aybx59gyaohcwcnは先ほどと変わりません。

紐付いているコンテンツIDを確認する

$ ipfs name resolve k51qzi5uqu5dgdbdg16gbu0t26l8lrjs6q30pi48209xy56aybx59gyaohcwcn
/ipfs/Qmait5a9gaeFcxV4da7F4kny2NsdCfH1Gjs7YrthizZk23

ゲートウェイ経由でアクセス

<h1>Let's go out!!</h1> が追加されています。

$ curl http://127.0.0.1:8080/ipns/k51qzi5uqu5dgdbdg16gbu0t26l8lrjs6q30pi48209xy56aybx59gyaohcwcn
<html>
<head><title>test-page</title></head>
<body><center>
<h1>It's a Nice Day!!</h1>
<br/>
<h1>Let's go out!!</h1>
</center></body>
</html>

今回はコマンドレベルでIPFSを見てみました。