IPNS (InterPlanetary Name System) 详解
IPFS(InterPlanetary Name System) 是IPFS的名称寻址系统,有了它就可以为可变内容提供稳定的地址了
Table of contents
前言
本文是笔者在学习IPFS地过程中的学习笔记。内容主体翻译于官方文档。
IPNS 是什么
它是一套名称寻址系统,可以类比dns。主要目标是在IPFS上为动态内容提供稳定的访问地址。
我们知道IPFS是基于内容寻址的。 它基于每个文件中的内容创建一个唯一地址(即CID)。
如果你想把某个文件地址分享给别人,此后每当文件内容发生变化时,应需要把最新的地址再发一遍。
对于可变的内容来说, 这显然是无法接受的。
IPNS 就是用来解决这个问题的。 用它可以创建"内容可更新"的地址。
在IPNS中, name
是一个公钥的哈希。 它与一条记录关联,这条记录中包含了name
所指向的内容地址。
最关键的是, 这条记录用与与此公钥关联的私钥签名。 这就保证了此记录只能由私钥持有者修改。
在此机制之下, 随时可以创建新记录,对其签名并发布出来。
IPNS 地址需要使用 /ipns/
前缀。 例如:
/ipns/QmSrPmbaUKA3ZodhzPWZnpFgcPMFWF4QsxXbkWfEptTBJd
用IPFS命令行示例操作IPNS
开启IPFS daemon(如果还没安装,可以对照文档安装)
ipfs daemon > Initializing daemon... > go-ipfs version: 0.13.0-c9d51bbe0 > ... > WebUI: http://127.0.0.1:5001/webui > Daemon is ready
在新的命令行窗品创建一个示例文件,这个文件将被用来关联到IPNS。简单起见,这里只创建一个 hello world 。
echo "Hello IPFS" > hello.txt
将此文件加入到IPFS中
ipfs add hello.txt > added QmUVTKsrYJpaxUT7dr9FpKq6AoKHhEM7eG1ZHGL56haKLG hello.txt > 11 B / 11 B [=====================================================] 100.00%
记下此文件的CID。注意: 由于IPFS基于文件内容生成CID的特性,因此只要内容相同,任何人生成文件CID都是相同的。
用
cat
命令和 CID 再查看一下文件内容ipfs cat QmUVTKsrYJpaxUT7dr9FpKq6AoKHhEM7eG1ZHGL56haKLG > Hello IPFS
重点来了, 下面命令让此CID发布到IPNS。 由于IPNS的
name
是发布者公钥的哈希,所以相同文件由不同人(或用不同公钥)发布时会得到不同的地址ipfs name publish /ipfs/QmUVTKsrYJpaxUT7dr9FpKq6AoKHhEM7eG1ZHGL56haKLG > Published to k51qzi5uqu5dkpmv98v525360py640pa9nqlkt3sudd14utec6t1dnrbdd332q: /ipfs/QmUVTKsrYJpaxUT7dr9FpKq6AoKHhEM7eG1ZHGL56haKLG
这个过程可能会比较慢,长达几十秒甚到一分钟。
发布结果中,
k51...
这一串字符便是IPNS的name
此后你可以一直使用这个
name
来稳定访问自己指向的内容。 即使内容变了(因此CID也变了),这个地址并不改变。**注:**如果要发布的不是单一文件, 而是一个文件夹,那么这个命令会慢到不可用。
原因是默认情况下
ipfs name publish
命令会尝试解析此CID中的全部内容是否可用。 这可能需要几个小时。为了避免这个问题, 可以利用命令参数,
--resolve
,它默认为true,当把它关闭时,命令会直接发布不先作解析验证:ipfs name publish --resolve=false /ipfs/QmUVTKsrYJpaxUT7dr9FpKq6AoKHhEM7eG1ZHGL56haKLG > Published to k51qzi5uqu5dkpmv98v525360py640pa9nqlkt3sudd14utec6t1dnrbdd332q: /ipfs/QmUVTKsrYJpaxUT7dr9FpKq6AoKHhEM7eG1ZHGL56haKLG
现在,就可以通过IPNS地址来访问文件内容了
curl https://gateway.ipfs.io/ipns/k51qzi5uqu5dkpmv98v525360py640pa9nqlkt3sudd14utec6t1dnrbdd332q > Hello IPFS
初次访问会很慢,甚至可能出现 504 超时错误。
如果不想等,有一个快速验证的办法。
在运行
ipfs daemon
之后, 默认会在本机 5001 端口启动一个web server,这时访问http://127.0.0.1:5001/webui
就可以看到 IPFS web console在其中的 FILES 界面, 在输入框中输入完整哈希
/ipns/k51...
即可看到文件内容。下面我们修改一下文件内容(其实在IPFS看来就是建了一个新文件),并更新到IPNS中
echo "Hello again IPFS" > hello.txt ipfs add hello.txt > added QmaVfeg2GM17RLjBs9C4fhpku6uDgrEGUYCTC183VrZaVW hello.txt > 17 B / 17 B [=====================================================] 100.00% ipfs name publish QmaVfeg2GM17RLjBs9C4fhpku6uDgrEGUYCTC183VrZaVW
同样的, 相同内容会生成相同CID。 所以你的CID应该与我的相同。但是发布后得到的IPNS地址会不同
这时再通过相同地址访问,会得到最新的结果
curl https://gateway.ipfs.io/ipns/k51qzi5uqu5dkpmv98v525360py640pa9nqlkt3sudd14utec6t1dnrbdd332q > Hello again IPFS
同样会很慢。 同样可以使用IPFS web console来验证最新文件同容。
如果想查看默认公钥关联的CID,可以用如下命令:
ipfs name resolve > /ipfs/QmaVfeg2GM17RLjBs9C4fhpku6uDgrEGUYCTC183VrZaVW
可以见到,此地址对应的CID已经改变了
最后,如果想使用不同的公钥来发布IPNS,则可以在
pulish
时指定--key
参数。# 生成新key ipfs key gen otherKey > k51qzi5uqu5dh32vzx9dv8lpeftjcb4oawylzb8g29jyrrzyui9bp2k9cbaizk # 用新公钥发布相同内容 ipfs name publish --key=otherKey /ipfs/QmaVfeg2GM17RLjBs9C4fhpku6uDgrEGUYCTC183VrZaVW # 得到了全新的地址 > Published to k51qzi5uqu5dh32vzx9dv8lpeftjcb4oawylzb8g29jyrrzyui9bp2k9cbaizk: /ipfs/QmaVfeg2GM17RLjBs9C4fhpku6uDgrEGUYCTC183VrZaVW
有哪些IPNS的替代品
IPNS只是在IPFS网络中为可变内容创建稳定地址的方式之一。
DNSLink是另外一种可选方式。 目前它比IPNS更快, 并且其使用了人类可读的方式命名。
其它社区成员在想办法使用区块链来存储通用名称记录。例如 ENS ,当然由于这种方式需要以太坊, 所以需要一点点费用。 后续会单独写一篇来介绍