1

以太坊实践整理(一)区块链基础知识
以太坊实践整理(二)Geth客户端
以太坊实践整理(三)Remix开发部署智能合约
以太坊实践整理(四)Truffle智能合约开发框架
以太坊实践整理(五)DApp开发全过程记录(上)
以太坊实践整理(五)DApp开发全过程记录(下)
以太坊实践整理(六)文件去中心化存储


前面实现的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访问:
截屏2021-09-16 下午5.38.05.png

截屏2021-09-16 下午5.38.31.png

截屏2021-09-16 下午5.38.23.png

通过网关访问

因为当前浏览器不支持IPFS协议(ipfs://)访问文件,需要借助Web网关服务去获取IPFS网络上的文件。刚上传的文件可以通过网关这么访问了:
http://127.0.0.1:8080/ipfs/Qm...

截屏2021-09-16 下午5.26.34.png

文件已经同步至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这样一个激励机制。


以太坊实践整理(一)区块链基础知识
以太坊实践整理(二)Geth客户端
以太坊实践整理(三)Remix开发部署智能合约
以太坊实践整理(四)Truffle智能合约开发框架
以太坊实践整理(五)DApp开发全过程记录(上)
以太坊实践整理(五)DApp开发全过程记录(下)
以太坊实践整理(六)文件去中心化存储


zhutianxiang
1.5k 声望327 粉丝