2

我正在使用 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命令行给出的哈希值立即生效

提前致谢

4

1 回答 1

4

在命令行中,当您运行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

...表示您的本地 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

$ ipfs swarm peers | wc -l
     755

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

于 2019-06-10T16:09:07.303 回答