1

我正在尝试在两个 IPFS 节点之间发送消息。我正在运行的守护进程基于 go-ipfs,并使用以下标志运行:

ipfs daemon --enable-pubsub-experiment

我编写了两个 .js 文件,一个用于订阅者:

const IPFS = require('ipfs')
const topic = 'topic';
const Buffer = require('buffer').Buffer;
const msg_buffer = Buffer.from('message');

const ipfs = new IPFS({
  repo: repo(),
  EXPERIMENTAL: {
    pubsub: true
  },
  config: {
    Addresses: {
      Swarm: [
        '/dns4/ws-star.discovery.libp2p.io/tcp/443/wss/p2p-websocket-star'
      ]
    }
  }
})

ipfs.once('ready', () => ipfs.id((err, info) => {
  if (err) { throw err }
  console.log('IPFS node ready with address ' + info.id)
  subscribeToTopic()
}))

function repo () {
  return 'ipfs-' + Math.random()
}

const receiveMsg = (msg) => {
  console.log(msg.data.toString())
}

const subscribeToTopic = () => {
  ipfs.pubsub.subscribe(topic, receiveMsg, (err) => {
    if (err) {
      return console.error(`failed to subscribe to ${topic}`, err)
    }
    console.log(`subscribed to ${topic}`)
  })
}

一个是给出版商的:

const IPFS = require('ipfs');
const topic = 'topic';
const Buffer = require('buffer').Buffer;
const msg_buffer = Buffer.from('message');

const ipfs = new IPFS({
  repo: repo(),
  EXPERIMENTAL: {
    pubsub: true
  },
  config: {
    Addresses: {
      Swarm: [
        '/dns4/ws-star.discovery.libp2p.io/tcp/443/wss/p2p-websocket-star'
      ]
    }
  }
})

ipfs.once('ready', () => ipfs.id((err, info) => {
  if (err) { throw err }
  console.log('IPFS node ready with address ' + info.id)
  publishToTopic()
}))

function repo () {
  return 'ipfs-' + Math.random()
}

const publishToTopic = () => {
  ipfs.pubsub.publish(topic, msg_buffer, (err) => {
    if (err) {
      return console.error(`failed to publish to ${topic}`, err)
    }
    // msg was broadcasted
    console.log(`published to ${topic}`)
    console.log(msg_buffer.toString())
  })
}

我已经运行了 .js 脚本:

node file.js

但是订阅者没有收到订阅者的任何消息,我不知道为什么。

在这种情况下连接两个节点的正确方法是什么?

4

3 回答 3

0

目前(2019-09-17)ipfs 网络中的大多数节点都没有启用 pubsub,因此您的 pubsub 消息通过的机会很小。您可以尝试在节点之间建立直接连接,如下所述:management swarm connections in ipfs

本质上:

  1. 在互联网可访问节点上运行“ipfs id”
  2. 检查输出,获取地址(它应该看起来像这样 /ip4/207.210.95.74/tcp/4001/ipfs/QmesRgiWSBeMh4xbUEHUKTzAfNqihr3fFhmBk4NbLZxXDP )
  3. 在另一个节点上建立直连:

    ipfs 群连接 /ip4/207.210.95.74/tcp/4001/ipfs/QmesRgiWSBeMh4xbUEHUKTzAfNqihr3fFhmBk4NbLZxXDP

于 2019-09-17T11:00:10.580 回答
0

请参阅 ipfs Github示例,因为它显示了如何通过 WebRTC 将两个 js-ipfs 浏览器节点连接在一起。

于 2020-08-09T19:37:18.487 回答
0

也许我错了,但 npm 包ipfs是 IPFS 协议的完整实现,它在调用构造函数时创建一个节点,这就是为什么ipfs daemon ...不需要。如果您需要将其用作 ipfs 守护程序的 API,您可以使用ipfs-http-client包。

您可以使用ipfs-pubsub-room,它有一个基于此包ipfs-pubsub-room-demo的工作示例。

我希望它有所帮助,我也在学习这项技术。

于 2019-07-25T04:06:20.387 回答