Pubsub между двумя узлами в IPFS

Я пытаюсь отправить сообщения между двумя узлами 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

Но подписчик не получил никакого сообщения от подписчика, и я не знаю почему.

Как правильно соединить два узла в этом случае?

0 ответов

Пожалуйста, обратитесь к ОПЗ GitHub пример, так как он показывает, как соединить узлы два JS-ОПЗ браузера вместе через WebRTC.

В настоящее время (17.09.2019) на большинстве узлов сети ipfs не включен pubsub, поэтому шансы, что ваши сообщения pubsub будут проходить, невелики. Вы можете попытаться установить прямое соединение между вашими узлами, как описано здесь:управление роевыми соединениями в ipfs

По сути:

  1. Запустите "ipfs id" на доступном в Интернете узле
  2. Проверьте вывод, получите адрес (он должен выглядеть так /ip4/207.210.95.74/tcp/4001/ipfs/QmesRgiWSBeMh4xbUEHUKTzAfNqihr3fFhmBk4NbLZxXDP)
  3. На другом узле установите прямое соединение:

    ipfs swarm connect /ip4/207.210.95.74/tcp/4001/ipfs/QmesRgiWSBeMh4xbUEHUKTzAfNqihr3fFhmBk4NbLZxXDP

Может я ошибаюсь но пакет npm ipfs представляет собой полную реализацию протокола IPFS и создает узел при вызове конструктора, поэтому ipfs daemon ...не обязательно. Если вам нужно использовать его как API с демоном ipfs, вы можете использовать пакет ipfs-http-client.

Вы можете использовать ipfs-pubsub-room, и у него есть рабочий пример, основанный на этом пакете ipfs-pubsub-room-demo.

Надеюсь, это поможет, я тоже все еще изучаю эту технологию.

Другие вопросы по тегам