ENS域名zh4ck.eth的两种IPNS格式是什么?如何转换?
关于ENS域名Content Hash的IPNS格式疑问
假设有ENS域名zh4ck.eth,其在ENS管理器中显示的content hash为:
ipns://k51qzi5uqu5dlodad1tur2ti64q55m1w8ipohvk0a52ebm4qlntay45hgdxqyb
但通过Infura或Cloudflare等API查询该域名的content hash时,得到的结果是:
ipns://2D3KooWQepL1NNdw3RuvJp9f4cjUkkUZjwLHPn2HFWV6iTXVtKt
疑问点
- 第二种IPNS格式是什么?
- 如何将其转换为原始的
k51qzi...格式?
已尝试的代码(ethers + Infura)
var ethers = require('ethers') const provider = new ethers.InfuraProvider("homestead", 'MY_API') const resolver = await provider.getResolver('zh4ck.eth') await resolver.getContentHash() // 返回结果: 'ipns://2D3KooWQepL1NNdw3RuvJp9f4cjUkkUZjwLHPn2HFWV6iTXVtKt'
解答
第二种IPNS格式是什么?
2D3KooWQepL1NNdw3RuvJp9f4cjUkkUZjwLHPn2HFWV6iTXVtKt 是IPNS密钥的Base58btc编码格式(Multibase Base58btc编码),而原始的k51qzi...格式是IPNS密钥的Kubo(原IPFS)默认编码格式(Multicodec + Multibase Base32编码)。
两者本质指向同一个IPNS标识符,仅编码规则不同:
k51qzi...:以k开头,是包含libp2p-key多编码前缀的Base32编码IPNS节点ID2D3Koo...:以2开头,是直接编码公钥原始字节的Base58btc格式(无多编码前缀)
如何转换为原始格式?
可以借助IPFS生态的工具库或命令行完成转换,以下是两种可行方案:
方案1:使用multiformats库(Node.js环境)
const { CID, multibase, multicodec } = require('multiformats') // 将Base58btc编码的公钥转换为Kubo默认的IPNS格式 async function convertBase58ToKuboIPNS(base58Key) { // 解码Base58btc格式的公钥字节(补z前缀作为Base58btc的多编码标识) const pubKeyBytes = multibase.decode(`z${base58Key}`) // 创建V1版本的CID,指定多编码类型为libp2p-key,编码格式为Base32 const cid = CID.createV1(multicodec.get('libp2p-key').code, pubKeyBytes) // 返回带ipns://前缀的目标格式 return `ipns://${cid.toString()}` } // 调用示例 convertBase58ToKuboIPNS('2D3KooWQepL1NNdw3RuvJp9f4cjUkkUZjwLHPn2HFWV6iTXVtKt') // 输出结果: ipns://k51qzi5uqu5dlodad1tur2ti64q55m1w8ipohvk0a52ebm4qlntay45hgdxqyb
方案2:使用IPFS命令行工具
若本地已安装IPFS,可直接通过命令完成转换:
# 将Base58公钥导入为临时IPFS密钥 ipfs key import temp-key --type=rsa --data=<(echo "2D3KooWQepL1NNdw3RuvJp9f4cjUkkUZjwLHPn2HFWV6iTXVtKt" | base58 -d) # 列出所有密钥,其中temp-key对应的ID就是k51qzi...格式 ipfs key list -l
内容的提问来源于stack exchange,提问作者user2716262
相关产品推荐
相关产品推荐

