IPFSリポジトリ作成

IPFSリポジトリにファイルを追加したり参照したりする。

前回まで

情報源

IPFS基本コマンド

コマンド 概要
ipfs init リポジトリ作成
ipfs add <path> 指定したパスのファイルを追加する
ipfs cat <ref> 指定したデータを表示する
ipfs get <ref> 指定したデータをダウンロードする
ipfs ls <ref> 指定したデータのリンクを一覧する
ipfs refs <ref> 指定したデータのハッシュを一覧する

詳しくはipfs helpコマンド出力を参照。

IPFSリポジトリ作成

ipfs init

ipfs initすると~/.ipfsが作成される。これがリポジトリ。カレントがどこであれホーム直下に固定名で作成されるらしい。

ipfs init
generating ED25519 keypair...done
peer identity: 12D3KooWLA3iyFsMAq27Yo5h7ZH7pfiWGop4YpoLeq6ZhDmo975G
initializing IPFS node at /home/pi/.ipfs
Error: ipfs configuration file already exists!
Reinitializing would overwrite your keys.

ipfs cat

コンテンツを取得する。

ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/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 add

内容が同じならハッシュも同じ

hello worldと入力したtest1.txtファイルを作成する。

echo "hello world" > test1.txt
cat test1.txt

test1.txtファイルの内容を表示して確認する。

hello world

test1.txtファイルをIPFSリポジトリに追加する。

ipfs add test1.txt
added QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o test1.txt
 12 B / 12 B [================================================================================================================] 100.00%

表示されたQmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5otest1.txtの内容をハッシュ化したもの。同時にこれがコンテンツの識別子になる。さっそくcatコマンドで表示してみる。

ipfs cat QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
hello world

たとえファイルパスが違っても、内容が同じであれば同じハッシュになる。

echo "hello world" > test2.txt
cat test2.txt
ipfs add test2.txt
added QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o test2.txt
 12 B / 12 B [================================================================================================================] 100.00%

パイプで送っても同じハッシュになる。

echo "hello world" | ipfs add
added QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
 12 B / 12 B [================================================================================================================] 100.00%
ipfs cat QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
hello world

ディレクトリ

mkdir testdir
echo "hello world" > test1.txt
echo "hello world" > test2.txt
mv test*.txt testdir/
ls testdir/
test1.txt  test2.txt

ディレクトリを丸ごとaddする。

ipfs add -r testdir
added QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o testdir/test1.txt
added QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o testdir/test2.txt
added QmWpxMfLZcDVeMcBJXoZbqpaeXdzXBxoBScYSSb8ctzu8W testdir
 24 B / 24 B [================================================================================================================] 100.00%

1, 2行目のハッシュはこれまで同様hello worldをハッシュ化したもの。

3行目のtestdirディレクトリのハッシュは新しい。ipfs lsコマンドで見てみる。

ipfs ls QmWpxMfLZcDVeMcBJXoZbqpaeXdzXBxoBScYSSb8ctzu8W
QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o 12 test1.txt
QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o 12 test2.txt

ディレクトリ配下のファイルは次のように参照することもできる。

ipfs cat QmWpxMfLZcDVeMcBJXoZbqpaeXdzXBxoBScYSSb8ctzu8W/test1.txt
hello world

もちろん以下でも同じように参照できる。

ipfs cat QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
hello world

IPFSオブジェクト

ipfs addでファイルをIPFSオブジェクトとして追加してきた。その実態はリンクとデータである。それを取得するコマンドが以下。

ディレクトリ。

ipfs object get  QmWpxMfLZcDVeMcBJXoZbqpaeXdzXBxoBScYSSb8ctzu8W
{"Links":[{"Name":"test1.txt","Hash":"QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o","Size":20},{"Name":"test2.txt","Hash":"QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o","Size":20}],"Data":"\u0008\u0001"}

ファイル。

ipfs object get QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
{"Links":[],"Data":"\u0008\u0002\u0012\u000chello world\n\u0018\u000c"}
ハッシュ 内容
QmWpxMfLZcDVeMcBJXoZbqpaeXdzXBxoBScYSSb8ctzu8W testdirディレクトリ
QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o hello worldファイル

IPFS Companion

IPFS Companionipfs://ハッシュとすると表示できるブラウザ拡張。

たとえば以下はhello worldのテキストが表示される。

ipfs://QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o

このときURLが以下のように変換される。

  • https://ipfs.io/ipfs/QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o

以下は猫の画像が表示される。

ipfs://QmZZrDCuCV5A3WsxbbC6UCtrHtNs2eVyfJwF7JcJJoJGwV

このときURLが以下のように変換される。

  • https://ipfs.io/ipfs/QmZZrDCuCV5A3WsxbbC6UCtrHtNs2eVyfJwF7JcJJoJGwV