IPFS结构
宏观上
[图片上传失败...(image-e7ae19-1532319867950)]
细节来看
[图片上传失败...(image-a36506-1532319867950)]
按照白皮书,从技术上大概分为以下几个大模块
1. 身份 - 管理节点身份生成和验证。
2. 网络 - 管理与其他对等体的连接,使用各种底层网络协议。这些协议是可配置的。
3. 路由 - 维护信息以定位特定的对等体和对象。响应本地和远程查询。默认为DHT,但可更换。
4. 交换 - 一种支持有效块分配的新型块交换协议(BitSwap)。模拟市场,弱化数据复制。贸易策略可替换。
5. 对象 - 具有链接的内容寻址不可更改对象的Merkle DAG。用于表示任意数据结构,例如文件层次和通信系统。
6. 文件 - 由Git启发的版本化文件系统层次结构。
7. 命名 - 自我认证的可变名称系统。针对特定文件,可以锁定唯一hash
<pre class="ql-syntax ql-authorBlock-13003047 first-line ql-long-13003047" spellcheck="false" line="6zhm" data-linenum="1">这些子系统不是独立的;</pre>
<pre class="ql-syntax ql-authorBlock-13003047 ql-long-13003047" spellcheck="false" line="CGKW" data-linenum="2">它们是集成在一起,互相利用各自的属性。</pre>
<pre class="ql-syntax ql-authorBlock-13003047 last-line ql-long-13003047" spellcheck="false" line="Tjrg" data-linenum="3">从下到上构建协议栈。</pre>
关键流程
IPFS身份管理
由于IPFS网络是没有中心服务器的,各个节点之间的数据传输是需要识别各个节点的,并且要求各个节点的ID是唯一的,如果没有一定的生成规则,就带来了挑战。在IPFS中,IPFS节点ID是这样规定的。
1。节点要自己生成一个基于PKI(https://en.wikipedia.org/wiki/Public_key_infrastructure)的秘钥对。
2.对密钥对中的公钥做hash也就是HASH(节点公钥),就得到了节点的ID
默认生成的节点秘钥配置放在文件夹:~/.ipfs/config ,如果你没有自定义IPFS_PATH的话。
例如我本机的
"Identity":{
**"PeerID"**:**"QmQeJWckGKS9C56NtyvqA3APsq4gbtS8YwPnLTb9ZT3dd4"**,
**"PrivKey"**:**"privateKey"**
},
说明:~/.ipfs/config内容狠多,下面再说。
疑问:
这里如果节点作恶了,我从新生成一对密钥对就OK拉 !!!怎么办?
节点ID的使用,当两个节点需要通信的时候
1.交换两个节点的公钥
2.检测HASH(节点公钥)是否等于节点ID
3.如果检测不相等,就退出。
IPFS 初始化流程
初始化命令
ipfs init
命令分析
init 命令如果后面不跟着ipfs配置文件的话,会检测 ~/.ipfs/config是否有一个配置文件,没有自动生成一个默认的。之后,就根据这个默认的配置文件初始化 。当然用户也可以自定义一个配置文件,把路径附加在init 的后面。
IPFS启动流程
启动化所做的事情
1.检测是否需要生成配置文件,如没有,生成
2.读取配置文件
3.根据配置文件调用 core.NewNode(req.Context, ncfg) 生成节点
4.打印本地节点的swarm节点地址信息
5.调用serveHTTPGateway监听一系列端口,提供http网关服务
5.调用普罗米修斯模块(prometheus)启动性能收集系统运行的一些metric
6.启动
最复杂的是在第三步,这里面也有很多细节。
第三步
IPFS 数据上传流程分析
-
首次启动的时候,会通过配置文件中的bootstrap选项拿出来种子节点,建立网络连接建立连接可能和传统的P2P不太一样,待确定:自己维护一张路由表?还是维护一个连接列表?;Bittorrent如何做的呢?
-
连接的时候,会通过身份层,做节点有效性验证;NodeID,自描述Hash值;两个值一致则对等节点允许接入;
-
将文件按照上限256K字节打散成一个一个的block,计算每个block的hash,同时计算文件的merkel root hash;
-
将3的hash存入DHT; DHT会在路由层被使用;DHT会在bitswap协议中,被全节点维护;
-
到4步的时候,只是进行了本地存储,没有上传至IPFS公网;随后要进行pub操作
IPFS 数据下载流程分析
-
如果该文件被PIN过,则直接从本地返回;否则会向对等节点发送block hash列表;
-
对等节点通过DHT和路由层算法,找到每个block hash所在的节点,将文件返回来;
-
本地节点在接收block文件的同时,也会不断的将block广播至其他对等节点;
-
更新DHT;组装block文件,返回至用户端
参考链接
https://hackernoon.com/understanding-the-ipfs-white-paper-part-2-df40511addbd
https://ipfs.io/docs/commands/#ipfs-key
联系微信:bitwiki
网友评论