概述
IPFS - InterPlanetary File System 星际文件系统,是一个点对点的分布式文件存储系统,IPFS的愿景是构建一个全世界的分布式网络,用来替代传统中心化的服务器模式,所有的IPFS节点组成一个分布式网络,每个节点都可以存储文件,用户可以从IPFS构建的网络中以DHT(Distributed Hash Table,分布式哈希表) 的方式获取文件,从而实现了新一代的完全去中心化的网络,旨在取代现有的万维网。IPFS功能很丰富,包括DHT组网,文件存储,Bitswap文件交换等功能。本文主要介绍IPFS的文件存储原理,文件上传到IPFS节点存储时,节点会将文件分块后进行存储,每个文件以Merkle DAG(默克尔有向无环图)的格式组织,而Merkle DAG的根哈希则用来表示该文件。本文将对IPFS存储进行详解,所述的IPFS的版本为v0.6.0。
CID
在介绍IPFS存储文件的远离之前,先介绍一个重要的标识——CID(Content-ID),CID是IPFS中用来表示内容的标识,可以用来表示一个文件,也可以用来表示一个文件块。如下所示,CID是一个字符串,它主要由Version、Codec和Multihash三部分构成,Version目前分为v0和v1版本,v0版本的CID可以由V0Builder生成,v0版本的CID以Qm字符串开头,v1版本的CID可以由V1Builder生成,v1版本的CID主要包含三个部分Codec,MhType和MhLength,其中Codec是表示内容的编码类型,例如DagProtobuf(即protobuf格式),DagCBOR(即cbor格式)等,MhType是哈希算法,例如SHA2_256(默认的哈希算法),SHA2_512,SHA3_256,SHA3_512等等,MhLength是生成哈希的长度,默认用-1表示根据哈希算法确定长度。
IPFS组件介绍
IPFS用IpfsNode表示IPFS的节点,存储相关组件的如下所示:
这些组件的关系如下图所示,最上层是DAGService,它组合了BlockService组件,而BlockService组合了GCBlockstore组件,然后GCBlockstro