IPFS:区块链存储方案技术深度解析

IPFS:区块链存储方案技术深度解析

结合上面的部分, 我们重点介绍一下CID。

CID 是IPFS分布式文件系统中标准的文件寻址格式,它集合了内容寻址、加密散列算法和自我描述的格式, 是IPLD 内部核心的识别符。目前有2个版本,CIDv0 和CIDv1。

CIDv0是一个向后兼容的版本,其中:

  • multibase 一直为 base58btc

  • multicodec 一直为 protobuf-mdag

  • version 一直为 CIDv0

  • multihash 表示为cidv0 ::=

为了更灵活的表述ID数据, 支持更多的格式, IPLD 定义了CIDv1,CIDv1由4个部分组成:

IPFS:区块链存储方案技术深度解析

  • multibase

  • version

  • multicodec

  • multihash

IPLD 是IPFS 的数据描述格式, 解决了如何定义数据的问题, 下面这张图是结合源代码整理的一份逻辑图,我们可以看到上面是一些高级的接口, 比如file, mfs, fuse 等。 下面是数据结构的持久化部分,节点之间交换的内容是以block 为基础的, 最下面就是物理存储了。比如block 存储在blocks 目录, 其他节点之间的信息存储在leveldb, 还有keystore, config 等。

IPFS:区块链存储方案技术深度解析

3.2 数据如何传输呢?

接下来我们介绍libP2P, 看看数据是如何传输的。libP2P 是个模块化的网络协议栈。

IPFS:区块链存储方案技术深度解析

做过socket编程的小伙伴应该都知道, 使用raw socket 编程传输数据的过程,无非就是以下几个步骤:

  1. 获取目标服务器地址

  2. 和目标服务器建立连接

  3. 握手协议

  4. 传输数据

  5. 关闭连接

libP2P 也是这样,不过区别在于它把各个部分都模块化了, 定义了通用的接口, 可以很方便的进行扩展

3.2.1 架构图

IPFS:区块链存储方案技术深度解析

由以下几个部分组成,分别是:

  • Peer Routing

  • Swarm (传输和连接)

  • Distributed Record Store

  • Discovery

下面我们对它们做分别介绍, 我们先看关键的路由部分。

3.2.2 Peer Routing

libP2P定义了routing 接口,目前有2个实现,分别是KAD routing 和 MDNS routing, 扩展很容易, 只要按照接口实现相应的方法即可。

ipfs 中的节点路由表是通过维护多个K-BUCKET来实现的, 每次新增节点, 会计算节点ID 和自身节点ID 之间的common prefix, 根据这个公共前缀把节点加到对应的KBUCKET 中, KBUCKET 最大值为20, 当超出时,再进行拆分。

IPFS:区块链存储方案技术深度解析

更新路由表的流程如下:

IPFS:区块链存储方案技术深度解析

除了KAD routing 之外, IPFS 也实现了MDNS routing, 主要用来在局域网内发现节点, 这个功能相对比较独立, 由于用到了多播地址, 在一些公有云部署环境中可能无法工作。

3.2.3 Swarm(传输和连接)

swarm 定义了以下接口:

  • transport 网络传输层的接口

  • connection 处理网络连接的接口

  • stream multiplex 同一connection 复用多个stream的接口

下面我们重点看下是如何动态协商stream protocol 的,整个流程如下:

IPFS:区块链存储方案技术深度解析

  1. 默认先通过multistream-select 完成握手

  2. 发起方尝试使用某个协议, 接收方如果不接受, 再尝试其他协议, 直到找到双方都支持的协议或者协商失败。

另外为了提高协商效率, 也提供了一个ls 消息, 用来查询目标节点支持的全部协议。

3.2.4 Distributed Record Store

record 表示一个记录, 可以用来存储一个键值对,比如ipns name publish 就是发布一个objectId 绑定指定 node id 的record 到ipfs 网络中, 这样通过ipns 寻址时就会查找对应的record, 再解析到objectId, 实现寻址的功能。

3.2.5 Discovery

目前系统支持3种发现方式, 分别是:

  • bootstrap 通过配置的启动节点发现其他的节点

  • random walk 通过查询随机生成的peerID, 从而发现新的节点

  • mdns 通过multicast 发现局域网内的节点

最后总结一下源代码中的逻辑模块:

IPFS:区块链存储方案技术深度解析

从下到上分为5个层次:

  • 最底层为传输层, 主要封装各种协议, 比如TCP,SCTP, BLE, TOR 等网络协议

  • 传输层上面封装了连接层,实现连接管理和通知等功能

  • 连接层上面是stream 层, 实现了stream的多路复用

  • stream层上面是路由层

  • 最上层是discovery, messaging以及record store 等

四、总结

本文从定义数据和传输数据的角度分别介绍了IPFS的2个主要模块IPLD 和 libP2P:

  • IPLD 主要用来定义数据, 给数据建模

  • libP2P 解决数据传输问题

这两部分相辅相成, 虽然都源自于IPFS项目,但是也可以独立使用在其他项目中。

IPFS的远景目标就是替换现在浏览器使用的 HTTP 协议, 目前项目还在迭代开发中, 一些功能也在不断完善。为了解决数据的持久化问题, 引入了filecoin 激励机制, 通过token激励,让更多的节点加入到网络中来,从而提供更稳定的服务。


分享到:


相關文章: