通过 三大机制 揭秘 IPFS 工作原理

一 repo

1 什么是repo?

我们知道,ipfs启动之前需要先运行ipfs init初始化,什么意思?就是生成该程序的配置信息和初始的数据库,就像一个商店要开张迎业,先要把商店盖好,货物提前采购好,那这些初始化的数据放置在哪里呢?位于每个用户的家目录下.ipfs目录下,如下图(我是以ec2-user用户的身份登录的):

[ec2-user@ip-172-31-23-215 ~]$ pwd
/home/ec2-user
[ec2-user@ip-172-31-23-215 ~]$ ls .ipfs
api blocks  config datastore  datastore_spec keystore  repo.lock  version

那这些存储配置信息和数据库的目录,就叫repo( 全称:repository ,仓库)

2 repo的作用?

当要向ipfs申请数据时,ipfs先会去本地的repo目录下去查找需要的数据,repo目录里的数据分两部分,一部分是metadata(元数据)一部分是block数据(真正的内容)。metadata想像成是商店的账本,账本上记录了所有商店的产品清单(目录),而block就是摆放在商店里的具体的内容。
运行ipfs repo stat命令,查看repo的状态:

[ec2-user@ip-172-31-23-215 ~]$ ipfs repo stat
NumObjects: 21
RepoSize:   1374684
StorageMax: 10000000000
RepoPath:   /home/ec2-user/.ipfs
Version:    fs-repo@6

我们尝试向ipfs仓库里添加一个文件,仓库的状态也相应变化

[ec2-user@ip-172-31-23-215 ~]$ echo "ipfs" >foo
[ec2-user@ip-172-31-23-215 ~]$ ipfs add foo
added QmbXBAKDgbhE8HkGuEF4FuQQJej2mxqXtYSMsBPuJDqgjq foo
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo stat
NumObjects: 25
RepoSize:   1387472
StorageMax: 10000000000
RepoPath:   /home/ec2-user/.ipfs
Version:    fs-repo@6

二 Bootstrap list

1 什么是bootstrap list?

如果ipfs只是通过自己的仓库查找数据,那就太狭隘了,ipfs还会根据bootstrap 列表,了解网络上其他节点的对等体列表,如果自己的仓库里没有需要的数据,就通过bootstrap列表,查到其它的节点是否有需要的数据。 IPFS自带有默认的受信任对等列表。

[ec2-user@ip-172-31-23-215 ~]$ ipfs  bootstrap list
/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
/ip4/34.219.173.48/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok

上面列出的行是默认IPFS引导程序节点的地址 - 它们由IPFS开发团队运行。 列出的地址完全解析并以multiaddr格式指定,这使得每个协议都是明确的。 这样,您的节点就可以准确知道到达引导节点的位置 - 该位置是明确的。 除非你明白这意味着什么,否则不要改变这个列表。 Bootstrapping是分布式系统中一个重要的安全故障点:恶意引导对等方只能将您引入其他恶意对等方。 建议保留IPFS开发团队提供的默认列表,或者 - 在设置专用网络的情况下 - 保存您控制的节点列表。 不要将同行添加到您不信任的列表中。

2 实验

我为了更好理解ipfs的工作原理,准备了两台服务器A和B,分别安装运行了ipfs
在A服务器上:

[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap rm --all      ##删除默认的bootstrap list
removed /ip6/2a03:b0c0:0:1010::23:1001/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
...
[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap add /ip4/172.31.31.186/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok    ##172.31.31.186是B服务器的IP  最后面的ID是B服务器节点ID
added /ip4/172.31.31.186/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok
[ec2-user@ip-172-31-23-215 ~]$ ipfs bootstrap list 
/ip4/172.31.31.186/tcp/4001/ipfs/QmbZWkAvsFbN6Mfj8d5AnBjELb6zi6NFnFZtaDubL7bhok

服务器B上操作同A,省略
环境OK后,我做了一个测试实验,最终验证一个结果,当在A服务器的IPFS上上传了文件后,在B服务器上是可以查找到了,同时B服务器会把查询的结果保存到repo里,那这样,当A服务器宕机后,网络上还是可以通过B获取到数据。

三 Pinning

1 什么是Pinning?

ipfs有一个相当积极的缓存机制,可以在对其执行任何ipfs操作后很短时间内将对象保留在本地,但这些对象可能会被定期垃圾清理。 为了防止垃圾收集简单地固定你关心的哈希,固定的方法就是Pinning
Pinning 是ipfs中非常重要的概念。 ipfs试图让它感觉每个单独的对象都是本地的, 固定是允许你告诉ipfs始终保持给定对象本地的机制。

2 实验

查看哪些数据被Pinning

[ec2-user@ip-172-31-23-215 ~]$ ipfs pin ls
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
QmbXBAKDgbhE8HkGuEF4FuQQJej2mxqXtYSMsBPuJDqgjq recursive
QmejvEPop4D7YUadeGqYWmZxHhLc4JBUCzJJHWMzdcMe2y indirect
...

准备文件

[ec2-user@ip-172-31-23-215 ~]$ echo "ipfs rocks" >rocks
[ec2-user@ip-172-31-23-215 ~]$ ipfs add rocks
added QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy rocks
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin ls
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy recursive
...

IPFS默认会把新上传的文件做Pinning.
清除repo缓存,但被pinning的文件不会被清除

[ec2-user@ip-172-31-23-215 ~]$ ipfs repo gc    ##清除repo缓存
removed Qmaum8B9RA4gxZQRxJxxzEBEJBVfgz2DCgJSq2mzRzzJiP
removed QmQTBtcd7QWY15DsKiaAgWhtEAC6MqFu4AhvtEU2P1tiwx
...
[ec2-user@ip-172-31-23-215 ~]$ ipfs pin ls
QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFyrecursive
QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv recursive
...
[ec2-user@ip-172-31-23-215 ~]$ ipfs cat QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy

ipfs rocks内容还可以查看到
删除对该文件的Pinning

[ec2-user@ip-172-31-23-215 ~]$ ipfs pin rm -r QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
unpinned QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy
[ec2-user@ip-172-31-23-215 ~]$ ipfs repo gc
removed QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy  ##该文件的缓存被清除
removed QmaBNU361QD9rA3rmhzTk8oCBd2aygyS9Cca3m81MReGJU
removed QmRY35rAQfSmerbh3JfMMUiecqytkVpnJC9B8tpEM9c3kk

四 工作原理

IPFS获取数据的流程:

第一步:先查询Pinning 如果没有,则进入第二步
第二步:查询本地的repo ,如果没有,则进入第三步
第三步:根据bootstrap list 查寻其它节点 ,如果没有,就真的没有

五 结论

IPFS就像一个强大的连接者,手里有一个庞大的通信薄(bootstrap list),只要网上有数据,就能快速定位,缓存到自己的仓库(repo)里,并且对情有独钟的数据直接固定(pinning),永久锁定!霸气!

转载 https://www.jianshu.com/p/e4703ad30f65

你可能感兴趣的:(区块链)