IPFSとは
Peer to Peerベースの分散ファイルシステムです。
まだ深いところまでは理解できていないので、とりあえず、Getting Startedをやってみました。
IPFSの導入方法
1.公式サイトよりファイルのダウンロード
2.ダウンロードフォルダ内に存在するipfsファイルを自分のパソコンの'$PATH'内に移動
$ sudo mv ipfs /usr/local/bin/ipfs
3.localのipfs nodeを初期化
$ ipfs init
initializing IPFS node at /Users/hiromitsu/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmZ3wsy1JrpY5qimbQAMcJund5Hg4ZKrbnXuNkdbvPnGNK
to get started, enter:
ipfs cat /ipfs/QmVLDAhCY3X9P2uRudKAryuQFPM5zqA3Yij1dY8FpGbL7T/readme
4.以下のコードを実行し、readmeの内容を確認
$ ipfs cat /ipfs/QmVLDAhCY3X9P2uRudKAryuQFPM5zqA3Yij1dY8FpGbL7T/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
5. 早速quick-startで試してみる
$ ipfs cat /ipfs/QmVLDAhCY3X9P2uRudKAryuQFPM5zqA3Yij1dY8FpGbL7T/quick-start
0.1 - Quick Start
This is a set of short examples with minimal explanation. It is meant as
a "quick start". Soon, we'll write a longer tour :-)
Add a file to ipfs:
// hello worldをhelloファイルに書き込み
$ echo "hello world" >hello
// ipfsにファイルをあげる
$ ipfs add hello
added QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o hello
View it:
// あげたファイルの表示
$ ipfs cat QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
hello world
Try a directory:
$ mkdir foo
$ mkdir foo/bar
$ echo "baz" > foo/baz
$ echo "baz" > foo/bar/baz
// fooディレクトリに存在するディレクトリ、ファイルを全てipfsにあげる
$ ipfs add -r foo
added QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR foo/bar/baz
added QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR foo/baz
added QmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDN foo/bar
added QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm foo
View things:
// foo直下にあるディレクトリ、ファイルのリストを表示
$ ipfs ls QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm
QmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDN 61 bar/
QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR 12 baz
// foo/bar直下にあるディレクトリ、ファイルのリストを表示
$ ipfs ls QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm/bar
QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR 12 baz
// foo/bazに記述された内容を表示
$ipfs cat QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm/baz
baz
// foo/bar/bazに記述された内容を表示
$ ipfs cat QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm/bar/baz
baz
// foo/barディレクトリの内容を表示(ディレクトリであるため、表示されない)
$ ipfs cat QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm/bar
Error: this dag node is a directory
// foo/baz内の内容をリスト表示(ファイルであるため、表示されない)
$ ipfs ls QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm/baz
References:
// foo直下の子nodeのhashを表示
$ ipfs refs QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm
QmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDN
QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR
// foo直下より下の階層のnodeのhashまで表示
ipfs refs -r QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm
QmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDN
QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR
QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR
// helpを表示
ipfs refs --help
Get:
// ipfs上にあるファイルをfoo2ファイルに出力
$ ipfs get QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm -o foo2
Saving file(s) to foo2
4.00 KB / 167 B [=================================================] 2452.69% 0s
// 2つのファイルを比較
$ diff foo foo2
Common subdirectories: foo/bar and foo2/bar
Objects:
// オブジェクト形式でfooファイル直下のファイル内容を表示
$ ipfs object get QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm
{"Links":[{"Name":"bar","Hash":"QmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDN","Size":61},
{"Name":"baz","Hash":"QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR","Size":12}],"Data":"\u0008\
u0001"}
ipfs object --help
Pin + GC:
// ローカルストレージにピン留めする
$ ipfs pin add QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm
pinned QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm recursively
// GC(gabage collection)を実施
$ ipfs repo gc
removed QmQHQ8eqpdaKCBhwZsDS7cZV49YnMpuByggPCPwRpKoRkL が何行も表示される
$ ipfs ls QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm
QmeBpzHngbHes9hoPjfDCmpNHGztkmZFRX4Yp9ftKcXZDN 61 bar/
QmWLdkp93sNxGRjnFHPaYg8tCQ35NBY3XPn6KiETd3Z4WR 12 baz
// local strageへのpinを外す
$ ipfs pin rm QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm
unpinned QmdcYvbv8FSBfbq1VVSfbjLokVaBYRLKHShpnXu3crd3Gm
// pinを外したファイルもGCが実行される
$ ipfs repo gc
Daemon:
// daemonの実行
$ ipfs daemon (in another terminal)
// 自分のipfs nodeの情報を表示
$ ipfs id
{
"ID": "QmZ3wsy1JrpY5qimbQAMcJund5Hg4ZKrbnXuNkdbvPnGNK",
"PublicKey":
"CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCuWALiivn3zBi6LjlwOd65VgAkJOHOzVrcaZaH4JuoVNSZoU
Aa6SPV6hipxjguvPR/noZq7FbtCEJ1ri3SqHm6hQS9UP7lOjs0Li1twWxSV84CTpoAdfQ/XxXz2hR6/26h72So+fuXq7pklyG09
laxtqywn7pDZvUbkrwFhigHXCp5heWk4HFZjZXMN5k80qLFigPUi0ei9g4Sn5i2FgUSJYsy8BAoKmb6SoX4onmV5RQEaziY4IrF
Q7ZTSl5WPpFbCMb0BbJ8PWREYKzZJs79OmId+5fMRzedLcUq27JttZXsqG71YPcCDaDW+0KpWbRqAiLiqgWK4EJx8f5HhzBbAgM
BAAE=",
"Addresses": [
"/ip4/127.0.0.1/tcp/4001/ipfs/QmZ3wsy1JrpY5qimbQAMcJund5Hg4ZKrbnXuNkdbvPnGNK",
"/ip4/192.168.1.4/tcp/4001/ipfs/QmZ3wsy1JrpY5qimbQAMcJund5Hg4ZKrbnXuNkdbvPnGNK",
"/ip6/::1/tcp/4001/ipfs/QmZ3wsy1JrpY5qimbQAMcJund5Hg4ZKrbnXuNkdbvPnGNK",
"/ip4/118.241.156.122/tcp/1025/ipfs/QmZ3wsy1JrpY5qimbQAMcJund5Hg4ZKrbnXuNkdbvPnGNK"
],
"AgentVersion": "go-ipfs/0.4.6/",
"ProtocolVersion": "ipfs/0.1.0"
}
Network:
(must be online)
// 誰とつながっているか
$ ipfs swarm peers
/ip4/96.60.11.62/tcp/27528/ipfs/QmZGzJ6ejcAqdhsmHbH3EFvCV3PhCUGwfHkrvCHER1pXdR
ipfs id
ipfs cat QmSMSC9SmN1wmfPsiCHxm5uuprL1ciRxkpaUqXRDkGCSDU
Mount:
(warning: fuse is finicky!)
ipfs mount
cd /ipfs/<the-hash-here>
ls
Tool:
ipfs version
ipfs update
ipfs commands
ipfs config --help
open http://localhost:5001/webui
Browse:
webui:
http://localhost:5001/webui
video:
http://localhost:8080/ipfs/QmVc6zuAneKJzicnJpfrqCH9gSy6bz54JhcypfJYhGUFQu/play#/ipfs/QmTKZgRNwDNZwHtJSjCp6r5FYefzpULfy37JvMt9DwvXse
images:
http://localhost:8080/ipfs/QmZpc3HvfjEXvLWGQPWbHk3AjD5j8NEN4gmFN8Jmrd5g83/cs
markdown renderer app:
http://localhost:8080/ipfs/QmX7M9CiYXjVeFnkfVGf3y5ixTZ2ACeSGyL1vBJY1HvQPp/mdown
オンラインにしよう
別のターミナルを立ち上げて、デーモンを実行する
$ ipfs daemon
Initializing daemon...
Adjusting current ulimit to 1024...
Successfully raised file descriptor limit to 1024.
Swarm listening on /ip4/118.241.156.122/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.11.22/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
Error: serveHTTPGateway: manet.Listen(/ip4/127.0.0.1/tcp/8080) failed: listen tcp4 127.0.0.1:8080: bind: address already in use
8080ポートが既に使われているみたい。
/Users/hiromitsu/.ipfs/config内の以下のコードの8080を別のポートに変更(参考)
{
"API": {
"HTTPHeaders": null
},
"Addresses": {
"API": "/ip4/127.0.0.1/tcp/5001",
"Gateway": "/ip4/127.0.0.1/tcp/8080",
"Swarm": [
"/ip4/0.0.0.0/tcp/4001",
"/ip6/::/tcp/4001"
]
},
...
再度実行
$ ipfs daemon
Initializing daemon...
Adjusting current ulimit to 1024...
Successfully raised file descriptor limit to 1024.
Swarm listening on /ip4/118.241.156.122/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/192.168.11.22/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8000
Daemon is ready
今度は実行できた。これでポートが繋がった。
続いて、自分とつながっているピアーアドレスを確認する。
$ ipfs swarm peers
<transport address>/ipfs/<hash-of-public-key>の形式で表示
/ip4/104.131.20.170/tcp/4001/ipfs/QmQG8e6xjqbwK7BCURayW7X6YahbCognPuAeqsVpnnVifS
実際にIPFSからデータを取得する。
$ ipfs cat /ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg >cat.jpg
$ open cat.jpg
猫の画像が表示された。
次に、ネットワークに自分のオブジェクトを流してみる
$ hash=`echo "I <3 IPFS -$(whoami)" | ipfs add -q`
$ curl "https://ipfs.io/ipfs/$hash"
I <3 IPFS -hiromitsu
パブリックゲートウェイでは表示された
別の方法(ローカルゲートウェイ)でもネットワークに流した情報が取得できるか確認する
$ curl "http://127.0.0.1:8000/ipfs/$hash"
I <3 IPFS -hiromitsu
デフォルトでは、自分のゲートウェイはパブリックではなく、ローカルで動いているようです
ブラウザ上で今の自分のIPFSへの接続状況が観れるみたい
http://localhost:5001/webui
以上、ざっと触ってみましたが、簡単にIPFS上にファイルをアップでき、内容の取得も迷わず実行することができます。
まだまだ発展途上だと思いますが、これからどんどん応用されていくと思います。
詳しい内容はもう少し勉強してから記事にしたいと思います。