【IPFS专题#002】通过 三大机制 揭秘 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),永久锁定!霸气!


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容