You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:39:56