与IPFS相比,JS-IPFS的性能低下

时间:2018-07-13 15:48:30

标签: javascript ipfs

我正在使用js-ipfs服务器端在IPFS上“上传”文件,但看来效率比命令行ipfs daemonipfs add someFile低。

在服务器端,我实例化了一个Ipfs对象,然后尝试使用路径和文件内容的缓冲区来storeData。服务器启动时,我已连接到三个集群:

Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/ipfs/QmTBoDWXviw7eRKeDGbp3wU2PxAw1epPxax6mp8uY6CEEW
Swarm listening on /ip4/127.0.0.1/tcp/4002/ipfs/QmTBoDWXviw7eRKeDGbp3wU2PxAw1epPxax6mp8uY6CEEW
Swarm listening on /ip4/10.19.77.89/tcp/4002/ipfs/QmTBoDWXviw7eRKeDGbp3wU2PxAw1epPxax6mp8uY6CEEW

我以这种方式使用IPFS:

const IPFS = require('ipfs');
const node = new IPFS();

class Ipfs {

    constructor() {
        node.on('error', e => console.log(e))
        node.on('start', () => console.log('Node started !'))
        node.on('ready', () => console.log('Node is ready !'))
    }

    storeData(content, path) {
        return new Promise((resolve, fail) => {
            let encData = {
                path: path,
                content: content,
            };
            node.files.add(encData, (err, data) => {
                if (err) return fail(err);
                return resolve(data);
            })
        })
    }
}

当我从对象中调用storeData时,IPFS给了我一个哈希,可以在其中获取文件,但是https://ipfs.io/ipfs/[hash]从未加载。

我想坚持一个事实,即ipfs add命令行给出的哈希可以立即生效

预先感谢

1 个答案:

答案 0 :(得分:2)

从命令行运行ipfs add <some file>时,它将对文件进行分块,并将其添加到本地~/.ipfs目录中。在运行时,它会打印出块的CID,最后是根CID。

如果您尝试使用运行ipfs cat <root CID>时获得的CID通过运行ipfs add从IPFS提取文件,那么它也会很快,因为它将从本地存储库。如果您使用当前没有的CID运行ipfs cat,则它将向您的连接对等方询问。如果当前未与提供该CID数据的人连接,则可能需要一段时间。

js-ipfs中,调用node.files.add的工作方式与从命令行运行ipfs add相似。完成对文件进行分块并将其存储在本地后,它将立即返回根CID(默认情况下位于~/.jsipfs中)。

如果在ipfs.io运营的网关计算机上运行的IPFS节点花费一些时间来查找该CID的提供者,则尝试通过https://ipfs.io/ipfs/[CID]从公共网关获取根CID可能会很慢。这是一台远程机器,它必须首先找到提供该CID的本地对等方,然后从中获取数据。

当您使用ipfs daemon启动ipfs节点时,初始输出会告诉您节点正在侦听哪些本地网络接口和端口,所以

Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/ipfs/QmTBoDWXviw7eRKeDGbp3wU2PxAw1epPxax6mp8uY6CEEW
Swarm listening on /ip4/127.0.0.1/tcp/4002/ipfs/QmTBoDWXviw7eRKeDGbp3wU2PxAw1epPxax6mp8uY6CEEW
Swarm listening on /ip4/10.19.77.89/tcp/4002/ipfs/QmTBoDWXviw7eRKeDGbp3wU2PxAw1epPxax6mp8uY6CEEW

...表示您的本地ipfs节点正在监听ipv4地址127.0.0.110.19.77.89。它不会告诉您您有几个同龄人。要找出您有多少对等方,请运行ipfs swarm peers

$ ipfs swarm peers
/ip4/1.64.206.172/tcp/42707/ipfs/QmUDGjCUDePrxWbpohHLuW8Hy1uGKXi4tJXaN6z7FuNszb
/ip4/100.24.159.221/tcp/46757/ipfs/QmQjGfZq3MvgykH5oXeQaZvU6TGMCD7xtRtUXz1sK4u8nG
/ip4/101.200.58.57/tcp/4001/ipfs/QmRXcRwhbjtgE2E3hF4rRhM3xaGRrjfieUE5iXGCAwrZ9d
...

...只需找出连接到的对等体的数量,就可以将输出传递到wc -l <​​/ p>

$ ipfs swarm peers | wc -l
     755

...并且回答您的基本问题 js-ipfs仅比go-ipfs慢,原因是语言有所不同。都是相同规格的实现,并且都使用相似的算法实现。如果出于任何原因想要使用JS中的go-ipfs,也可以通过运行go-ipfs守护程序并使用具有相同功能的js-ipfs-http-client库通过HTTP API与之对话来实现api为js-ipfs