区块链大学程序员IPFS-星际文件传输系统

【IPFS专题#002】通过 三大机制 揭秘 IPFS 工作原理

2018-05-26  本文已影响47人  xutaotao


【本文由“币嗨Bihi内容合伙人计划“赞助,了解详情请加微信:mangou1987】

一 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),永久锁定!霸气!


上一篇下一篇

猜你喜欢

热点阅读