IPFS — 把"地址"换成"内容本身"的 P2P 文件系统
是什么
IPFS(InterPlanetary File System)是一种用文件内容当地址的分布式文件系统。
日常类比:图书馆里找书,传统 Web(HTTP)是”去 3 楼东侧 第 5 排第 7 本”——书一搬走你就找不到了;IPFS 是”我要那本第一句写着’呼叫我以实玛利’的书”——只要图书馆里还有任何一本符合,就能给你。
技术定义:你把一个文件丢进 IPFS,系统先算它的 SHA-256,得到一个像 QmXoy... 的字符串(叫 CID,Content Identifier)。以后你只要拿这个 CID,全网任何节点都能验证并返回同一份内容。
为什么重要
不理解 IPFS,下面这些事都没法解释:
- 为什么 NFT 的图片地址长得像
ipfs://QmXoy...而不是https:// - 为什么 Filecoin、Arweave、Web3 存储这些东西能”去中心化”
- 为什么 libp2p 这套网络栈被 Polkadot / Ethereum 2 / Filecoin 都拿去用
- 为什么 Git 内部和 IPFS 用的几乎是同一种数据结构(Merkle DAG)
核心要点
IPFS 把三件事拼在一起:
-
CID(内容寻址):文件 → SHA-256 → 拼上版本和编码标记(multihash + multicodec)→ CID。同样内容永远同样 CID;改一个 byte CID 就完全变。这意味着地址即证据——拿到数据后本地算一次哈希就能确认没被篡改,根本不用信任发数据的人。
-
Merkle DAG(默克尔有向无环图):大文件切成 256KB 一块,每块算哈希,再把这些哈希组织成一棵树,根的哈希代表整个文件。改任何一块只影响它到根的那条路径,其他块完全复用——天然去重 + 版本。Git 的 commit/tree/blob 就是这个思路;区块链的”区块链”也是这个思路。
-
libp2p(可换零件的 P2P 网络栈):传输层(TCP/QUIC/WebRTC)+ 加密(Noise/TLS)+ 多路复用(yamux/mplex)+ 路由(Kademlia DHT)+ 节点发现(mDNS/bootstrap)+ 块交换(BitSwap),每层都可替换。后来 libp2p 独立成项目,被一票区块链拿去用。
三件事合起来:你存一个 CID 的请求,先用 DHT 找到”谁有这个 CID”,再用 BitSwap 把块拉回来,本地按 Merkle DAG 拼装并验证哈希。一切对错都靠哈希自证,不依赖任何中心权威。
实践案例
案例 1:同样的文件只存一份
两个人各自上传一份一模一样的 5MB 视频。
Alice: ipfs add cat.mp4 → CID = QmAbc...Bob: ipfs add cat.mp4 → CID = QmAbc... # 一样的 CID整个网络只需要存一份。如果 Bob 改了一帧重新上传,整个文件 CID 变,但底层 256KB 块只有改动的那块和它到根的路径变了——绝大多数块还在复用。
案例 2:HTTP 链坏了,IPFS 不会
HTTP: https://my-blog.com/photo.jpg # my-blog.com 倒闭 → 404IPFS: ipfs://QmXoy...photo.jpg # 只要全网还有一个节点 pin 着,就能取到这就是为什么 NFT 的元数据放 IPFS——铸 NFT 的中心化平台关了,图片本身还在。
案例 3:DHT 怎么找到块
你向自己的节点要 QmAbc...:
- 把
QmAbc...当成 256-bit 数字,在 Kademlia DHT 里朝”XOR 距离更近”的节点跳 - 每跳问一次:“你认识更接近这个 ID 的节点吗”
- O(log N) 步后找到 provider 列表(声明自己有这个 CID 的节点)
- 直接连 provider,BitSwap 拉块
冷启动几秒,热路径毫秒——这也是为什么真实用户大多走 cloudflare-ipfs.com 这类网关。
案例 4:可变名字怎么解决
CID 等于内容指纹,内容一变指纹就变。但博客主页这种地址,你希望”永远指向最新版”。IPNS 的做法:
我的私钥 → 签一份 record { name: <pubkey>, target: QmAbc... }更新内容 → 重新签 { name: <pubkey>, target: QmDef... }别人查 /ipns/<我的 pubkey> 时,DHT 返回最新签名 record,验签后跳到当前 CID。名字不变,目标可变。代价是 IPNS 解析慢一截(要查 DHT 拿最新 record)。
踩过的坑
-
不 pin 就被 GC:节点默认会跑垃圾回收清掉不被 pin 的块。你以为”上传到 IPFS 就永久保存了”——错。要么自己节点 pin 住,要么花钱用 Pinata/Filecoin。
-
第一次访问慢:DHT 查找 + 跨洋拉块在秒级。所以 90% 真实流量经过中心化网关(ipfs.io / cloudflare-ipfs.com)——“去中心化”实际退化成”多了一层 CDN”。
-
没有内置激励:白皮书有意把激励层留给后续的 Filecoin。裸 IPFS 节点没人付钱凭什么帮你存——这也是 Filecoin 出现的原因。
-
私密内容必须先加密:内容寻址等于”任何人拿到 CID 就能下载”。想私密就必须先加密再上传,CID 只发给授权者。
-
可变内容很尴尬:CID 内容变了就变 CID。想让”我的博客主页”这种地址持续指向最新版,要用 IPNS(公钥签名指向当前 CID),但 IPNS 性能比 CID 差一截。
-
大量小文件性能差:每个文件都要单独走 DHT 找 provider。1000 个 1KB 小文件比 1 个 1MB 大文件慢得多。常见解法是先打成 tar/CAR 包,把 1000 个文件变 1 个 CID。
-
DHT 投毒和女巫攻击:开放 DHT 谁都能加入,恶意节点声称”我有这个 CID”再返回垃圾——客户端能靠哈希验证识破,但浪费了一次往返。生产部署常用私有 DHT 或 bootstrap 节点白名单。
适用 vs 不适用场景
适用:
- 不可变的大文件分发(NFT 元数据、软件镜像、数据集)
- 需要审查抵抗的内容(维基百科镜像应对封锁)
- Git 风格的版本化存储(每次改动留下完整历史)
- 多节点共享 + 自动去重的场景
不适用:
- 私有数据(除非自己加密,且加密后丢了去重红利)
- 需要 SLA 和强一致性的关键业务(IPFS 没保证可用性)
- 频繁更新的小文件(IPNS 同步慢,每次都要广播新 CID)
- 数据库类工作负载(IPFS 是文件系统不是数据库,没有索引和事务)
历史小故事(可跳过)
- 2014 年 7 月:Juan Benet 在 arXiv 发白皮书,把 BitTorrent + Git + Kademlia + SFS 几个老想法重新拼装
- 2015 年:创立 Protocol Labs,IPFS 首版 Go 实现(go-ipfs)开源
- 2017 年 8 月:Filecoin ICO 30 分钟募 2.57 亿美元,给 IPFS 补上激励层
- 2020-2021 年:NFT 热潮把 IPFS 推到大众视野,OpenSea 早期把 metadata.json 默认放 IPFS
- 2022 年:libp2p 独立成项目,被 Ethereum 2 / Polkadot / Filecoin 共用
- 2023-2024 年:IPFS 主网升级 Bitswap 1.2.0 + 可选 HTTP gateway,承认”大多数用户走网关”的现实
学到什么
- 寻址方式的范式转移:location-addressed(你在哪)→ content-addressed(你是什么)。这一换,缓存、去重、防篡改、抗审查全部白送
- Merkle DAG 是去中心化系统的瑞士军刀:Git / IPFS / 区块链 / 证书透明度日志全用它
- 网络栈分层就是工程红利:libp2p 把传输/加密/复用/路由全做成可换零件,结果远超 IPFS 自身的影响
- 去中心化的现实折扣:真实用户走中心化网关;理论上人人是节点,实际上少数大节点扛起 90% 流量
延伸阅读
- 白皮书 11 页 PDF:Benet 2014(密度高但可读)
- 官方教程:ProtoSchool — IPFS Tutorials(互动式学 CID / DAG / DHT)
- libp2p 规范:libp2p Specs(想做 P2P 应用值得读)
- 视频解读:Protocol Labs — IPFS Camp(年度技术大会录像,从入门到深入)
- 实战仓库:js-ipfs / kubo(Go/JS 两份官方实现,读源码对照白皮书最有效)
- git-internals —— 最早把 Merkle DAG 做成主流工具的项目
- chord-2001 —— Kademlia 的远亲,DHT 思想的奠基
关联
- chord-2001 —— 同类 DHT,IPFS 选了 Kademlia 因为 XOR 距离更对称
- bittorrent —— BitSwap 是 BitTorrent 协议的泛化(不限单文件)
- dynamo-2007 —— 同样用一致性哈希思路,但 Dynamo 是中心化运维下的分布式
- uniswap-v3 —— Web3 应用层代表,前端构建产物常托管 IPFS
- move-language —— 资源型智能合约语言,与 IPFS 同属 Web3 基础设施栈
反向链接
- chord-2001 —— Chord — 让上万台机器排成圈,查任何 key 都只走 log N 步
- farsite-2002 —— Farsite — 把一群不可信桌面 PC 拼成一台可信文件服务器
- move-language —— Move — 资源型智能合约语言
- uniswap-v3 —— Uniswap V3 — 集中流动性 AMM 核心合约