analysis-of-IPFS-in-Chinese icon indicating copy to clipboard operation
analysis-of-IPFS-in-Chinese copied to clipboard

IPFS技术架构分析

IPFS分析笔记——Wayne

作者:杨尉(waynewyang),转载请注明出处

此资源库编写于2018年9月-10月,开源于2019年5月。

目录

  • IPFS协议总览
    • IPFS定义及参考技术
    • 协议总览
  • 基础
    • 语言基础
    • 基础模块分析
      • multiformat
      • cid
      • repo—看看IPFS持久化的数据是什么样的
  • IPFS协议分析
    • 协议层分析
      • network, routing, exchange, merkledag, naming
    • IPFS应用层数据结构
      • unixfs
    • debug方法
  • IPFS API
    • 对外接口
    • IPFS主要API概要分析
      • init、daemon、add、get、cancel
  • 应用
    • 官方应用
      • IPFS-Cluster
      • ipfs-companion
      • ipfs-desktop
    • 第三方应用

IPFS定义及参考技术

  • 定义

    白皮书:IPFS是一种内容可寻址、版本化、点对点超媒体的分布式文件系统

    官网:IPFS是分布式Web,一种点对点超媒体协议,使网络更快,更安全,更开放。

  • 参考技术

    • ice协议——网络连通性

    解释:解决peers之间的连通性

    • DHT技术,KAD、coral算法——分布式路由

    解释:解决peers之间的路由、内容路由(内容寻址)、以及分布式哈希key-value存储

    重要特征:内容寻址、或者说哈希寻址

    • bt——交换技术

    解释:解决peers之间的内容交换

    重要特征:P2P分布式、更快、更开放

    • git——数据结构

    解释:MerkleDAG借鉴git的数据存储方式,解决数据的防篡改、去重

    重要特征:防篡改、去重

    • sfs——命名系统

    解决哈希难以记忆、以及由于DAG特性导致的动态数据变更导致的更新成本问题

    重要特征:版本化(通过ipns的发布记录)、ipns解析(人类更容易识别操作)、dns解析

    • unixfs系统

    特征:unixfs挂载特性,挂载的ipfs类似一个文件系统,可以使用unix方式访问全球哈希。

第一步:在PEER A上,在IPFS添加another.txt文件
D:\go-ipfs>ipfs add another.txt
 29 B / 29 B [===================================================
added QmamQ2prV7FTfFm1eJc5o6QRA2BAkUJAbc5JCrLpu9dY2z another.txt

第二步:在peer B上,挂载ipfs文件系统(全球性的),直接通过unix的方式,cat第一步的哈希,可以查询到文件内容
wayne@wayne:~$ ipfs mount
IPFS mounted at: /ipfs
IPNS mounted at: /ipns
wayne@wayne:~/go/src$ cat /ipfs/QmamQ2prV7FTfFm1eJc5o6QRA2BAkUJAbc5JCrLpu9dY2z
"This is new another file" 
  • 回到目录

协议总览

  • [x] [IPFS项目进度]
    • pm记录
    • - 规范制定中,不成熟。
    • - 草稿完成,很有可能做较大变更。
    • -接近稳定,只会做较小变更。
    • - 规范稳定,本质不变,可能做小的改善。
    • - 完全稳定,永久不变。
  • [x] 协议总览
    • MerkleDAG vs IP 瘦腰图
      • ipfs通过MerkleDAG访问资源、http通过IP访问资源
      • 向下提供支撑,向上提供应用

  • 回到目录

语言基础

  • [x] go依赖包编译注意

  • [x] context用法

  • [x] interface理解

  • 回到目录

基础模块分析

  • [x] multiformats

  • [x] 基于multiaddr的一些支撑包(网络层)

    • [x] mafmt
    • [x] addr-util
    • [x] maddr-filter
    • [x] multiaddr-filter
  • [x] cid

  • [x] repo

    • [x] 参考
      • 文档未更新
    • [x] 持久化数据分析
      • [x] 笔记
      • [x] 示例
    • [ ] 细节源码分析
  • [ ] 其他

  • 回到目录

协议层分析

  • [x] network

    • [ ] pnet
    • [x] relay
    • [ ] 穿透,待分析,目前端口转发OK,穿透比较差
  • [x] routing

    • [x] DHT寻址原理
    • [x] 源码中修改K桶 a并发与k值提高效率
  • [x] block exchange

    • [x] block
    • [x] 笔记
  • [x] merkledag

    • [x] DAG的相关的数据结构

    cid -> block -> node(dag)

    link -> node(dag)

    • [x] 对上层接口 ipld-format
    • [x] 具体实现分析笔记
      • [x] ipld-cbor
      • [x] go-merkledag
    • [x] dag-link数目大小限制,为什么是最多174个
  • [x] namesys

    • [x] dns
    • [x] ipns
  • 回到目录

应用层数据结构

  • [x] unixfs

    • [x] mount
      • [x] 挂载在unix文件系统之上进行操作
      • [x] mount 示例
    • [x] files(mfs)参考
      • [x] 操作示例
    • [ ] 其他
    • [ ] 源码分析
  • 回到目录

协议debug方法

ipfs log tail

  • 回到目录

对外接口

IPFS主流程概要分析

  • 回到目录

IPFS-Cluster

  • [x] 参考
  • [x] 笔记
    • [x] 使用示例
    • [ ] 源码分析
  • 回到目录

ipfs-companion

ipfs-desktop

第三方应用