Skip to content

Latest commit

 

History

History
65 lines (56 loc) · 7.34 KB

IPFS.md

File metadata and controls

65 lines (56 loc) · 7.34 KB

IPFSDOC

一、什么是IPFS

二、IPFS是如何工作的##

三、IPFS的隐私性与安全性

  1. IPFS网络是一个公共的网络,在这个公共网络上的传输,传输的内容,节点的信息都是公开的,只有传输的过程是加密的。所以说,在IPFS网络上的行为能够被第三方进行监控。

  2. 为了确保传输内容的隐私性,在传输中使用的都为cid(内容标识符),与IPFS节点本身的ID。这样的做法隐藏了传输过程中的内容,和本机IP地址。但是仍然存在着一定缺陷。

    • CID

      • 内容标识符,在IPFS网络中使用的是内容寻址,经过对内容进行哈希,形成一个唯一的标识符CID。与该CID相关的数据副本可以存储在参与IPFS网络的节点的任何一个位置。为了在获取该CID指定的数据,IPFS网络使用率DHT来追踪存储数据的位置。
      • 在进行检索时,本身的节点会去查询DHT去找到存储该CID距离最近的节点。在获取该CID和内容后,然后加入本身的节点缓存。在默认情况下,本身的节点会向与其相连的节点在一定的时间内会提供该CID。(一定的时间指的是在进行下一次节点缓存清理时,如果不想被清理,需要进行设置)
      • 这样在一定的程度上保证了内容不泄露。但是CID是公开的,如果是特别私密的消息,还是能够获取。并且如果获得了更具体的信息(某人对应的CID,某个地址的CID),也可以造成信息泄露。
    • 节点

      • 每一个IPFS节点都拥有一个唯一的节点ID,节点ID在替代了IP地址,但是可以对节点ID进行DHT查找,如果节点经常有规律的在某个地方登录的话,有可能会获取IP地址,这样容易导致对某个特定的IP节点进行监视。
      • 如果不想泄露本地节点的话,可以使用公共网关,使用公共网关请求内容依然是公开的,但是无法确认是谁请求的。公共网关的作用是传统网络与分布式网络之间的桥梁。但是使用公共网关并不意味着IPFS节点,这说明无法享受IPFS节点的好处,同时网关的运营商可能会暗自收集IP地址,并且与申请CID绑定,可能会泄露个人信息。
  3. IPFS网络中使用的是传输加密而不是内容加密。这样确保了在传输过程中,数据不会泄露或被篡改。而不使用内容加密,这样确保了IPFS网络中用户可以根据需要进行自己的内容加密的协议的选择。

四、节点

  1. 节点在IPFS网络中只是一个泛称,在不同的场景中,节点又有了不同的定义。节点可以分为IPFS节点数据节点libp2p节点

    • IPFS节点

      • node:在使用IPFS网络的时候,引用网络中的节点时可以使用node
      • peer:谈论节点之间的关系时可以使用
      • deaemon:在描述节点的运行状态时使用,当节点处于连接状态并在后台运行时,称之为守护程序
      • instance:IPFS网络上运行的库或程序
    • data:针对IPFS网络上实际的数据片段时使用

    • libp2p:构建p2p节点时使用

  2. 节点提供的功能

    • Preload:预加载,IPFS节点会随机选择预加载节点,通过其提供的API接口去获取它的DAG,将想要获取的CID放入节点的wantlist,使其从用户那里下载数据
    • Relay:中继,当节点认为公共互联网无法访问自己时,IPFS节点会使用中继节点作为vpn,以供其他进行访问。
    • Bootstrap:引导节点,每个IPFS节点进入时,都会通过引导节点接入这个DHT,可以有多个引导节点
    • Delegate routing:委派路由节点,当 IPFS 节点无法自行运行分布式哈希表 (DHT) 逻辑时,它们会将任务委派给委派路由节点。

五、CID

  1. CID是一个用来描述的内容定址的标识符,采用hash将内容进行加密,结果即为地址。通过multiformats(默认的代码规范,协议),完成对格式的要求。

  2. 内容:CIDV1(通用的版本) <cidv1> ::= <multibase-prefix><multicodec-cidv1><multicodec-content-type><multihash-content-address>

    • <multibase-prefix>:占1或2字节的multibase(编码规则),可以将cids编译成各种基本类型。
    1. <multicodec-cidv1>:是一个编码器,这里表示CID的版本,用作升级需要
    2. <multicodec-content-type>:这是一个编码器,用来表示被转换为地址的内容的类型或者格式。
    3. <multihash-content-address>:这是一个哈希值,用来表示,内容经过哈希加密之后的哈希值。
  3. 特征:

    • 便捷:CIDs在通常情况下为尽可能小的二进制码,所以CIDs可以作为长路径的一个标志符,或者作为一个URl路径。
    1. 传输方便:CIDs在编码时采用的是multibase去选择最好的方便传输的编码方式。
    2. 多样:CIDs能够支持多种多样的任何格式的内容进行任意一种哈希加密
    3. 避免锁定:CIDs会避免去锁定过时,或者将要过时的操作
    4. 可升级:CIDs在编码时会编译出一个版本号,确保了CID格式的编码能够进行升级操作。
  4. 易读的CID编码格式:<hr-cid> ::= <hr-mbc> "-" <hr-cid-mc> "-" <hr-mc> "-" <hr-mh>

  5. 解码规则:

    • 是否为字符串(ASCII/UTF-8):
      1. 如果是46给字符长度大小,并且开头为Qm,这是CIDV0版本,将其按照 base58btc进行转换,跳转第2
      2. 否则,则将其转换为二进制
        1. 如果第一个字节为0x12,返回错误。CIDV0版本不会遵守multibase进行编码,机器会避免将CIDV18于CIDv0s版本进行混淆,所以返回错误
        2. 否则,得到一个二进制数据,进行2
    • 为一个二进制的CID数据
      1. 如果长度为34字节并且开头为0x12,0x20...则此版本为CIDV0
      2. 否则将版本号加入到,cid编码的首位,CID的编码规则放在第二位,剩下的内容即为hash值
  6. IPFS网络中采用CID作为内容标识符,这是因为CID采用了hash加密算法,确保了文件的唯一性,所以说每一个文件内容都有自己唯一的CID,IPFS网络十分适合存放不更改的数据内容。但是当存放经常改变的数据时(如:网页页面),内容的改变会产生新的CID,把新的CID加入DAG中。而对于用户而言,频繁的更换CID会导致过程繁琐,所以提供了指针来确定最新的CID,用户访问时是访问的指针所指向的CID。而每次更新后会将指针指向最新CID。而如果要访问以前的版本,可以通过之前的CID进行访问。

  7. 垃圾回收机制:由于内存是有限的,对于数据的存储不能全部存储,所以需要定时的对一些数据进行清除。当然可以通过配置文件修改,对某些文件进行不清除。

  8. 由于用户想要保存数据很长的时间,于是诞生了IPFS的服务商,通过收取一定的费用,帮助用户保存数据,如Filecoin,IPFS+Filecoin的模式解决了用户保存数据的问题,同时也优化了用户检索数据的过程,由此诞生了许多类似的项目,Webb.StorageEstuaryPowergateChainSafe StorageFleek Storage

六、DHT分布式哈希表