2

我做了一个测试,看看如果我尝试获取一个不存在的 CID 会发生什么,看看我是否可以不断地询问 IPFS 中的每个对等点。它似乎不起作用。我“连接”到大约 10 个同行,然后它放弃了。我不确定我是否真的在“连接”。我不确定发生了什么。我不知道我实际上是在连接到任何对等点并要求他们提供 CID。我似乎连接到星型服务器,并看到一个对等点列表,但不确定我是否连接到任何这些对等点。

我应该听其他事件来调试正在发生的事情吗?如何收听我发送给同行的消息?

我对 Bittorrent DHT 工作原理的假设是,如果 CID 不存在,我最终应该询问网络上的每个对等方是否有这个 CID。全网只有10个peer吗?还是那台明星服务器上只有 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>
4

1 回答 1

3

js-ipfs 目前默认没有启用 DHT。您需要通过创建选项显式启用它。这将导致 IPFS 位交换协议向网络查询您正在寻找的内容。在 DHT 查询期间,正如您所描述的,对等方将根据 DHT 算法连接到网络上的其他对等方,以查找内容。

那么,为什么我们默认禁用 DHT?JS DHT 实现无法很好地扩展有几个原因,一些与 DHT 实现本身有关,还有一些与网络中的不可断开节点和效率不高的连接管理器有关。GO DHT 确实在几个月前得到了改进,JS 实现将根据最近 GO 实现的变化进行完全重构。连接管理器的改进也在进行中。

虽然 DHT 没有重构和稳定,但建议利用委托节点。委托节点是代表其他人进行内容和对等路由查询的节点。js-ipfs@0.48发布时默认配置了一些公共委托节点。代理节点是 GO 节点,它将代表 JS 节点进行 DHT 查询,这样,它将是幕后的 go 节点,将与其他节点建立连接。

让我知道我是否可以回答您的问题

于 2020-09-23T08:39:32.920 回答