IPFS
ipfs是一个内容可寻址的点对点超媒体协议。基于http协议的网络中,我们获取内容需要先连接上内容所在的服务器,然后获取内容。ipfs网络中,所有的文件通过加密哈希映射到一个空间中,并且能够保证唯一。
在获取一个内容时,我们知道这个内容对应的哈希key,通过DHT算法,可以在一个巨大的网络节点中快速找到拥有数据的节点(在一个拥有10,000,000个节点的网络中只需要20跳),从而检索出数据。 除了上述技术之外,IPFS也融合了git的版本管理,BitTorrent的bitswap,Self-Certified Filesystems等技术。
IPFS的基本操作
// ipfs 初始化
> ipfs init
initializing ipfs node at /Users/jbenet/.go-ipfs
generating 2048-bit RSA keypair...done
peer identity: Qmcpo2iLBikrdf1d6QU6vXuNb6P7hwrbNPW9kLAH8eG67z
to get started, enter:
ipfs cat /ipfs/QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG/readme
// 启动deamon
> ipfs daemon
Initializing daemon...
API server listening on /ip4/127.0.0.1/tcp/5001
Gateway server listening on /ip4/127.0.0.1/tcp/8080
// 获取文件
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 -<your username>
//使用自己的gateway访问ipfs的资源
> curl "http://127.0.0.1:8080/ipfs/$hash"
I <3 IPFS -<your username>
//web console
http://localhost:5001/webui
添加website至IPFS
将静态网站部署至IPFS上非常简单
➜ git:(master) ✗ ipfs add -r website
added QmV94V8W4bu1UUbNtVwafji7acSQyG8uPx1Tf6mRbLK9zo website/css/custom.css
added QmQAPL7vsWyQSMcMzKBzALWXzFDQSRuwcRpdTXs6oi2yyZ website/css/normalize.css
added QmRyrbwkktbe4SM4Q6ZYV1TENEwMKVfHBShnVbqyyKmovh website/css/skeleton.css
added QmXA57jefG32EnVMH9o69ubcKmGd6eH2YECa2w32KuBQtD website/images/me.jpg
added QmP283YcqfZ24e4db4ACFRwvKGqymTZ2o21dmJwok1Spdi website/index.html
added Qmd1KnoAM1yDTtHDEL9ghex2sbEGVgsSeQKcNhG1a6844z website/index.xml
added QmRw359MwfVryZGRZ1fWQbyNXyCwsHA26tiM9Jd9t6sco3 website/livereload.js?port=1313&mindelay=10
added QmZG3urHo2oJZ2wV1svrBXi18VsmkPyketqo8EYvHaQ7aj website/posts/blog_on_ipfs/index.html
added QmWTEZJZdGykuRxnoqNwLSu6zJ6WqbzNaDeJLX5ex97qF1 website/css
added QmbFctMzEuWoNKhXFjGbrbXNTM9hDXNM8JRxmj7Zspc7Bh website/images
added QmeBUwj2rmzhnGADd84wZ77p6GoHVsnrTaKEfavEerSjG1 website/posts/blog_on_ipfs
added QmcjgdnQe7uuriYBXCV6Lfdu3sDo3ASzWAdzBF1UTbtDHd website/posts
added QmZ86JMLnTpUnFx2Dg4iKQSXvQu7rkH4zWbfhEwQxGnVu5 website
执行之后就完成了部署。我们可以通过QmZ86JMLnTpUnFx2Dg4iKQSXvQu7rkH4zWbfhEwQxGnVu5来访问我们刚刚部署的website。
这里有一个前提,href中的路径都是基于website_dir的相对路径。如果你的website里面的路径是绝对路径,可以通过一些工具convert一下,wget --mirror --convert-links --page-requisites http://you_site
是一种简单的转化方式。
上述方法有个问题,由于ipfs的hash对应着一个不可变的内容,每次更新网站之后,website的hash都会变。旧的link不能访问到新的内容。
ipfs提供了ipns来解决更新的问题。ipfs允许用户使用一个私有密钥来对IPFS哈希附加一个引用,使用一个公共密钥哈希(简称pubkeyhash)表示你的网站的最新版本。具体操作是:
update website content
➜ git:(master) ✗ sitehash=QmZ86JMLnTpUnFx2Dg4iKQSXvQu7rkH4zWbfhEwQxGnVu5
➜ git:(master) ✗ ipfs name publish $sitehash
...
update websit content
➜ git:(master) ✗ sitehash=QmRGfsCrkHHUFwZWKeV1DnL83FoJ5G4qTUnmhAR4HnfWtV
➜ git:(master) ✗ ipfs name publish $sitehash
Published to QmRpHvp6pH1gTMTvgngx5EWGEU3kFfP8VyDHkmg85KBkiu: /ipfs/QmRGfsCrkHHUFwZWKeV1DnL83FoJ5G4qTUnmhAR4HnfWtV
通过上述方式,就完成了website和一个固定的link的绑定,QmRpHvp6pH1gTMTvgngx5EWGEU3kFfP8VyDHkmg85KBkiu
如果你有自己的domain,可用通过更新你的dns provider的配置,使得你的domain link到基于ipfs部署的website。
DNS TXT record
dnslink=/ipns/QmRpHvp6pH1gTMTvgngx5EWGEU3kFfP8VyDHkmg85KBkiu