美文网首页
IPFS数据结构分析

IPFS数据结构分析

作者: tristan_lee | 来源:发表于2018-12-19 14:54 被阅读0次

IPFS(Inter Planetary File System)简介

IPFS是基于P2P的分布式文件系统,相当于一个分布式版本的Web系统。的最大特点是基于内容寻址(content-addressing)与分布式存储(distributed storage)。

词汇定义

  • hash - 哈希函数值(如sha3)
  • dag - 有向无环图(directed acyclic graph)
  • merkle-link - 默克尔链接(代表DAG图的边),通常包含一个代表某个对象的哈希值,ipfs通过默克尔链接构建出一个基于内容寻址的DAG图
  • merkledag - merkledag是使用merkle-link构建出的DAG图,也是一种hash树;相对于merkle-tree,merkledag并不必需是平衡树,而且树的节点可以包含数据内容。
  • multihash - 兼容多种hash的数据结构
  • ipfs object - ipfs的节点对象,ipfs中一个object就是一个merkledag格式的结构
  • merkledag format - merkledag格式,即merkledag图的节点数据结构
  • link segment - merkledag格式的其中一个组成部分,即merkle-link
  • data segment - merkledag格式的其中一个组成部分,即实际节点数据
  • protobuf - 一种序列化编码
  • multicodec - 一种序列化编码

核心数据结构

CID (Content Identifier)

CID的主要作用是唯一标识一个IPFS网络的资源,主要包含两部分内容:

  • mcodec - 编码方式
  • mhash - 兼容多种hash的数据结构,见词汇表multihash

IPLD (InterPlanetary Linked Data)

IPLD即原来的merkledag结构(同一个,官方文档将原来的merkledag改名为IPLD),主要包含两部分内容:

  • Link Segment
  • Data Segment

具体形式定义如下(ProtoBuf格式):

// An IPFS MerkleDAG Link
message MerkleLink {
  bytes Hash = 1;   // multihash of the target object
  string Name = 2;  // utf string name
  uint64 Tsize = 3; // cumulative size of target object

  // user extensions start at 50
}

// An IPFS MerkleDAG Node
message MerkleNode {
  repeated MerkleLink Links = 2; // refs to other objects
  bytes Data = 1; // opaque user data

  // user extensions start at 50
}

Merkle森林

ipfs是基于内容的寻址方式(content addressing),主要有以下几个好处:

  • 唯一性
  • 防止篡改
  • 无需复制大量数据内容

具体形式:

https://<gateway-host>.tld/ipfs/<cid>/path/to/resource
ipfs://{cidv1b32}/path/to/resource

IPFS希望构建一个Merkle森林,将所有Internet上的兼容merkledag数据的系统都包含进入这个森林。不同的系统(如Bitcoin,Ethereum或Git)在这个森林中相当于某一棵树;在系统间交换数据时只要提交某个特定对象的merkle root,便足以代表大量的数据,大大提高了系统间进行信息交换的效率。

目前merkledag兼容的系统有(仅列举一部分):

  • Bitcoin
  • Ethereum
  • Bit Torrent
  • Git

将不同系统间的相互访问寻址变成非常简单,以下举例寻址访问Ethereum的某个区块中成员数据的示例:

ipfs://{eth block cid}/number

ipfs://{eth block cid}/parent/number

ipfs://{eth block cid}/stateRoot

部分JS代码示例(具体代码可参考以下链接):

    const block302516 = 'z43AaGEywSDX5PUJcrn5GfZmb6FjisJyR7uahhWPk456f7k7LDA'
    const block302517 = 'z43AaGF42R2DXsU65bNnHRCypLPr9sg6D7CUws5raiqATVaB1jj'

    function errOrLog (err, result) {
      if (err) {
        throw err
      }
      console.log(result.value.toString('hex'))
    }

    ipfs.dag.get(block302516 + '/number', errOrLog)
    ipfs.dag.get(block302517 + '/parent/number', errOrLog)
    ipfs.dag.get(block302517 + '/stateRoot', errOrLog)

https://github.com/ipfs/js-ipfs/blob/master/examples/traverse-ipld-graphs/eth.js

DAG结构的重要性

IPFS为整个分布式网络提供一个基础数据结构IPLD(即merkledag),使得各个系统能在此基础上构建功能强大并能相互联通的应用程序。IPLD在整个分布式网络中的位置堪比TCP/IP协议栈中IP的重要位置:

相关文章

  • IPFS数据结构分析

    IPFS(Inter Planetary File System)简介 IPFS是基于P2P的分布式文件系统,相当...

  • 【IPFS】Merkle DAG

    Merkle DAG数据结构是IPFS架构的核心,IPFS整个协议都围绕它进行。[1] IPFS is a sta...

  • IPFS的数据结构——Merkle DAG

    Merkle DAG是IPFS核心的数据结构,IPFS整个系统都是围绕Merkle DAG进行的,而Merkle ...

  • 道说IPFS/FIL:如何参与IPFS和Filecoin赚钱?

    这一讲和大家分析:如何参与IPFS和Filecoin赚钱? 上一节,我和大家分享了IPFS项目的独特优势,IPFS...

  • 浅析IPFS文件存储与读取

    IPFS简介 本篇文章主要想通过纯理论的方式分析IPFS的原理,尽量不使用命令和代码。关于IPFS的诞生以及取代H...

  • 2020-11-12

    IPFS小知识 用SWOT矩阵分析IPFS Filecoin主网于10.15启动,官方在主网上线前就出台了经济模型...

  • ipfs 存储分析

    .ipfs 为节点的存储目录 datastore的存储:https://github.com/ipfs/go-da...

  • IPFS协议层深入分析10---MerkleDAG

    首先来介绍一下IPFS中使用的Merkle DAG的数据结构,图中1是这种图的数据结构示意图,这个图由节点和链接组...

  • ipfs项目分析

    IPFS项目: 一、目标 1、解决问题:基于区块链和原生令牌的去中心化存储网络,客户花费令牌存储数据和检索数据,矿...

  • IPFS应用价值分析

    一,让数据的存储更安全,更便捷。 没有了中心化的数据管理,数据的安全性更高,很难被窥探或被复制。全网分布式的数据存...

网友评论

      本文标题:IPFS数据结构分析

      本文链接:https://www.haomeiwen.com/subject/lfjjkqtx.html