首页 > IPFS > 正文

IPFS技术进展:js-IPFS 0.50.0在共享的webworker中运行,并且具有更快的固定速度

分类:新闻FilCloud公众号:filcloud 2020-09-15 18:42

  亮点

  在多个选项卡和密码文件之间更快地共享IPFS节点

  js-IPFS@0.50.0支持在多个浏览器选项卡之间共享节点,极大地提高了固定的性能。

  我们也在逐步淘汰 Node.js 缓冲区作为数据类型的使用,取而代之的是标准的 JavaScript Uint8Arrays。

  请继续阅读,了解完整的细节!

  浏览器标签之间共享一个节点

  IPFS 节点与网络上的其他节点进行了大量连接,而且由于默认情况下打开了委托节点,所以这种连接更多。这是为了确保你有最大的机会在网络上找到内容,因此其他人也有最大的机会在网络上找到你的内容。

  但是,这并不是没有代价的,维护多个连接可能是资源密集型的,而且在某些情况下,浏览器会限制您可以拥有的并发连接的数量。

  在 web 浏览器中,如果用户在两个选项卡中打开你的应用程序,突然你有两个节点在运行,并且打开的连接数是原来的两倍,这就会出现问题。更糟糕的是,它们共享一个数据存储和相同的对等 ID。

  帮助以 ipfs-message-port-client 和 ipfs-message-port-server 的形式存在,它们允许您在 SharedWorker 中运行 IPFS 节点,并在应用程序中的多个选项卡之间共享该节点。

  不久将在此主题上发表更深入的文章,但与此同时,请查看 browser-sharing-node-across-tabs 示例以了解如何使用它!

  固定性能

  在向本地 IPFS 节点添加内容时,将其固定在适当的位置,以防止在垃圾收集期间删除组成文件的块。pin 被放置在一个pin集合中,我们称之为 pinset。

  这个 pinset 背后的数据结构是一个 DAG,非常类似于表示已添加到 IPFS 中的文件和文件夹的结构。DAG 的根 CID 存储在数据存储中,组成 DAG 的所有块都存储在块存储中。

  pinset 由树形结构中的许多桶组成,每个桶最多包含 8192 项,每层最多包含 256 个桶。第一个桶满后,pin 在桶之间分配。

  当垃圾收集运行时,DAG 中的所有节点都将被遍历,与它们的 cid 对应的块将免于删除。

  当你添加和移除 pin 时,这个 DAG 会变大或缩小。DAG 内部的中间节点的 cid 会随着结构的变化而重新计算。随着 DAG 变得越来越大,这可能会变得昂贵,并且会损害非常大的应用程序性能。

  js-ipfs@0.50.0改变了 pin 的默认存储,使用数据存储,而不是 DAG,并且随着回购中固定块的数量增加,您看到了相应的加速:

  在上面的图表中,你可以看到随着固定项目数量的增加,添加下一个固定项目所需的时间也在增加。当第一个桶被认为是满的,并且创建了多个桶,然后需要更多的操作来添加下一个 pin 时,pin 会急剧增加到 8192 个。

  与以前的版本相比,js-ipfs@0.50.0 所采用的方法的性能非常好,本质上只受底层数据存储性能的限制,因为它已经切换到简单的 put 和 get,而没有创建数据结构的开销。

  Uint8Arrays

  最初有数组。可以容纳各种混合类型的简单数组无法很好地优化,并且是对内存块的抽象。

  然后 Node.js 出现了,并引入了 Buffer,JavaScript 开发人员就可以直接访问内存了!这些工具保存的数字的整数值范围为 0-255,速度非常快。JavaScript 开始看起来像是一种合适的语言,您可以用它来完成资源密集型的工作。

  ECMAScript 标准的作者注意到了这一点,并引入了 TypedArrays,它有很多变体,但我们最感兴趣的是 Uint8Array。

  这些类型的数组保存的数字的整数值范围为 0-255,并且支持一个非常类似于 Node.js 缓冲区的 API,这一点也不奇怪,因为 Node 的版本是 3.0.0。Buffer 是 Uint8Arrays 的子类。

  这是一个激动人心的时代,随着 JavaScript 功能的增强和浏览器的支持的到来,我们正在减少对核心 Node.js 库和工具的依赖。其中一部分是在我们的代码库中删除 Node.js 缓冲区的所有使用。

  对于 js-ipfs@0.50.0,您应该停止依赖 Node.js 缓冲区来从内核 api 的任何部分返回,而应该根据 Uint8Array 接口进行编码。

  我们所依赖的一些模块仍然会返回 Buffer,我们将其传递以避免任何转换成本,但我们希望随着时间的推移删除或重构这些缓冲区。为了保持向前兼容,你不应该在这些返回值上使用 Node.js 缓冲区方法。

  例如,在下面的代码中,我们从字符串“Hello”创建一个Buffer,将它添加到IPFS中,然后立即对它进行 cat 并对数据块调用toString()。这利用了我们添加的 Buffer 是utf8编码的这一事实。tostring()的编码参数默认是 utf8,所以下面的代码可以工作,但这只是巧合:

  const { cid } = await ipfs.add(Buffer.from('Hello'))​for await (const chunk of ipfs.cat(cid)) { console.info(chunk.toString()) // prints 'Hello'}

  相反,我们将使用 TextEncoder 和 TextDecoder 类。它们在编码/解码中是明确的(默认也是utf8),所以使用起来更安全:

  const encoder = new TextEncoder()const decoder = new TextDecoder()​const { cid } = await ipfs.add(encoder.encode('Hello'))​for await (const chunk of ipfs.cat(cid)) { console.info(decoder.decode(chunk)) // prints 'Hello'}

  新功能

  在数据存储中存储 pin 而不是DAG (#2771) (64b7fe4)

  将协议列表添加到 ipfs id 输出(#3250)(1b6cf60)

  IPNS 在浏览器中发布示例(#3207)(91faec6)

  将 hapi 更新到 v20 (#3245) (1aeef89)

  更新到 libp2p@0.29.0 (63d4d35)

  ing 重大变化

  节点 Buffer 已被替换为 Uint8Arrays (#3220)

  API 的变化

  核心 API 和 HTTP API 客户端

  现在的返回值ipfs.id包括节点可理解的协议列表

  重大更改 previouslyBuffer以前返回 Node.js 对象Uint8Arrays的位置,现在位于它们的位置。这会影响:

  ipfs.block.*现在.data,块对象的属性为Uint8Array

  ipfs.dag.get根据返回的节点类型:

  ipld-raw节点现在返回为Uint8Arrays

  现在.data,返回ipld-dag-pb节点的属性为Uint8Array

  ipfs.dht.get返回一个Uint8Array

  ipfs.cat文件数据现在以Uint8Arrays 返回

  ipfs.files.read文件数据现在以Uint8Arrays 返回

  ipfs.object.data对象数据现在作为Uint8Array

  ipfs.pubsub.subscript发布到主题的数据现在作为Uint8Array

  有关更多阅读,请参阅 Core API Docs。

  接下来是什么?

  查看 js-IPFS 项目路线图,其中包含按我们希望的顺序组织的主要特性。

  路线图中只有大的特性被调用,预计在路线图项之间会有很多小的 bug 修复发布!

  非常感谢所有能够发布此版本的人

  @abbasogaji(1个问题,1条评论)

  @achingbrain(77次提交,33个PR,1个问题,57条评论)

  @alanshaw(3次提交)

  @aphelionz(1个问题,3条评论)

  @aschmahmann(1条评论)

  @AuHau(1次提交,1个PR,2个问题,5条评论)

  @bluelovers(1个PR,2个问题,4条评论)

  @bmann(1个问题,1条评论)

  @christopheSeeka(1条评论)

  @ codecov-commenter(15条评论)

  @ crypt0maniak(1个PR,2条评论)

  @ dave-dm(1个问题)

  @dependabot [bot](2次提交)

  @ duxiaofeng-github(1个问题)

  @ er123rin(1 PR)

  @ ffa500(1条评论)

  @Gozala(1次提交,1个PR,1个问题,21条评论)

  @hugomrdias(2次提交,1条评论)

  @hunterInt(1个问题)

  @icidasset(1条评论)

  @jacekv(1个问题,1条评论)

  @jacobheun(23提交,6 PR,1问题,28评论)

  @josselinchevalay(1个问题,2条评论)

  @koivunej(2个问题,1条评论)

  @lidel(2条评论)

  @ lukaw3d(1个问题,1条评论)

  @mikeal(1次提交)

  @mitjat(1条评论)

  @moodysalem(1个问题,5条评论)

  @ mrh42(1个问题)

  @negamaxi(1个问题,1条评论)

  @ olivier-nerot(1个问题,1条评论)

  @olizilla(2次提交,1个PR,1条评论)

  @onichandame(1条评论)

  @ OR13(2个问题)

  @rvagg(5条评论)

  @shazow(1次提交,1个PR)

  @StationedInTheField(1个问题,4条评论)

  @tabcat(1个PR,2个问题,4条评论)

  @Tcll(2问题,4评论)

  @ tk26(1次提交,1个PR,3条评论)

  @ vasco-santos(66次提交,20个PR,3个问题,24条评论)

  @vmx(2次提交,1个PR,3条评论)

  @vojtechsimetka(1次提交,1个PR)

  @welcome(11条评论)

  @wemeetagain(35次提交,6个PR,2个问题,5条评论)

  @Xmader(3次提交,3个PR,2条评论)

  @xmaysonnave(1个问题,1条评论)

  想贡献?

  你是否愿意为IPFS项目做贡献,但又不知道如何做?嗯,有几个地方你可以开始:

  检查 js-IPFS 存储库中help wanted标签的问题

  加入 IPFS 的“全力以赴”,自我介绍,并让我们知道您想在哪里做出贡献:https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands

  用 IPFS 破解并向我们展示您的成就!All Hands 呼叫也是进行演示的理想场所,请加入并向我们展示您创建的内容

  通过https://discuss.ipfs.io/加入讨论,并帮助用户找到答案。

  加入 IPFS 核心实施每周同步,并参与其中!

  你有问题吗?

  最好的地方要问你关于 IPFS 的问题,它是如何工作的,以及你可以用它做的是在discuss.ipfs.io。我们也可以在#ipfsFreenode 上的频道上找到。

  End

  非常感谢您对 IPFS&Filecoin 项目的持续支持。我们很高兴继续与您一起,为人类信息建立一个强大的,去中心化和高效的基础。

  FilCloud 帮你迅速了解 IPFS 领域的热点技术和应用公众号:filcloud

本文标签:IPFS 技术 进展 webworker

上一篇:Filecoin主网再次推迟,为什么对矿工来说是个好消息?

下一篇:至联云提醒你:你的FIL期货能兑付吗?  

猜您喜欢
关于我们联系我们作者投稿APP下载