Hyperprotocol使用问题:如何仅连接指定对等节点,限制Hyperdrive仅同步局域网对等点
Hyperdrive 仅局域网同步实现方案
核心实现思路
你提到的 validatePeer 是Hyperswarm提供的标准过滤钩子,Hyperspace支持直接透传配置给底层Hyperswarm实例,无需手动获取swarm引用即可实现需求,同时可以通过全局开关控制是否允许互联网同步,满足后续配置扩展的要求。
场景1:代码中直接初始化Hyperspace实例
初始化Hyperspace时传入swarmOpts配置项,该参数会直接透传给底层Hyperswarm实例,在其中定义validatePeer回调即可实现对等节点过滤:
- 前置依赖:
npm install hyperspace hyperdrive ip,其中ip模块用于快速判断IP是否为私有局域网地址,也可以自行匹配IP段:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、fc00::/7实现相同逻辑。 - 代码示例:
const Hyperspace = require('hyperspace') const Hyperdrive = require('hyperdrive') const ip = require('ip') // 全局配置开关,后续需要开放互联网同步时直接改为true即可 const ALLOW_WAN_SYNC = false const hyperspace = new Hyperspace({ // 透传给底层Hyperswarm的配置 swarmOpts: { validatePeer: (peer) => { // 允许所有节点时直接返回true if (ALLOW_WAN_SYNC) return true // 仅允许局域网私有地址的节点连接 return ip.isPrivate(peer.host) } } }) await hyperspace.ready() // 后续按原有逻辑初始化Hyperdrive即可 const drive = new Hyperdrive(hyperspace.corestore) await drive.ready()
场景2:连接独立运行的Hyperspace守护进程
如果你的代码通过@hyperspace/client连接后台已启动的Hyperspace守护进程,无法在客户端侧直接传入swarm配置,可以通过连接后过滤的方案实现相同效果:
- 代码示例:
const HyperspaceClient = require('@hyperspace/client') const Hyperdrive = require('hyperdrive') const ip = require('ip') const ALLOW_WAN_SYNC = false const client = new HyperspaceClient() await client.ready() // 监听新对等节点连接事件 client.corestore.on('peer-add', (peer) => { if (ALLOW_WAN_SYNC) return // 提取远程IP地址 const remoteIp = peer.remoteAddress?.split(':')[0] // 非局域网IP直接销毁连接 if (remoteIp && !ip.isPrivate(remoteIp)) { peer.destroy() } }) const drive = new Hyperdrive(client.corestore) await drive.ready()
可选优化:局域网节点优先同步
如果后续开放了互联网同步,需要实现局域网节点优先级高于互联网节点,可以在validatePeer中调整节点优先级:
validatePeer: (peer) => { // 局域网节点优先级设为10,互联网节点优先级设为1 peer.priority = ip.isPrivate(peer.host) ? 10 : 1 return ALLOW_WAN_SYNC || ip.isPrivate(peer.host) }
内容的提问来源于stack exchange,提问作者Nearoo
相关产品推荐
相关产品推荐

