IPFS:go-ipfs 0.4.18版本详解

  • 0_1542079986930_8d6564a2-135d-45fa-83e6-4e1aaa216e80-image.png

    go-ipfs 0.4.18已发布!这是迄今为止最大的go-ipfs版本之一,进行了3个月的制作。在此,特别感谢所有为此项目做出贡献的人员!

    以下是有关此次版本更新的详细说明。

    ✨ 亮点

    此版本的升级功能包含:

    • 实验性QUIC支持 - 更快、更高效的对等节点连接,更好地处理有损网络和改进NAT遍历。

    • Gossipsub pubsub路由算法 - 显着提高IPFS上的pubsub、以及签名消息

    • 更新了WebUI - IPFS WebUI的一个重大更新,扩展了整个功能信息

    • 增强p2p、cid以及add - 许多IPFS命令的重构和新功能的增加。

    • 性能 - 许多IPFS子系统中的众多性能和效率改进。IPFS更快、更小、更可靠。

    🏃 QUIC

    首先,在网络方面,此版本引入了对QUIC协议的实验支持。QUIC是一种新的基于UDP的网络传输,它解决了TCP中许多长期问题。

    对我们来说,这意味着(最终):

    • 更少的本地资源 - TCP需要每个连接一个文件描述符,而QUIC(和大多数基于UDP的传输)可以在所有连接之间共享单个文件描述符。这应该允许我们更快地拨号,并保持更多连接打开。

    • 更快的连接建立 - 当包含客户端身份验证时,QUIC具有像TCP一样的三向交握。但是,与TCP不同,这种交握使我们从0到完全加密、经过身份验证和多路复用的连接。理论上(尚未实践),这应该显着减少DHT查询的延迟,这将改善许多IPFS操作,如添加和获取大量数据。

    • 在有损网络上表现的更好 - 当通过单个TCP连接复用多个请求时,单个丢弃的数据包,将在重新传输数据包时使整个连接停止。但是,由于QUIC在内部处理多路复用,因此丢弃单个数据包只会影响相关的流。

    • 更好的NAT遍历 - NAT穿孔非常容易,并且在许多情况下,与UDP相比,使用TCP更可靠。

    但是,我们还有很长的路要走。虽然我们鼓励用户对此进行测试,但IETF QUIC协议仍在积极发展,并将进一步发生变化。

    📨 Pubsub

    go-ipfs现在支持gossipsub路由算法和消息签名。

    gossipsub路由算法比目前的floodsub路由算法更高效。更好的是,它完全向后兼容,因此你可以启用它,并且可以仍然使用floodsub算法与节点通信。你可以通过链接找到在go-ipfs中启用gossipsub的说明 。(https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#gossipsub)

    消息现在由发起人签名。虽然现在默认启用签名,但是为了避免破坏现有应用程序,严格的签名验证尚未且不会针对至少一个版本(可能是多个版本)。可以在通过链接阅读有关如何配置此功能的信息。(https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#message-signing)

    🎛 命令更改

    就新玩具而言,此版本引入了:1、ipfs cid使用CID 的子命令;2、完全重构的ipfs p2p命令;3、流式名称解析;4、内联块支持。

    1、 ipfs cid

    新的ipfs cid命令允许用户检查CID,并在各种格式和版本之间进行转换。下面是一些例子:

    Print out the CID metadata (prefix)> ipfs cid format -f %P QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
    cidv0-protobuf-sha2-256-32# Get the hex sha256 hash from the CID.> ipfs cid format -b base16 -f '0x%D' QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o0x46d44814b9c5af141c3aaab7c05dc5e844ead5f91f12858b021eba45768b4c0e# Convert a base58 v0 CID to a base32 v1 CID.> ipfs cid base32 QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
    bafybeicg2rebjoofv4kbyovkw7af3rpiitvnl6i7ckcywaq6xjcxnc2mby

    2 、ipfs p2p

    重构ipfs p2p命令允许通过两个IPFS节点,从一个主机转发到另一个主机的TCP流。这是ssh -L,但使用于IPFS的。 它仍处于试验阶段,但是我们不希望在这一点之后会有太多的突破性变化(很可能在下一个版本中稳定下来)。

    以下是此版本中重大更改的快速摘要:

    • 在接受单个连接后,我们不会停止侦听本地(转发)连接。

    • ipfs p2p stream ls 输出现在返回更多有用的输出,第一个地址始终是发起方地址。

    • ipfs p2p listener ls 重命名为 ipfs p2p ls

    • ipfs p2p listener close 重命名为 ipfs p2p close

    • 协议名称必须以/x/为前缀,/p2p/现在只作为处理程序名称传递给libp2p。以前的版本是在“引擎盖”下使用/p2p/前缀 。有一个--allow-custom-protocol标志允许你使用任何libp2p处理程序名称。

    • ipfs p2p listener open 被重命名为 ipfs p2p listen

    • ipfs p2p stream dial 被重命名为 ipfs p2p forward

    以下是连接远程IPFS节点的WebUI的快速示例:

    On the 'remote' IPFS host> ipfs id -f "<id>\n"QmSiXjrYwLmDhRvAb3vK2TUP8W2pTDd34MhgCwpanVjdNT# Configure the p2p listener on the remote IPFS instance:> ipfs p2p listen /x/kickass/1.0 /ip4/127.0.0.1/tcp/5001# On the 'local' IPFS host# Configure the p2p forwarder on the local host:> ipfs p2p forward /x/kickass/1.0 /ip4/127.0.0.1/tcp/5551 /ipfs/QmSiXjrYwLmDhRvAb3vK2TUP8W2pTDd34MhgCwpanVjdNT# Voila - point your browser at http://localhost:5551/webui to inspect your remote

    3、ipfs name resolve流式响应

    现在有一个新的标志ipfs name resolve- --stream。当使用标志集调用该命令时,它将在DHT和其他路由机制中,发现它们后立即开始返回结果。这使得某些应用程序被发现仍在运行时开始预取/显示数据。请注意,在找到并返回最新记录之前,该命令可能会返回许多过时的记录。但是,它总是会返回有效记录(即使有点过时)。

    4、ipfs add内联块支持

    在之前的版本中,我们添加了对提取内联到CID块的支持。在此版本中,我们添加了对创建这些CID的支持。现在ipfs add,你可以使用--inline标志将长度小于或等于32字节的内联块运行到CID中,而不是写入实际块。这应该会显着减少,具有许多空目录和小文件的文件系统树的大小。

    🌐 WebUI

    此版本包括最新的webui。可以通过安装go-ipfs并访问 http:// localhost:5001 / webui 来查看它。

    0_1542080028620_e3f0cbb5-dd27-4fc0-857c-10455699bbac-image.png

    0_1542080061383_8300874b-d0f3-45b2-91eb-b47efe6f61fe-image.png

    在此感谢webui团队!👏

    ⚡️ 表现

    此版本包括一些重要的性能改进,包括资源利用率和速度,特别是在传输大量小文件(或块)时。这一部分将介绍一些技术细节,如果你只是寻找闪亮的新功能,请随时跳过它。

    资源利用率

    在这个版本中,我们已经:(a)修复了libp2p中的慢速内存泄漏;(b)显著减少了分配负载。这些都可以提高内存和CPU使用率。

    0_1542080090513_1fcb536a-a757-4974-951d-58f56e3c9f89-image.png

    以上是我们的IPFS网关节点在GC中花费的时间图。在底部看到令人敬畏的浅蓝色线条?这是运行0.4.18的节点。IKR?

    0_1542080110191_da98de3c-0ba0-4a3f-ab36-f3e1a94055c9-image.png

    这张执行时间图表具有更大的可变性,但改进仍然很明显。

    数据结构

    我们已经更改了两个最常用的数据结构,CID和Multiaddrs,以减少分配负载。

    首先,我们现在将CID 编码为字符串,而不是在结构中(在指针后面)进行解码。除了更紧凑之外,我们的Cid类型现在是一个有效的map键,因此我们不再需要,每次想要在map / set中使用它们时对CID进行编码。将CID插入到映射/集中时,分配在重负载下显示为重要的分配来源,因此此更改应该可以提高内存使用率。

    其次,我们已经改变了许多multiaddr解析/处理/格式化函数以减少分配。我们DHT相关工作的大部分内容包括处理多个数据包,因此在大量使用DHT时会降低CPU利用率。

    Streams和Yamux

    Streams一直困扰着我们的内存利用率。这部分通过引入连接管理器来解决,将我们的最大连接数保持在合理的数量,但它们仍然是主要的内存接收器。

    通过此版本看到了两项改进:

    • 识别中的内存泄漏已得到修复。这缓慢的导致我们泄漏连接(锁定连接流使用的内存)。

    • Yamux流现在使用缓冲池支持,自动收缩读取缓冲区。之前,这个读缓冲区将增长到它的最大大小(几兆字节)并且永不缩小,但现在这些缓冲区会在它们被清空时收缩并有效释放空间。

    Bitswap性能

    由于ipfs / go-bitswap#5,Bitswap现在将把多个小块打包成一个消息 。虽然这在传输大文件(使用大块)时无济于事,但在传输许多小文件时会有所帮助。

    🛠 重构和努力

    这个版本还看到了另一个命令库重构,朝向CoreAPI工作,迈向可靠的base32 CID支持的第一步。

    命令Lib

    我们已经完全重构了我们的命令库(再次)。虽然它仍然需要相当多的工作,但它现在需要更少的样板,并且应该更加强大。重构立即发现两个破坏的测试,并且在正确返回和处理错误时,修复了相当多的错误。

    CoreAPI

    CoreAPI是一种与Go交互的IPFS新方法。虽然它仍然不是最终版,但你现在可以通过CLI或HTTP接口完成的大部分工作,都可以通过新API完成。

    目前只有Go实现存在,但是有计划很快通过HTTP公开新的API。我们还在研究为此API创建RPC接口,这有助于在一些用例中的性能实现。

    你可以在 https://github.com/ipfs/go-ipfs/issues/4498 中跟踪进度

    CIDv1 / Base32迁移

    我们正在继续努力将默认CID格式升级到Base32,同时保留与现有CID的兼容性。我们需要此更改来提高浏览器中IPFS内容的安全性。目前,IPFS通常通过浏览,在浏览器中使用https://SOME_GATEWAY/ipfs/CID/...。这种方法有两个明显的缺点:

    • 从浏览器安全角度来看,所有IPFS“站点”都将位于同一个源(SOME_GATEWAY)下。

    • 从UX的角度来看,这并不是非常“原生”(即使网关是本地IPFS节点)。

    为了解决安全问题,我们打算将IPFS网关链接切换 https://ipfs.io/ipfs/CID到https://CID.ipfs.dweb.link。这样,CID将成为“原点”的一部分, 因此每个IPFS网站将获得单独的安全原点。

    为了解决UX问题,我们一直致力于ipfs://CID/... 通过我们的ipfs-companion附加组件,和Mozilla的一些新的实验性扩展API,添加对Web浏览器的支持。这与将CID放在URL原点中具有相同的效果,但具有查看“native本机”的额外好处。

    不幸的是,原点必须不区分大小写。目前,最常见的CID是CIDv0 CID(那些以Qm开头的CID Qm),它们始终是 base58编码的,因此区分大小写。

    幸运的是,CIDv1(最新的CID格式)支持使用多基础标准的任意基础 。不幸的是,IPFS始终将等效的CIDv0和CIDv1 CID视为不同。这意味着使用等效的CIDv1无法查找使用CIDv0 CID(默认值)添加的文件。

    此版本通过引入两个功能在解决此问题方面取得了一些重大进展:

    1)前面提到的ipfs cid base32命令,用于将CID转换为域名所需的不区分大小写的编码。此命令将现有的base58 CIDv0,转换为使用base32编码的CIDv1。

    2)允许使用等效的CIDv1 CID(或反向),本地查找与CIDv0 CID相关联的块的hack。此hack最终将被替换为多哈索引的块存储,该存储对CID版本和多代码内容类型都是不可知的。

    📋 完整的更新日志

    与往常一样,您可以在ipfs / go-ipfs的Github存储库中找到完整的(大规模)更新日志:https://github.com/ipfs/go-ipfs/blob/master/CHANGELOG.md#go-ipfs-changelog- 1

    🙌 贡献

    你想帮助go-ipfs项目吗?

    ⁉️ 疑问

    有关IPFS的问题,比如说它的工作原理?以及使用它可以做些什么?了解这些问题最好的地方是 discuss.ipfs.io

    版本发布更新发表于IPFS官方博客,经Filecoin中国社区翻译整理。

    识别二维码进入IPFS-Filecoin社群

    0_1542080163678_ec3dd385-bf03-4f39-9a8a-d1b7d46c244e-image.png

登录后回复
 

加微信进群交流

与 Filecoin中国社区 的连接断开,我们正在尝试重连,请耐心等待