EOS [从零开始 DAPP 开发] 02 - IPFS 的基本使用

pendingauth · 2019年06月10日 · 28 次阅读

本文转载自币乎,作者松果,原文链接:https://bihu.com/article/1166954857

安装IPFS

之前的文章:【EOS DAPP开发】06 - 安装和使用IPFS,介绍了jsipfs的安装方法,这里介绍一下主流的Go语言版本ipfs的安装。

下载安装包

到这里:https://dist.ipfs.io/#go-ipfsgo-ipfs安装包;下载自己系统对应版本的

目前最新版本是v0.4.20,以64位Ubuntu系统为例,下载的安装包是:go-ipfs_v0.4.20_linux-amd64.tar.gz

安装go-ipfs
tar xvfz go-ipfs_v0.4.20_linux-amd64.tar.gz
cd go-ipfs
./install.sh

ipfs命令会被安装到/usr/local/bin目录下,输入ipfs命令,查看使用菜单:

初始化和启动IPFS本地节点

初始化本地IPFS环境使用ipfs init命令,它会在本地生成IPFS节点、RSA公私钥、和一个表示节点身份的哈希值:

IPFS的数据保存在~/.ipfs目录,生成的peer identity就是本地的IPFS节点名。

查看本地节点的ID和公钥等信息:

ipfs id

启动IPFS本地节点守护进程:

ipfs daemon

可以看到,IPFS在本地的5001端口启动了API服务,HTTP网关在8080端口,Swarm网络监听在4001端口。

IPFS还提供一个Web界面:http://127.0.0.1:5001/webui

使用IPFS

1、使用add命令把一个文本文件添加到IPFS:

echo "hello ipfs" -> hello.txt
ipfs add hello.txt

返回一个哈希值:

2、使用get命令下载文件:

ipfs get QmbaRBGBd69MyWta447rJzrRyPgw7WEB5EH1dZJzjtYKw8

3、使用cat命令获取文件内容:

ipfs cat QmbaRBGBd69MyWta447rJzrRyPgw7WEB5EH1dZJzjtYKw8

4、使用http网关访问:

//本地
http://localhost:8080/ipfs/QmbaRBGBd69MyWta447rJzrRyPgw7WEB5EH1dZJzjtYKw8

//公网(需要一些同步时间)
https://ipfs.io/ipfs/QmbaRBGBd69MyWta447rJzrRyPgw7WEB5EH1dZJzjtYKw8

5、ipfs add命令添加一个 -r 选项,可以上传一个目录:

最后一个Hash值表示根目录,可以通过 ipfs ls 命令查看目录结构:

这里上传的是一个静态网页,实现了在IPFS部署静态网站,可以通过http网关访问:

https://ipfs.io/ipfs/QmRi69xU1CUFD1an88x3NbHpGMgkQaNRjio3Lku1LZuV7b

6、使用 ipfs pin 命令固定文件:

当文件从IPFS节点检索出来后,一般只会缓存很短的时间(取决于网络缓存策略,可能是几天或几周),然后会被垃圾回收机制回收;

为了避免文件被当做垃圾回收,需要使用ipfs pin命令固定已上传的文件:

ipfs pin add -r /ipfs/QmRi69xU1CUFD1an88x3NbHpGMgkQaNRjio3Lku1LZuV7b

这条命令把刚才上传的文件目录固定到本地节点。

使用如下命令可以查看本地pin(固定)的文件的哈希值:

ipfs pin ls

在实际开发中,不会7*24小时运行本地节点,因此需要使用一些(通常是付费的)第三方pin服务。

pinata.cloud就是一个第三方PIN服务提供商,可以免费固定最多1GB的内容,使用上面的哈希值固定文件到pinata:

等待一会后,IPFS上的文件会被pinata发现并固定:

然后可以使用pinata的网关访问了:

https://gateway.pinata.cloud/ipfs/QmRi69xU1CUFD1an88x3NbHpGMgkQaNRjio3Lku1LZuV7b

更多HTTP网关可以到这里查看:

https://ipfs.github.io/public-gateway-checker


IPNS

在ipfs中,文件的Hash值完全取决于其内容,如果修改它的内容,对应的Hash值也会发生改变,会有同一个文件的不同版本。但对于一些需要保持动态性的文件(如网页)来说,可能不需要旧版本。

IPNS(IPFS命名系统)就是为了解决文件动态性的问题,它通过指针每次都指向最新的文件内容,使访问者始终访问到的都是最新的版本。

IPNS使节点ID对项目根目录的哈希值进行绑定,以后访问网站时直接通过节点ID访问即可,更新网站时需要重新发布到IPNS。

使用 ipfs name publish 命令发布本节点ipns到ipfs的映射:

ipfs name publish QmRi69xU1CUFD1an88x3NbHpGMgkQaNRjio3Lku1LZuV7b

使用 ipfs name resolve 验证映射:

ipfs name resolve QmXmJg3zbmFEX2YaEMpMMiFn63E2JuyUxsswsGrPa8jd4k

就建立起了 QmXmJg3zbmFEX2YaEMpMMiFn63E2JuyUxsswsGrPa8jd4k(节点ID) 到 /ipfs/QmRi69xU1CUFD1an88x3NbHpGMgkQaNRjio3Lku1LZuV7b(文件哈希值) 的映射。

现在可以使用IPNS访问项目了:

//本地(速度比较慢,但能打开)
http://localhost:8080/ipns/QmXmJg3zbmFEX2YaEMpMMiFn63E2JuyUxsswsGrPa8jd4k
//公网(速度非常慢,开了VPN也很难打开)
https://ipfs.io/ipns/QmXmJg3zbmFEX2YaEMpMMiFn63E2JuyUxsswsGrPa8jd4k

当更新网站代码时,需要重新执行如下命令:

ipfs add -r <文件目录>
ipfs name publish <新的hash值>

需要多个IPNS时,使用ipfs key gen命令生成新的公私钥对(名为mykey):

ipfs key gen --type=rsa --size=2048 mykey

使用ipfs key list命令查看所有密钥对:

ipfs key list

使用新的密钥对可以publish一个新的IPNS:

ipfs add -r 3DCube
ipfs name publish --key=mykey QmazPmMyBscmY8D4pKQMsuQHvwf2yFfNcCBn4jnV1vdgFG

访问:

http://localhost:8080/ipns/QmeknMPj59Ff1meiPRh2pcD9wWrcLX3DqjRGCjL6NMaBGz
https://ipfs.io/ipns/QmeknMPj59Ff1meiPRh2pcD9wWrcLX3DqjRGCjL6NMaBGz


IPNS使用的是节点ID,本质上是节点公钥的哈希值,同样难以记忆,使用DNSLink可以把哈希值绑定到现有的域名。

cloudflare.com提供了域名绑定服务,添加两项DNS Records (我没有域名,这里只是演示):

Type Name Value TTL
CNAME songguo.com gateway.pinata.cloud Automatic
TXT _dnslink dnslink=/ipfs/QmRi69xU1CUFD1an88x3NbHpGMgkQaNRjio3Lku1LZuV7b Automatic

然后到域名服务提供商处修改域名的nameservers为cloudflare提供的nameservers,就可以使用域名访问搭建在IPFS上的网站了。

遇到的问题

在公网环境下,即使搭了梯子,也几乎无法使用IPNS访问文件,目前最好的方案是使用第三方HTTP网关(同时提供pin服务)访问IPFS上的文件:

https://gateway.pinata.cloud/ipfs/QmRi69xU1CUFD1an88x3NbHpGMgkQaNRjio3Lku1LZuV7b

但会导致每次更新文件都生成新的哈希值,要重复固定。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册