分布式存储IPFS基本知识

目录

IPFS 最容易让人误会的地方,是把“内容可以按哈希找到”听成“文件上传后就会永远存在”。CID 能证明拿到的数据是不是那一份内容,却不能保证还有节点保存它,也不能保证数据是私密的。

它把“去哪个服务器拿文件”换成“我要哪一份内容”。文件被切成 block,block 组织成 Merkle DAG,再由 CID 指向。数据来自谁并不重要,客户端可以重新计算哈希。对不上就拒绝。这解决的是完整性,不是存储责任。

一份文件怎样进入网络

把笔记交给本地节点后,节点会切块,为每个 block 生成 CID,再把它们链接成 DAG。根 block 的 CID 是整份内容的入口。本地节点保存这些 block;想让它持续留下来,就 pin 住根 CID 并让节点或 pinning service 持续提供。

研究笔记
   │ 切块、编码、哈希
   ▼
[block A] [block B] [block C]
    \        |        /
     \       |       /
      [根节点:链接各个 block]
                 │
                 ▼
               根 CID

CID 不是普通的文件哈希。它还带着内容版本、编解码器和 multihash 等信息。大文件的根 CID 往往对应 DAG 根块,不是原始文件字节直接算出的单个哈希。同一份文件如果切块方式或 DAG 布局不同,CID 也可能不同。

内容一改,CID 就会变。这让缓存可以放心复用同一个 CID 的数据,也带来一个朴素的限制,不能在原位置覆盖更新。需要稳定入口时,用 IPNS 或 DNSLink 指向当前版本。CID 说明是哪一份内容,IPNS 或 DNSLink 说明现在该看哪一份。

找到内容和取回内容是两件事

拿着 CID 的节点先要找 provider。DHT 在这里像一张分散的索引表。它保存的是某个 Peer 声称愿意提供某个 CID 的记录,不保存文件本体。记录会过期,节点会下线,地址会变,所以查到的只是下一步连接的线索。

IPFS 公共 DHT 基于 Kademlia。节点用 XOR 距离判断谁更接近目标 key,并在路由表里保存不同距离范围内的 peers。查找不会向全网广播,而是并行问一批更接近目标的节点,再从回复里继续收敛。这也是 DHT 能在节点频繁进出的网络里工作的原因。

真正传 block 的是 Bitswap。节点通常先问已经连上的 peers 有没有需要的 CID。有人回复 have 后,再发 want-block 取实际数据。没有已连接的 provider 时,才会继续通过 DHT 或其他内容路由方式找人。根 block 到手后,客户端沿 DAG 请求子 block,并逐块校验。

BitTorrent 的 .torrent、tracker、seed 和 swarm 很适合理解 P2P 分发,但它们不是 IPFS 的协议说明。IPFS 的基本单位是可寻址的 block 和 DAG,Bitswap 是 block 交换协议。

节点为什么还要 libp2p

发现 provider 后,两台节点还得真的连上。libp2p 处理 peer 身份、地址、连接管理、安全通道和不同传输协议的协商。TCP、QUIC、WebRTC 和 WebTransport 都可能出现在这个过程里。

PeerId 是节点身份,不是 IP 地址。地址会变,身份用来识别对端。multiaddr 则把地址、端口、传输协议和节点身份等信息组合起来。内容路由查到了 provider,也不代表网络一定可达,NAT、relay 和浏览器环境都会影响最后的连接。

pinning、网关与隐私

ipfs add 只说明当前节点保存了数据并得到了 CID。节点清理缓存、磁盘故障或服务停止后,CID 还在,内容却可能没人提供。pinning 的意思是让节点或服务不要把这一组 block 当作可回收缓存删除。重要内容应有独立副本和恢复方案,发布后也应从不同网络实际 fetch 一次。

网关很方便。https://<gateway>/ipfs/<CID> 让浏览器通过 HTTP 访问 IPFS 内容,但网关只是桥,不是 IPFS 本身。某个网关能打开,不表示有足够多的 provider。某个网关暂时故障,也不表示内容一定消失。实际产品往往同时依赖 pinning、网关、域名命名和监控。

IPFS 也不自动保密。CID、provider 信息和查询行为都可能暴露元数据。敏感内容应在上传前加密,密钥和授权放在应用自己的边界里。CID 不是密码,知道 CID 的人不一定只能由你控制。

IPFS 适合版本明确、需要校验和复用的内容,例如公开资料归档、NFT 元数据、软件分发或内容寻址备份。频繁原地更新、需要强事务或细粒度权限的数据,仍应放在数据库、对象存储或其他专门系统里。

文件 → block 与 Merkle DAG → CID
CID → 内容路由找到 provider
provider → Bitswap 传输 block
block → 校验后重建文件
pinning 与副本 → 决定以后还能不能取到

参考资料

发布于 2023 年 6 月 9 日
评论