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

Yoo*_*omi 3 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
Run Code Online (Sandbox Code Playgroud)

我这样使用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);
            })
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我想坚持这样一个事实:ipfs add命令行给出的哈希值立即生效

提前致谢

小智 5

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

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

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

https://ipfs.io/ipfs/[CID]如果在 ipfs.io 操作的网关计算机上运行的 IPFS 节点需要一段时间才能找到该 CID 的提供者,则尝试从公共网关获取根 CID可能会很慢。它是一台远程计算机,它必须首先找到提供该 CID 的本地对等点,并从中获取数据。

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

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
Run Code Online (Sandbox Code Playgroud)

...意味着您的本地 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
...
Run Code Online (Sandbox Code Playgroud)

...并且为了找到您连接到的对等点的数量,您可以将输出通过管道传输到 wc -l

$ ipfs swarm peers | wc -l
     755
Run Code Online (Sandbox Code Playgroud)

...并且回答您的基本问题,由于语言的差异,js-ipfs 仅比 go-ipfs 慢。它们都是同一规范的实现,并且都使用类似的算法来实现。如果您出于任何原因想从 JS 使用 go-ipfs,您也可以通过运行 go-ipfs 守护进程并使用具有js-ipfs-http-client相同 api 的库通过 HTTP API 与它进行对话js-ipfs