博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过 三大机制 揭秘 IPFS 工作原理
阅读量:4049 次
发布时间:2019-05-25

本文共 4276 字,大约阅读时间需要 14 分钟。

一 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 .ipfsapi 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 statNumObjects: 21RepoSize:   1374684StorageMax: 10000000000RepoPath:   /home/ec2-user/.ipfsVersion:    fs-repo@6

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

[ec2-user@ip-172-31-23-215 ~]$ echo "ipfs" >foo[ec2-user@ip-172-31-23-215 ~]$ ipfs add fooadded QmbXBAKDgbhE8HkGuEF4FuQQJej2mxqXtYSMsBPuJDqgjq foo[ec2-user@ip-172-31-23-215 ~]$ ipfs repo statNumObjects: 25RepoSize:   1387472StorageMax: 10000000000RepoPath:   /home/ec2-user/.ipfsVersion:    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 listremoved /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服务器节点IDadded /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 lsQmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursiveQmbXBAKDgbhE8HkGuEF4FuQQJej2mxqXtYSMsBPuJDqgjq recursiveQmejvEPop4D7YUadeGqYWmZxHhLc4JBUCzJJHWMzdcMe2y indirect...

准备文件

[ec2-user@ip-172-31-23-215 ~]$ echo "ipfs rocks" >rocks[ec2-user@ip-172-31-23-215 ~]$ ipfs add rocksadded QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy rocks[ec2-user@ip-172-31-23-215 ~]$ ipfs pin lsQmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursiveQmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy recursive...

IPFS默认会把新上传的文件做Pinning.

清除repo缓存,但被pinning的文件不会被清除

[ec2-user@ip-172-31-23-215 ~]$ ipfs repo gc    ##清除repo缓存removed Qmaum8B9RA4gxZQRxJxxzEBEJBVfgz2DCgJSq2mzRzzJiPremoved QmQTBtcd7QWY15DsKiaAgWhtEAC6MqFu4AhvtEU2P1tiwx...[ec2-user@ip-172-31-23-215 ~]$ ipfs pin lsQmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFyrecursiveQmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv 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 QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFyunpinned QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy[ec2-user@ip-172-31-23-215 ~]$ ipfs repo gcremoved QmRTV3h1jLcACW4FRfdisokkQAk4E4qDhUzGpgdrd4JAFy  ##该文件的缓存被清除removed QmaBNU361QD9rA3rmhzTk8oCBd2aygyS9Cca3m81MReGJUremoved QmRY35rAQfSmerbh3JfMMUiecqytkVpnJC9B8tpEM9c3kk

四 工作原理

IPFS获取数据的流程:

第一步:先查询Pinning 如果没有,则进入第二步

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

五 结论

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

转载

你可能感兴趣的文章
史记翻译-汉初三杰-张良-留侯世家第二十五
查看>>
史记翻译-汉初三杰-韩信-淮阴侯列传第三十二
查看>>
帝王封赏之道和老板的封赏之道
查看>>
工作分解结构在软件开发中的应用
查看>>
关于系统崩溃后的Oracle恢复
查看>>
遭遇蚊子的獠牙,想起一种叫黄鸡婆的小虫子
查看>>
使用批处理命令给客户更新oracle数据库
查看>>
回首考研路:那年,那月,还有那条孤独的考研狗
查看>>
GCD小结
查看>>
IOS 第三方库介绍
查看>>
iPhone架构xmpp聊天工具 -xmpp协议初识《一》
查看>>
iOS提交后申请加急审核
查看>>
iOS7单元测试
查看>>
ios framework 通用库的制作
查看>>
出现( linker command failed with exit code 1)错误总结
查看>>
iOS开发中一些常见的并行处理
查看>>
iOS获取手机的Mac地址
查看>>
ios7.1发布企业证书测试包的问题
查看>>
如何自定义iOS中的控件
查看>>
iOS 开发百问
查看>>