学习IPFS
注:以下所有操作均在CentOS 6.8 x86_64位系统下完成。
IPFS(InterPlanetary File System)是一个点对点的分布式超媒体分发协议,被认为是最有可能取代HTTP的新一代互联网协议,关于IPFS的更多介绍可参考:IPFS官网。
#准备工作#
在下载IPFS之前可能需要“科学上网”,详见:Centos安装Shadowsocks+安装Privoxy+配置SSH使用代理。
#安装IPFS#
这里我们直接下载其官方编译好的版本(Prebuilt Package)。
# wget https://dist.ipfs.io/go-ipfs/v0.4.14/go-ipfs_v0.4.14_linux-amd64.tar.gz # tar zxf go-ipfs_v0.4.14_linux-amd64.tar.gz # mv go-ipfs /usr/local/
配置环境:
# vim /etc/profile ... export IPFS_HOME=/usr/local/go-ipfs export PATH=$PATH:IPFS_HOME ... # source /etc/profile # ipfs version ipfs version 0.4.14
可以看到IPFS已经安装成功。
#使用IPFS#
一、创建IPFS节点
# ipfs init initializing IPFS node at /root/.ipfs generating 2048-bit RSA keypair...done peer identity: QmTW4AoQABDBxQwa4fn5yEqhAKXx2fyFXkksy6LQuDQWK1 to get started, enter: ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
这个时候默认会在~/目录下创建一个.ipfs的目录,里面包含了配置文件信息等。可以自由进行修改(比如可以把默认的10GB存储空间改小点):
# vim /root/.ipfs/config ... "Datastore": { "StorageMax": "10GB", ... }, "Addresses": { "Swarm": [ "/ip4/0.0.0.0/tcp/4001", "/ip6/::/tcp/4001" ], ... } ...
也可以自己选择指定的IPFS目录:
# mkdir -p /data/ipfs # vim /etc/profile ... export IPFS_PATH=/data/ipfs ... # source /etc/profile # ipfs init generating 2048-bit RSA keypair...done peer identity: QmQa7NH5w7pxz34Sme96GUM8dH14upF3H67PDCX8nKXp4T to get started, enter: ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
这里将IPFS目录改为/data/ipfs。
二、查看节点ID
# ipfs id { "ID": "QmQa7NH5w7pxz34Sme96GUM8dH14upF3H67PDCX8nKXp4T", "PublicKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdpn...", "Addresses": null, "AgentVersion": "go-ipfs/0.4.14/", "ProtocolVersion": "ipfs/0.1.0" }
这里可以看到QmQa7NH5w7pxz34Sme96GUM8dH14upF3H67PDCX8nKXp4T就是当前节点的ID值,每个节点都有一个唯一的ID值。
三、跨域资源共享
# ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST", "OPTIONS"]' # ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
四、启动服务器
当前IPFS节点虽然创建成功,但还没有启动加入到IPFS网络,外面无法访问,需要启动服务器:
# ipfs daemon & Initializing daemon... Swarm listening on /ip4/127.0.0.1/tcp/4001 Swarm listening on /ip4/172.18.167.60/tcp/4001 Swarm listening on /p2p-circuit/ipfs/QmQa7NH5w7pxz34Sme96GUM8dH14upF3H67PDCX8nKXp4T Swarm announcing /ip4/127.0.0.1/tcp/4001 Swarm announcing /ip4/172.18.167.60/tcp/4001 API server listening on /ip4/127.0.0.1/tcp/5001 Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 Daemon is ready
五、新增文件
我们可以将本地的一个文件添加到IPFS网络中:
# pwd /root # vim foo.txt ... # cat foo.txt Hello World # ipfs add foo.txt added QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u foo.txt # ipfs cat QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u Hello World
这个时候我们已经将一个文件foo.txt添加到当前的IPFS节点中,并且可以通过生成的唯一哈希值QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u来查看该文件内容,接下来我们需要将其同步到IPFS网络中:
# ipfs daemon &
Initializing daemon...
...
Daemon is ready
我们试着在本地浏览器打开地址(https://ipfs.io/ipfs/QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u)查看文件:
可以看到文件已经成功地同步到了IPFS网络中。
六、新增文件夹
接下来我们可以在IPFS的根目录下创建文件夹,并且可以将foo.txt文件cp或mv到新创建的文件夹中。
# ipfs files mkdir /foo # ipfs files cp /ipfs/QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u /foo/foo.txt # ipfs files ls / foo # ipfs files ls /foo foo.txt # ipfs files read /foo/foo.txt Hello World
可以看到我们已经成功地将该文件cp到了一个foo的新建目录下,接下来我们尝试在本地创建一个目录并将其上传到IPFS网络中:
# mkdir bar # vim bar/bar.txt # cat bar/bar.txt Hello World 2 # ipfs add -r bar/ added QmShGj2c1Qe2wQKMUNMx45EPoKsJmwewojrE1ETzXggUFG bar/bar.txt added QmepZ8kfqvfDgLtaA7jiCZowXsgn63bKxJLS5NPNiqU2A9 bar
我们试着在本地浏览器打开地址(https://ipfs.io/ipfs/QmepZ8kfqvfDgLtaA7jiCZowXsgn63bKxJLS5NPNiqU2A9)查看文件夹: