运行js-libp2p遇ERR_NO_VALID_ADDRESSES错误,multiaddr异常
解决js-libp2p中「Error: The dial request has no valid addresses」及重复PeerId的multiaddr问题
问题根源
重复的/p2p/<PeerId>段会导致multiaddr不符合libp2p规范,被判定为无效地址,直接触发拨号错误。你给出的示例地址包含两段完全相同的PeerId路径,属于典型的地址构造错误。
具体解决步骤
1. 排查并修正multiaddr生成逻辑
禁止手动拼接multiaddr字符串,避免重复添加/p2p段。改用libp2p官方的multiaddr模块来构造合法地址:
import { multiaddr } from '@multiformats/multiaddr' import { PeerId } from '@libp2p/peer-id' // 正确构造流程:基础地址 + 单次封装PeerId const baseAddress = multiaddr('/ip4/127.0.0.1/tcp/49601') const targetPeerId = PeerId.parse('12D3KooWAYVAAk7tWYkKRATq44JvWLAnzinsuNUukVAwyhvvwKbQ') const validMultiaddr = baseAddress.encapsulate(`/p2p/${targetPeerId.toString()}`) // 输出合法地址:/ip4/127.0.0.1/tcp/49601/p2p/12D3KooWAYVAAk7tWYkKRATq44JvWLAnzinsuNUukVAwyhvvwKbQ console.log(validMultiaddr.toString())
2. 修复节点发现后的地址处理
如果是从DHT/对等发现机制获取到异常地址,需在存入peerStore前过滤重复的/p2p段:
peerStore.addEventListener('peer', (evt) => { const peer = evt.detail const validAddresses = peer.addresses.map(addr => { const segments = addr.toString().split('/') // 收集所有/p2p段的索引 const p2pPositions = segments.reduce((acc, seg, idx) => { seg === 'p2p' && acc.push(idx) return acc }, []) // 存在多个/p2p段时,仅保留第一个完整的/p2p/<PeerId>部分 if (p2pPositions.length > 1) { const firstP2pIndex = p2pPositions[0] return multiaddr('/' + segments.slice(0, firstP2pIndex + 2).join('/')) } return addr }) // 更新peerStore中的有效地址 peerStore.addressBook.set(peer.id, validAddresses) })
3. 统一依赖版本
执行以下命令检查并修复@multiformats/multiaddr的依赖冲突:
npm ls @multiformats/multiaddr # 若存在版本不一致,执行去重 npm dedupe
内容的提问来源于stack exchange,提问作者tobebetter
相关产品推荐
相关产品推荐

