1、IPFS 是什么
IPFS 是一个可快速索引的版本化的点对点文件系统。
IPFS是一个协议
定义了基于内容的寻址文件系统
协助内容分发
结合了分布式哈希、p2p传输、版本管理系统
IPFS是一个文件系统
有文件夹和文件
可挂载文件系统(通过 FUSE)
IPFS是一个web
可以像 web 那样查看文档
可能通过 https://ipfs.io/
浏览器或扩展可以直接支持 ipfs:/ 或者 dweb:/ipfs/
基于哈希确保内容真实性
IPFS是个模块化
通过任何网络协议的连接层
路由层,寻找/定位文件所在位置
使用路由层的 DHT (kademlia/coral)
使用基于路径的命名服务
使用 bittorrent-inspired 的区块交换
IPFS 使用加密
加密哈希内容寻址
区块级的去重
文件完整性和版本控制
文件系统级的加密和签名支持
IPFS是一个p2p系统
世界范围内的 p2p 文件传输网络
完全分散的架构
没有单点失效问题
IPFS天生是一个CDN
文件添加到本地文件系统,将会在全世界可用
缓存友好(内容哈希命名)
基于 bittorrent 的带宽管理
IPFS有一个命名服务
IPNS,一个受SFS启发的名称系统
基于PKI的全局命名空间
有助于建立信任链
与其他NSes兼容
可以将DNS,.onion,.bit等映射到IPNS
2、Merkle DAG
IPFS 的核心是 MerkleDAG,一个有向无环图,其链接是哈希。 这为 IPFS 中的所有对象提供了有用的属性:
认证可以对内容进行哈希处理并根据链接进行验证
持久化一旦获取,对象可以永久缓存
通用任何数据结构都可以表示为merkledag
分布式对象可以由任何人创建,没有集中的编写者
IPFS 是一个网络协义栈,用于组织代理网络以创建,发布,分发,提供和下载merkledag。 它是经过身份验证的,分散的,永久性的网络。
3、节点和网络模型
IPFS网络使用基于身份的 PKI。 IPFS 节点是一个可以查找、发布和复制 merkledag 对象的程序。 其身份由私钥定义。 特别:
privateKey, publicKey := keygen()
nodeID := multihash(publicKey)
3.1、multihash和可升级的哈希
IPFS 中的所有哈希都使用 multihash 进行编码,multihash 是一种自描述哈希格式。使用的实际哈希函数取决于安全性要求。IPFS的密码系统是可升级的,这意味着当哈希函数被破坏时,网络可以转移到更强的哈希值。
目前 IPFS 节点必须支持:
sha2-256
sha2-512
sha3
4、协义栈
IPFS 有一个模块化的协义栈,每一个模块都有多种实现,全部在不同的模块中。 此规范仅解决层之间的接口,并简要提及可能的实现。 详细信息留待其他规格。
IPFS 有5层:
命名自我认证的PKI命名空间(IPNS)
merkledag数据结构格式
交换区块传输和复制
路由定位对等体和对象
网络在对等体之间建立连接
IPFS 协义栈
4.1 网络层
网络层在网络中的任何两个 IPFS 节点之间提供点对点传输。 它处理:
NAT遍历
支持多种传输
支持加密,签名或清除通信
多路复用
具体参考 libp2p。
4.2、路由
路由层有两个重要的目标:
节点路由发现其他的节点
内容路由发现发布到 IPFS 上的数据
路由系统是一种满足各种实现的接口。 例如:
DHTs
mdns
snr
dns
具体参考 libp2p。
4.3、区块交换
区块交换负责协商批量数据传输。 一旦节点彼此了解,并且连接,交换协议就会控制内容寻址块的传输方式。
区块交换是一种满足各种实现的接口。 例如:
Bitswap
HTTP
4.4、Merkledag
理解数据。merkledag 数据结构是:
message MDagLink {
bytes Hash = 1; // multihash of the target object
string Name = 2; // utf string name. should be unique per object
uint64 Tsize = 3; // cumulative size of target object
}
message MDagNode {
MDagLink Links = 2; // refs to other objects
bytes Data = 1; // opaque user data
}
参考 merkledag 规范和路径解析规范。
4.5、命名-PKI命名空间和可变指针
IPFS 主要关注内容寻址数据,这些数据本质上是不可变的:更改对象会改变其哈希值,从而改变其地址,使其成为一个完全不同的对象。 (将其视为写时复制文件系统)。
IPFS命名层(或 IPNS )处理以下内容的创建:
可变指向对象的指针
人类可读的名字
IPNS基于SFS。 它是PKI命名空间,名称只是公钥的哈希。 控制私钥的人控制名称。记录由私钥签名并分布在任何地方(在 IPFS 中,通过路由系统)。 这是一种在互联网上分配可变名称的平等主义方式,没有任何集中化或证书颁发机构。
参考命名规范。