星鉴网>技术干货>IPFS教学和笔记

IPFS教学和笔记

2018/12/25 16:56:11 1851人阅读

【导读】 IPFS(星际文件系统)是用来取代已经太过集中化的HTTP的一种方案,这里不做一般性的介绍。

  IPFS (星际文件系统) 是用来取代已经太过集中化的 HTTP 的一种方案,这裡不做一般性的介绍,因为其它 blog / Wikipedia 上都有写了。我想使用 IPFS 的理由是:


  网络过度集中化,使用者自愿放弃自由,请参考(https://www.ipfsfirst.com/ipfsrumen_279)。


  依赖单一公司提供的平台所发佈的文章,即使没有反政府、侵权、政治不正确 blah blah 还是有各种不同的可能被下架,而你已经在 EULA 中同意不去追究了。


  Google Blogspot, Tumblr, Facebook Blog 提供的免费、高品质 blog,仍然有上述的疑虑。


  即使是自己架的 Word Press,哪一天被警察用任何理由抄掉了,上面的网页就没有了。


  去中心化,才能有民主、自由的网络。即使如此,去中心化仍然需要网络中立性的支持,不然你的 ISP 仍然可以独厚(加速)大公司的网站。


  本篇教学 不会 论述以下主题:


  免责或匿名性。这是另一个大题目,去中心化不代表你可以匿名。


  挖矿、区块链、或任何虚拟货币。


  ICO 特别是 IPFS 最近的 Filecoin ICO 。


  下载、安装


  下载


  下载很简单,请直接到 IPFS 官网 或直接到这里(https://dist.ipfs.io/#go-ipfs)下载。我直接下载了 go-ipfs 0.4.10, Mac OS X 请下载 Darwin amd64, Ubuntu 请下载 Linux amd64。


  安装


  直接在命令列下打这些指令就好:


  $ ipfs init # 会在 ~/.ipfs 开一个目录,存放区块档,预设是最大 10GB


  $ ipfs id # 列出自己的 ID, 但其实不需要太介意


  {


  "ID": "QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR",


  "PublicKey": "...",


  "Addresses": [


  "..."


  ],


  "AgentVersion": "go-ipfs/0.4.10/",


  "ProtocolVersion": "ipfs/0.1.0"


  }


  想修改预设的暂存大小的话,请下这个指令:


  export EDITOR=/usr/bin/vim


  ipfs config edit


  找到 "StorageMax": "10GB", 这行,把 10GB 换成你要的大小即可。


  新增文件


  先来随便新增一个文件吧。打开记事本,随便打几行字 lorem ipsum dolor sit amet 存成 README.md。


  ipfs add 可以把文件加进 IPFS 裡,它会传回一组 HASH, 那个 HASH 就是这个文件的唯一识别代码了。


  $ ipfs add README.md


  added QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd README.md


  $ ipfs cat /ipfs/QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd


  lorem ipsum dolor sit amet


  即使你换到别台机器,一样可以用 ipfs cat /ipfs/QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd 看到这个文件的内容。


  如果要分享给没有安装 IPFS 的朋友(建议顺便推坑!) 可以请他使用 IPFS Gateway: https://ipfs.io/ipfs/QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd 把后面的 HASH 换成你刚刚新增的文件的 HASH,就可以了!


  我比较习惯目录


  大家都还是比较习惯目录结构吧?已经 ipfs add 的文件,可以被放进目录裡。


  $ ipfs files mkdir /SmartCity # 开一个目录


  $ ipfs files cp /ipfs/QmQhK6KAVA2nJgFYzf7D1yHdH11GiGJv6zRTUhoVZwXpDd /SmartCity/README.md


  $ ipfs files ls /


  SmartCity


  $ ipfs files ls /SmartCity/


  README.md


  $ ipfs files read /SmartCity/README.md


  lorem ipsum dolor sit amet


  我目前还不知道怎么把目录 export 出去,让别人也可用使用同样的目录结构。


  上传一整个目录


  使用 ipfs add -r 可以上传一整个目录。比方说,这篇教学可以用这种方式上传 (小心 不要把 .git/ 下面的东西都传上去了!)


  $ ipfs add -r ipfs-tutorial-taiwan-mandarin


  added QmdpYD8hejksA5SHNdRfDzE2EYzpSkbazyVAJq5hRwbKtp ipfs-tutorial-taiwan-mandarin/README.md


  added QmWe7m2K8DThCUTPuw5KcbYvpAwogScXt8gazfG7QiRpSo ipfs-tutorial-taiwan-mandarin


  这样就可以用下列方式取得 README.md 的内容:


  ipfs cat /ipfs/QmdpYD8hejksA5SHNdRfDzE2EYzpSkbazyVAJq5hRwbKtp


  ipfs cat /ipfs/QmWe7m2K8DThCUTPuw5KcbYvpAwogScXt8gazfG7QiRpSo/README.md


  避免被垃圾回收 (Garbage Collection, GC)


  ipfs 会自动做垃圾回收,减少佔用的本机空间。为了避免我们刚发佈的网页被垃圾回收,可以把整个目录 pin 起来。


  $ ipfs pin add -r /ipfs/QmWe7m2K8DThCUTPuw5KcbYvpAwogScXt8gazfG7QiRpSo


  记得要 pin 的是目录的 hash 不要贴错了哟!


  我在 IPFS 上的第一个网页


  IPFS 的本质是分散式的文件系统,如果只是要 host 分散式的部落格的话,可以使用 ZeroNet 。晚一点我会再写一篇 ZeroNet 的介绍。


  请注意 如果在 pin 或 publish 的过程中遇到任何问题,可能是防火牆的关系。跑 ipfs daemon 的时候,它会列出对外连线的 port 请在防火牆打开。


  % ipfs daemon


  Initializing daemon...


  Adjusting current ulimit to 2048...


  Successfully raised file descriptor limit to 2048.


  Swarm listening on /ip4/127.0.0.1/tcp/4001


  Swarm listening on /ip4/192.168.2.1/tcp/4001


  Swarm listening on /ip4/220.xxx.xx.xxx/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/8080


  Daemon is ready


  Debian 系的 Linux 请爱用 sudo ufw allow 4001 即可。


  出于莫名的原因,我决定不要使用最常见的 Jekyll 。以下范例是 Hugo 做的 :)


  Huge 后面还有使用 ipfs 范例中的 mdown 来 render 的例子。


  安装 Hugo


  参考 Hugo官网(https://gohugo.io/getting-started/quick-start/)的说明,在 Mac 上安装 Hugo:


  $ brew install hugo


  Updating Homebrew...


  Warning: hugo 0.26 is already installed


  $ hugo version


  Hugo Static Site Generator v0.26 darwin/amd64 BuildDate: 2017-08-08T14:55:38+08:00


  $ hugo new site ipfs-tutorial-zh-TW


  Congratulations! Your new Hugo site is created in /Users/miaoski/github/ipfs-tutorial-zh-TW.


  $ git init


  Initialized empty Git repository in /Users/miaoski/github/ipfs-tutorial-zh-TW/.git/


  $ git submodule add https://github.com/budparr/gohugo-theme-ananke.git themes/ananke


  Cloning into '/Users/miaoski/github/ipfs-tutorial-zh-TW/themes/ananke'...


  $ echo 'theme = "ananke"' >> config.toml


  修改 config.toml 设定一下 title 和语系什么的,就可以了。


  新增 blog 文章


  $ hugo new posts/ipfs-tutorial.md


  /Users/miaoski/github/ipfs-tutorial-zh-TW/content/posts/ipfs-tutorial.md created


  $ cat ../ipfs-tutorial/README.md >> ./content/posts/ipfs-tutorial.md


  修改一下,把 draft: true 改成 draft: false 再执行一次 hugo 就可以 render 出网页了。


  把部落格新增到 IPFS 上


  依据 hugo 的建议,先 rm -fr public/ 再重新执行 hugo 比较好...


  $ rm -fr ./public/


  $ hugo


  $ ipfs add -r ./public/


  added QmW7dJkAjtLgUtJcgUrTPC2jSLTD8uS4bfzPPXYdsZGhFN public/posts


  added QmecA1oy5du9TwNrJrwxjq5emUdG7jbukv8Pzuo2q8CjRc public/tags


  added QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf public


  $ ipfs pin add -r /ipfs/QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf


  pinned QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf recursively


  请跳到 IPNS 一节阅读。


  mdown


  mdown 是 ipfs 范例中的 markdown-viewer 是以 MIT 版权宣告的。有时候我们只是想分享一份简单的 markdown,它十分轻量,render 出来的效果也不错。它的背后是 StrapDownJS。


  本文的 Github repo 已经把 mdown 加在裡面了,直接 make 就会看到 ipfs add 上去的 HASH。它也会写在 published-version 文件裡。接著我们可以用 IPNS 发佈它。


  IPNS


  拿到网站的 HASH 后,建议注册 IPNS ,因为每次更新部落格的内容,上面的 HASH 都会变,我们需要一个固定的 ID 指向最新的 HASH 。以本文为例:


  $ ipfs name publish QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf


  Published to QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR: /ipfs/QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf


  $ ipfs name resolve QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR


  /ipfs/QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf


  以后每次更新完网站,都要重新 ipfs add -r ./public/ 一 次,然后再执行 ipfs name publish ... ,这样/ipns/QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR 才会指向最新的 HASH 哦! (注意是 IPNS 不要搞错!)


  使用 hugo 的同学,顺便更新 config.toml:


  baseURL = "https://ipfs.io/ipns/QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR/"


  languageCode = "zh-tw"


  title = "第一次用 IPFS 就上手"


  theme = "ananke"


  快取 (pin)


  把内容快取到本地端,并且提供给其他人。


  ipfs pin add QmT7TX5vGmFz86V8cDkPuTss1vp4qTXeaziGZrjdJhURFf


  add 本身就是递归的,所有的子目录都会被 pin 住。可以用 ipfs pin ls 看看本地端 pin 了什么。 这一篇 的指令都可以玩玩看。


  TXT


  因为一串 HASH 真的很难记,所以可以用修改 DNS 的 TXT 栏的方式,让使用者可以用 https://ipfs.io/ipns/miaoski.idv.tw/ 这种方式,存取到你的文件或部落格。要特别注意, TXT 设定完后,如果你用笔电的话,不要太快离线,不然别人可能还来不及 cache 住 TXT 解析的内容。


  $ host -t TXT miaoski.idv.tw


  miaoski.idv.tw descriptive text "dnslink=/ipns/QmNmfAqjiQgdLJscpM3FufbaXY9QEqWZiWqDTbsrUjSKDR"


  下面的情况都是正常的。但是 ipfs name resolve -r 必须要能正确解析出 /ipfs/ 的位址,别人才看得到你公开的内容。


  $ ipfs name resolve miaoski.idv.tw


  Error: Could not resolve name (recursion limit exceeded).


  $ ipfs dns -r atnnn.com


  Error: not a valid domain name


  $ ipfs dns atnnn.com


  Error: Could not resolve name (recursion limit exceeded).


  来试试看我的网页吧! https://ipfs.io/ipns/miaoski.idv.tw/


  推上 CloudFlare


  CloudFlare 在 2018.9.17 的时候和 IPFS 合作,提供入口及 SSL 凭证,应该会让 IPFS 稳定许多。建议要发佈网页的朋友,可以和 CloudFlare 连在一起。做法如下:


  需要有自己的 domain name


  可以修改 TXT 栏位 (像上面写的 ipns 那样)


  把网页内容丢进一个目录裡,入口是 index.html


  把网页的网域名称 CNAME 到 www.cloudflare-ipfs.com


  加一个 _dnslink.your.website = dnslink=/ipfs/


  上 https://www.cloudflare.com/distributed-web-gateway/#connectingyourwebsite 登录


  举例而言,


  我在 DNS Server 上新增一个 ipfs.miaoski.idv.tw


  把它 CNAME 到 www.cloudflare-ipfs.com


  新增 TXT 栏位 Hostname: _dnslink.ipfs.miaoski.idv.tw / TXT: dnslink=/ipfs/QmR2PvgrHny4ispfEVygvvWkNqwjbU7hareWda41ASF5wC


  上 https://www.cloudflare.com/distributed-web-gateway/#connectingyourwebsite 登录


  这样以后看 https://ipfs.miaoski.idv.tw/ 就会自动被转址为 https://cloudflare-ipfs.com/ipfs/QmR2PvgrHny4ispfEVygvvWkNqwjbU7hareWda41ASF5wC 而且会有合法的 SSL 凭证。


  用 nslookup 检查一下:


  $ nslookup


  > set type=ANY


  > ipfs.miaoski.idv.tw.


  ipfs.miaoski.idv.tw canonical name = www.cloudflare-ipfs.com.


  > _dnslink.ipfs.miaoski.idv.tw.


  _dnslink.ipfs.miaoski.idv.tw text = "dnslink=/ipfs/QmR2PvgrHny4ispfEVygvvWkNqwjbU7hareWda41ASF5wC"


  我还不懂的部份


  BitSwap


  DHT


  把 git repo 和 IPFS 整合在一起


  参考资料


  https://blog.acolyer.org/2015/10/05/ipfs-content-addressed-versioned-p2p-file-system


  https://discuss.ipfs.io/t/how-does-files-api-ipfs-files-command-work/344/3


  https://ipfs.io/ipfs/QmdPtC3T7Kcu9iJg6hYzLBWR5XCDcYMY7HV685E3kH3EcS/2015/09/15/hosting-a-website-on-ipfs/


  https://qtum.org/zh/blog/ru-he-shi-yong-xing-ji-wen-jian-chuan-shu-wang-luo-ipfs-da-jian-qu-kuai-lian-fu-wu


  https://developers.cloudflare.com/distributed-web/ipfs-gateway/connecting-website/


  License 版权声明


  我自己编写的部份,全部使用 CC BY-SA 4.0 声明。如果有引用他人的部份,请参考各该文件所属的版权声明。

12

参与讨论

登录后参加评论......

全部评论 0

作者

返回顶部