以太坊实践整理(六)文件去中心化存储

前面实现的DAPP,通过公开源代码和智能合约实现了运行时规则的去中心化。但是前端页面始终是来自中心化的Web服务器,中心化服务器对显示内容有绝对的控制权,所以去中心化还不够纯粹。我需要对整个前端打包目录进行去中心化的存储。
IPFS协议
IPFS目标是取代HTTP去构建一个更好的去中心化的Web。现有的网络服务,基于IP寻址的,就是IP找到内容所在的服务器,然后再与服务器交互。而在IPFS的网络里是根据内容寻址的,我们上传到IPFS的文件都会产生哈希值,无需知道文件存储在哪里,通过哈希值就能够找到这个文件。
IPFS安装

$ tar go-ipfs_v0.9.1_darwin-amd64.tar $ cd go-ipfs $ sudo ./install.sh

【以太坊实践整理(六)文件去中心化存储】IPFS初始化
$ ipfs init generating ED25519 keypair...done peer identity: 12D3KooWBsfJCNoZBNLd825gcAnhSMqHJoFmE3PSpd86v49PjJSQ initializing IPFS node at /Users/zhutx/.ipfs to get started, enter:ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme

以上命令执行后,生成密钥对并产生对应的节点身份id(peer identity)。同时在用户主目录下产生一个.ipfs的隐藏目录,IPFS相关数据都在这里。IPFS配置文件为.ipfs/config,同步文件数据库在.ipfs/blocks目录,密钥在.ipfs/keystore目录。
上传文件
创建文件:
$ echo "Hello World" >> hello.txt

添加到IPFS:
$ ipfs add hello.txt added QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u hello.txt 12 B / 12 B [=========================================================] 100.00%

查看IPFS上文件内容:
$ ipfs cat QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u Hello World

上传目录
创建目录并将文件移入:
$ mkdir upload $ mv hello.txt upload

上传整个目录到IPFS:
$ ipfs add -r upload added QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u upload/hello.txt added QmXnF4uF4hG8pANVHxXoL9z8v87xinNwcdMMnBnqRnrSiW upload 12 B / 12 B [============================================================================================] 100.00%

上面命令返回目录hash,以及每个文件的hash,文件的内容没变化所以还是之前的哈希值
// 可以通过【目录哈希值/文件名】的方式,访问文件内容 $ ipfs cat QmXnF4uF4hG8pANVHxXoL9z8v87xinNwcdMMnBnqRnrSiW/hello.txt Hello World// 当然也是可以直接文件哈希值访问文件内容 $ ipfs cat QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u Hello World

同步到网络
上面我们添加的文件和目录,仅仅存在于本地IPFS节点上,我们需要把数据同步到IPFS网络中,需要开启daemon服务:
$ ipfs daemon Initializing daemon... go-ipfs version: 0.9.1 Repo version: 11 System version: amd64/darwin Golang version: go1.16.6 Swarm listening on /ip4/127.0.0.1/tcp/4001 Swarm listening on /ip4/127.0.0.1/udp/4001/quic Swarm listening on /ip4/192.168.31.175/tcp/4001 Swarm listening on /ip4/192.168.31.175/udp/4001/quic Swarm listening on /ip6/::1/tcp/4001 Swarm listening on /ip6/::1/udp/4001/quic Swarm listening on /p2p-circuit Swarm announcing /ip4/127.0.0.1/tcp/4001 Swarm announcing /ip4/127.0.0.1/udp/4001/quic Swarm announcing /ip4/192.168.31.175/tcp/4001 Swarm announcing /ip4/192.168.31.175/udp/4001/quic Swarm announcing /ip6/::1/tcp/4001 Swarm announcing /ip6/::1/udp/4001/quic API server listening on /ip4/127.0.0.1/tcp/5001 WebUI: http://127.0.0.1:5001/webui Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080 Daemon is ready

开启daemon之后,就会尝试连接其他节点同步数据。同时在本地还会开启API服务和Web网关服务(默认8080端口)。
API服务控制台
API服务配套了一个IPFS Web版的管理控制台,可以直接在控制台上上传文件,查看节点连接情况等等。
可以通过http://localhost:5001/webui访问:
以太坊实践整理(六)文件去中心化存储
文章图片

以太坊实践整理(六)文件去中心化存储
文章图片

以太坊实践整理(六)文件去中心化存储
文章图片

通过网关访问
因为当前浏览器不支持IPFS协议(ipfs://)访问文件,需要借助Web网关服务去获取IPFS网络上的文件。刚上传的文件可以通过网关这么访问了:
http://127.0.0.1:8080/ipfs/Qm...
以太坊实践整理(六)文件去中心化存储
文章图片

文件已经同步至IPFS网络了,外部用户访问的话,就可以通过IPFS官方网关访问了:https://ipfs.io/ipfs/QmXnF4uF...
官方IPFS网关服务可能是需要才能连接,可以从这里找第三方公共IPFS网关服务:
https://ipfs.github.io/public...
通过上传目录的方式,我们可以把DAPP前端目录整个上传到IPFS网络去,就实现了前端的去中心化。不过,要注意代码里需要使用相对路径引入css、js等资源,否则通过IPFS访问index.html时会找不到相应文件。
IPFS与filecoin什么关系
IPFS是一个网络协议,而Filecoin则是一个基于IPFS的去中心化存储项目。Filecoin项目是IPFS网络的激励层,Filecoin项目主要是为了激励大家贡献硬盘资源,因为IPFS挖矿本质上就是共享自己的存储空间。
我们可以把Filecoin项目理解为是运行在IPFS网络里的一个激励制度。IPFS是一个点对点的分布式网络,IPFS需要更多的节点参与进来,参与方式就是接入IPFS网络共享硬盘和带宽。但是,如果没有一套好的激励机制,谁愿意贡献出自己的硬盘和带宽资源呢 ?所以这时候,IPFS就需要filecoin这样一个激励机制。

    推荐阅读