Как записывать одноранговые сообщения в IPFS / libp2p в браузере?

Я провел тест, чтобы увидеть, что произойдет, если я попытаюсь получить CID, которого не существует, чтобы увидеть, могу ли я постоянно спрашивать каждого однорангового узла в IPFS. Похоже, это не работает. Я подключаюсь примерно к 10 партнерам, а затем он отказывается. Я не уверен, что на самом деле подключаюсь. Я не совсем понимаю, что происходит. Я не знаю, действительно ли я подключаюсь к какому-либо партнеру и запрашиваю у них CID. Мне кажется, что я подключаюсь к звездообразному серверу и вижу список одноранговых узлов, но не уверен, что когда-либо подключаюсь к любому из этих узлов.

Есть ли другие события, которые я должен слушать, чтобы отладить то, что происходит? Как я могу прослушивать сообщения, которые я отправляю партнерам?

Мое предположение о том, как работает Bittorrent DHT, заключается в том, что, если CID не существует, я должен в конечном итоге спрашивать каждого однорангового узла в сети, есть ли у них этот CID. Во всей сети всего 10 пиров? Или только 10 пиров на этом звездообразном сервере? Нет ли открытия звездообразного сервера? Как мне найти занятый звездный сервер?

<script src="https://cdn.jsdelivr.net/npm/ipfs/dist/index.min.js"></script>

<script>
    (async () => {
        window.node = await Ipfs.create()
        window.node.libp2p.on('peer:discovery', (peer) => console.log('peer:discovery', peer))
        window.node.libp2p.on('peer:connect', peerInfo => console.log('peer:connect', peerInfo))
        window.node.libp2p.on('peer:disconnect', peerInfo => console.log('peer:disconnect', peerInfo))
        window.node.libp2p.peerStore.on('peer', (peerId) => console.log('peer', peerId))
        window.node.libp2p.peerStore.on('change:multiaddrs', ({ peerId, multiaddrs}) => {
            const addresses = []
            for (const multiaddr of multiaddrs) {
                addresses.push(multiaddr.buffer.toString())
            }
            console.log('change:multiaddrs', {peerId, multiaddrs, addresses})
        })
        window.node.libp2p.peerStore.on('change:protocols', ({ peerId, protocols}) => console.log('change:protocols', {peerId, protocols}))
        window.node.libp2p.on('error', (err) => console.log('error', err))
        window.node.libp2p.connectionManager.on('peer:connect', (connection) => {
            console.log('connectionManager:peer:connect', {connection, remoteAddr: connection.remoteAddr.buffer.toString()})
        })
        window.node.libp2p.connectionManager.on('peer:disconnect', (connection) => console.log('connectionManager:peer:disconnect', connection))

        // fake CID does not exist
        results = window.node.get("QmZbj5ruYneZb8FuR9wnLuJCpCXMQudhSdWhdhp5U1oPWJ")
        for await (res of results) {
          for await (content of res.content) {
             window.content = content
              console.log(content.toString())
            }
        }
    })()
</script>

person cooldude101    schedule 02.09.2020    source источник


Ответы (1)


js-ipfs в настоящий момент не включает DHT по умолчанию. Вам необходимо явно включить его через параметры создания. Это приведет к тому, что протокол обмена битами IPFS будет запрашивать в сети контент, который вы ищете. Во время запроса DHT, как вы также описали, одноранговый узел будет подключаться к другим одноранговым узлам в сети в соответствии с алгоритмом DHT, чтобы найти контент.

Итак, почему у нас по умолчанию отключен DHT? Реализация JS DHT плохо масштабировалась по нескольким причинам, некоторые из которых были связаны с самой реализацией DHT, а другие - например, с ненадежными узлами в сети и неэффективным диспетчером соединений. GO DHT был действительно улучшен несколько месяцев назад, и реализация JS будет полностью переработана в соответствии с последними изменениями в реализации GO. Улучшения диспетчера соединений также находятся на подходе.

Хотя DHT не подвергается рефакторингу и не стабилен, рекомендуется использовать узлы-делегаты. Узел делегата - это узел, который будет выполнять запросы маршрутизации контента и одноранговых узлов от имени других. [email protected] был выпущен с некоторыми общедоступными делегированными узлами, настроенными по умолчанию. Узлы-делегаты - это узлы GO, которые будут выполнять запросы DHT от имени узлов JS, таким образом, это будет узел go за кулисами, который будет устанавливать соединения с другими узлами.

Сообщите мне, могу ли я ответить на ваш вопрос

person vasco.santos    schedule 23.09.2020