-
IPFS网络是一个公共的网络,在这个公共网络上的传输,传输的内容,节点的信息都是公开的,只有传输的过程是加密的。所以说,在IPFS网络上的行为能够被第三方进行监控。
-
为了确保传输内容的隐私性,在传输中使用的都为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绑定,可能会泄露个人信息。
-
-
IPFS网络中使用的是传输加密而不是内容加密。这样确保了在传输过程中,数据不会泄露或被篡改。而不使用内容加密,这样确保了IPFS网络中用户可以根据需要进行自己的内容加密的协议的选择。
-
节点在IPFS网络中只是一个泛称,在不同的场景中,节点又有了不同的定义。节点可以分为IPFS节点,数据节点,libp2p节点
-
IPFS节点
- node:在使用IPFS网络的时候,引用网络中的节点时可以使用node
- peer:谈论节点之间的关系时可以使用
- deaemon:在描述节点的运行状态时使用,当节点处于连接状态并在后台运行时,称之为守护程序
- instance:IPFS网络上运行的库或程序
-
data:针对IPFS网络上实际的数据片段时使用
-
libp2p:构建p2p节点时使用
-
-
节点提供的功能
- Preload:预加载,IPFS节点会随机选择预加载节点,通过其提供的API接口去获取它的DAG,将想要获取的CID放入节点的
wantlist
,使其从用户那里下载数据 - Relay:中继,当节点认为公共互联网无法访问自己时,IPFS节点会使用中继节点作为vpn,以供其他进行访问。
- Bootstrap:引导节点,每个IPFS节点进入时,都会通过引导节点接入这个DHT,可以有多个引导节点
- Delegate routing:委派路由节点,当 IPFS 节点无法自行运行分布式哈希表 (DHT) 逻辑时,它们会将任务委派给委派路由节点。
- Preload:预加载,IPFS节点会随机选择预加载节点,通过其提供的API接口去获取它的DAG,将想要获取的CID放入节点的
-
CID是一个用来描述的内容定址的标识符,采用hash将内容进行加密,结果即为地址。通过multiformats(默认的代码规范,协议),完成对格式的要求。
-
内容:CIDV1(通用的版本)
<cidv1> ::= <multibase-prefix><multicodec-cidv1><multicodec-content-type><multihash-content-address>
<multibase-prefix>
:占1或2字节的multibase(编码规则),可以将cids编译成各种基本类型。
<multicodec-cidv1>
:是一个编码器,这里表示CID的版本,用作升级需要<multicodec-content-type>
:这是一个编码器,用来表示被转换为地址的内容的类型或者格式。<multihash-content-address>
:这是一个哈希值,用来表示,内容经过哈希加密之后的哈希值。
-
特征:
- 便捷:CIDs在通常情况下为尽可能小的二进制码,所以CIDs可以作为长路径的一个标志符,或者作为一个URl路径。
- 传输方便:CIDs在编码时采用的是multibase去选择最好的方便传输的编码方式。
- 多样:CIDs能够支持多种多样的任何格式的内容进行任意一种哈希加密
- 避免锁定:CIDs会避免去锁定过时,或者将要过时的操作
- 可升级:CIDs在编码时会编译出一个版本号,确保了CID格式的编码能够进行升级操作。
-
易读的CID编码格式:
<hr-cid> ::= <hr-mbc> "-" <hr-cid-mc> "-" <hr-mc> "-" <hr-mh>
-
解码规则:
- 是否为字符串(ASCII/UTF-8):
- 如果是46给字符长度大小,并且开头为Qm,这是CIDV0版本,将其按照 base58btc进行转换,跳转第2
- 否则,则将其转换为二进制
- 如果第一个字节为
0x12
,返回错误。CIDV0版本不会遵守multibase进行编码,机器会避免将CIDV18于CIDv0s版本进行混淆,所以返回错误 - 否则,得到一个二进制数据,进行2
- 如果第一个字节为
- 为一个二进制的CID数据
- 如果长度为34字节并且开头为
0x12,0x20...
则此版本为CIDV0 - 否则将版本号加入到,cid编码的首位,CID的编码规则放在第二位,剩下的内容即为hash值
- 如果长度为34字节并且开头为
- 是否为字符串(ASCII/UTF-8):
-
IPFS网络中采用CID作为内容标识符,这是因为CID采用了hash加密算法,确保了文件的唯一性,所以说每一个文件内容都有自己唯一的CID,IPFS网络十分适合存放不更改的数据内容。但是当存放经常改变的数据时(如:网页页面),内容的改变会产生新的CID,把新的CID加入DAG中。而对于用户而言,频繁的更换CID会导致过程繁琐,所以提供了指针来确定最新的CID,用户访问时是访问的指针所指向的CID。而每次更新后会将指针指向最新CID。而如果要访问以前的版本,可以通过之前的CID进行访问。
-
垃圾回收机制:由于内存是有限的,对于数据的存储不能全部存储,所以需要定时的对一些数据进行清除。当然可以通过配置文件修改,对某些文件进行不清除。
-
由于用户想要保存数据很长的时间,于是诞生了IPFS的服务商,通过收取一定的费用,帮助用户保存数据,如Filecoin,IPFS+Filecoin的模式解决了用户保存数据的问题,同时也优化了用户检索数据的过程,由此诞生了许多类似的项目,Webb.Storage、Estuary、Powergate、ChainSafe Storage、Fleek Storage。