后面实现的 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 这样一个激励机制。