从今天开始我的博客会使用 IPFS 来分发文中涉及到的所有附件,目前已经上线了 Paper Reading 系列中的所有论文,访问方式如下:

此外,之前的文章均已追加对应的下载链接,直接使用即可。


How It Works?

User Side

From ipns://paper.xuanwo.io

ipns 是 IPFS 自行声明的一个协议号,IPFS Companion 会识别这个地址并使用本地节点或 Public Gateway 以提供服务:

  • ipns://paper.xuanwo.io => https://ipfs.io/ipns/paper.xuanwo.io
  • ipfs://abcdef => https://ipfs.io/ipfs/abcdef

From paper.xuanwo.io

当 IPFS Gateway 收到形如 /ipns/paper.xuanwo.io 这样的请求时,它会通过 DNSLink 机制来寻找对应的内容:

:) dog _dnslink.paper.xuanwo.io TXT
TXT _dnslink.paper.xuanwo.io. 59s   "dnslink=/ipns/k51qzi5uqu5dg8jr2lu573gsljj5orng0nexbs093zbwy3dwbbgdk8sk3js591"

于是 IPFS Gateway 会将该请求转换为对应的实际请求: /ipns/k51qzi5uqu5dg8jr2lu573gsljj5orng0nexbs093zbwy3dwbbgdk8sk3js591

From /ipns/k51...

IPNS,全称 InterPlanetary Name System, 是 IPFS 引入的域名机制,能够将特定的内容与一个 IPNS ID 绑定,使得用户能够动态的 修改 内容:修改 IPNS ID 绑定的内容而不是内容本身。

通过 go-ipfs 命令行工具能够查看 IPNS ID 对应的内容 ID:

:) ipfs name resolve /ipns/k51qzi5uqu5dg8jr2lu573gsljj5orng0nexbs093zbwy3dwbbgdk8sk3js591
/ipfs/QmQ9nkebfvHjGYq3xQiuyV1LxZbPkTUVmXPSEcoDDX2QfD

IPFS Gateway 同样也会执行类似的 resolve 操作,因此 Gateway 最终会去访问 /ipfs/QmQ9nkebfvHjGYq3xQiuyV1LxZbPkTUVmXPSEcoDDX2QfD

当然后续还涉及到其他的细节就不展开了,可以参考 https://docs.ipfs.io/

Provider Side

From files to CID

当在本地执行 ipfs add xxx 时,ipfs 会使用特定的算法计算出一个基于内容的 CID (Content IDentifier)。CID 本身是自描述的,具体的 Specs 可以参考 CID (Content IDentifier) Specification。在 IPFS 的网络上,CID 就唯一标识了一个文件,如果文件的内容发生了任何变动,CID 都会因此发生变化。

Andrew: a distributed personal computing environment.pdf 为例,它的 CID 是: QmQ9nkebfvHjGYq3xQiuyV1LxZbPkTUVmXPSEcoDDX2QfD,那就可以通过 https://ipfs.io/ipfs/QmQ9nkebfvHjGYq3xQiuyV1LxZbPkTUVmXPSEcoDDX2QfD 访问该文件,提供该文件的节点是任何拥有相同 CID 的节点。

From CID to IPNS

为了能够让用户以相同的 ID 访问不断在更新的文件,维护者需要将 CID 绑定到 IPNS ID 上。IPNS 是一个基于非对称加密的系统,一对公私密钥对应一个唯一的 IPNS ID,只有持有私钥的节点能够更新该 IPNS ID 对应的 CID。

ipfs name publish --key=<key-id> <CID>

后面的流程就能跟用户侧连起来啦。