IPFS七层协议栈之对象层
IPFS七层协议栈之对象层
对象层(Objects)
基于分布式哈希表DHT和BitSwap技术,IPFS期望构造一个庞大的点对点系统,用于快速、稳健地存储和分发数据块。IPFS使用Merkle DAG技术构建了一个有向无环图数据结构,用于存储对象数据。这也是Git使用的数据结构,Merkle DAG为IPFS提供了很多有用的属性,包括:
- 内容可寻址:所有内容由多重哈希校验并唯一标识。
- 防止篡改:所有内容都通过哈希校验,如果数据被篡改,IPFS网络将能检测到。
- 重复数据删除:相同内容有相同哈希,只存储一次,对索引对象特别有用。
Merkle DAG的对象结构定义如下:
type IPFSLink struct {
Name string //此link的别名
Hash Multihash //目标的加密hash
Size int //目标总大小
}
type IPFSObject struct {
links []IPFSLink //links数组
data []byte //不透明内容数据
}
路径
可以使用API遍历IPFS对象,路径与传统UNIX文件系统中的路径一样,Merkle DAG链接使遍历变得简单,完整路径如下所示:
# format
/ipfs/<hash-of-object>/<name-path-to-object>
# example
/ipfs/XLYkgq61DyaQ8Nhkcqyu7rcnSa7dSHQ16x/foo.txt
当然也支持多哈希指纹的多级路径访问:
/ipfs/<hash-of-foo>/bar/baz
/ipfs/<hash-of-bar>/baz
/ipfs/<hash-of-baz>
本地对象
IPFS客户端需要一个本地存储器,一个外部系统可以为IPFS管理的对象存储以及检索本地原始数据。存储器的类型根据节点使用案例而已,在大多数情况下,这个存储器只是硬盘空间的一部分(不是被本地的leveldb来管理,就是直接被IPFS客户端管理),在其他的情况下,例如非持久性缓存,存储器就是RAM的一部分。
对象锁定
希望对某个对象数据进行长期存储的节点可以执行锁定操作。以此保证此对象被保存在了该节点的本地存储器上,同时也可以递归地锁定所有相关的派生对象,这对长期存储完整的对象文件特别有用。
发布对象
IPFS是全球分布的文件系统,DHT使用内容哈希寻址技术,使发布对象是公平的,安全的,完全分布式的。任何人都可以发布对象,只需要将对象的Key加入到DHT中,并且对象是通过P2P传输的方式加入进去,然后把访问路径给其他的用户。
对象级别的加密
IPFS具备可以处理数据对象加密的操作,加密对象结构定义如下:
type EncryptedObject struct {
Object []bytes //已加密的原始对象数据
Tag []bytes //可选择的加密标识
type SignedObject struct {
Object []bytes //已签名的原始对象数据
Signature []bytes //HMAC签名
PublicKey []multihash //多重哈希身份键值
}
}
加密操作改变了对象的哈希值,定义了一个不同新的对象结构,IPFS自动的验证签名机制,用户自定义的私钥加解密数据都为对象数据提供了安全保证。同时,加密数据的链式关系也同样被保护着,因为没有解密密钥就无法遍历整个链式对象结构。
文章借鉴《IPFS与区块链:原理与实战》推荐大家购买正版书籍。