go-ipfs 0.4.21发布

2019-06-10 17:32:39

我们很高兴宣布go-ipfs 0.4.21。此版本有一些关键的错误修复和一些新功能,因此每个用户都应升级。

关键错误修复,实验性TLS1.3支持,减少内存使用,base32 CIDv1 CID等等!


image.png

我们很高兴宣布go-ipfs 0.4.21。此版本有一些关键的错误修复和一些新功能,因此每个用户都应升级。

关键错误修复:

· 打开文件描述符太多/同行太多(6237)。

· 同时添加多个文件不起作用(6254)。

· CPU利用率峰值然后保持在100%(5613)。

主要特点:

· 实验性TLS1.3支持(最终取代secio)。

· OpenSSL支持SECIO握手(性能改进)。

重要说明:此版本修复了我们的安全传输中可能会从通道中丢弃数据的错误。注意:此问题不会影响第三方攻击者的隐私和数据完整性。只有向我们发送数据的对等方才能触发此错误。

️ 所有用户必须升级。️我们打算在此版本中引入一个功能,不幸的是,它可靠地触发了这个bug。为了避免对网络进行分区,我们决定将此功能推迟一两个版本。

具体来说,我们将提供至少一个月的升级期。之后,我们将开始测试部署建议更改的影响。

如果您正在构建单独的应用程序或使用分叉的go-ipfs,请确保将github.com/libp2p/go-libp2p-secio升级到至少 v0.0.3。

此版本包含许多关键错误修复和性能/可靠性增强功能。

添加多个文件时出错

最后一个版本打破了简单命令ipfs add file1 file2。事实证明,我们只是缺少一个测试用例。现在已经解决了这两个问题(错误和缺少测试用例)。

SECIO

如上所述,我们修复了一个错误,该错误可能导致数据在读取时从SECIO连接中删除。具体来说,这发生在:

1. 读缓冲区的容量大于长度。

2. 远程对等体在单个secio“帧”中发送的长度超过了长度但小于容量。

在这种情况下,我们将读取缓冲区填充到其容量而不是其长度。

打开文件太多,同行太多等

Go-ipfs在累积太多连接时自动关闭最不实用的连接。不幸的是,一些中继连接阻塞Close()了整个过程。

失控CPU使用率

许多用户注意到此版本失控的CPU使用率。对于DHT如何处理提供者记录(记录哪些同伴拥有哪些内容的记录),这是一个长期存在的问题:

1. 在提供者集完全清空之前,它不会删除内容的提供者记录。

2. 每当我们更新提供者集时,它就会将每个提供者记录加载到内存中。

结合起来,这两个问题正在破坏提供者记录缓存,迫使DHT重复加载和丢弃提供者记录。

更可靠的连接管理

ip-ipfs资源不足时,Go-ipfs有一个名为“连接管理器”的子系统来关闭最不实用的连接。

不幸的是,其他IPFS子系统可能会在连接管理器之前了解连接。以前,如果某个IPFS子系统在连接管理器了解连接之前尝试将连接标记为有用,则连接管理器将丢弃此信息。我们认为这导致6271它不再那样做了

改进的Bitswap连接管理

Bitswap现在使用连接管理器将所有下载块的对等体标记为重要(下载时)。此前,它不仅标志着从同行正在下载块。

减少内存使用量

此版本中最显着的内存减少来自修复连接关闭。但是,我们进行了一些额外的改进:

· Bitswap的“工作队列”不再记得它无限期看到的每个同伴。

· peertore现在实现协议名称。

· 每个对等的goroutine计数已减少。

· DHT现在通过汇集缓冲的写入器并在不主动使用它们时将它们返回到池中,从而浪费了空闲对等体上较少的内存。

增加文件描述符限制

默认文件描述符限制已提升到8192(从2048开始)。不幸的是,当go-ipfs用完文件描述符并且使用大量文件描述符时,它的行为很差。

幸运的是,大多数现代内核可以毫无困难地处理数千个文件描述符。

减少连接握手延迟

Libp2p现在通过在远程对等体响应初始握手消息之前开始协议协商来启动连接,从而减少了几次往返。

在最佳情况下(当目标对等方说出我们的首选协议时),这会将握手往返次数从6减少到4(包括TCP握手)。

此版本不会带来任何新命令,但会引入一些更改,错误修正和增强功能。本节很难完成,但它列出了最显着的变化。

请注意:此版本还引入了一些重大更改。

[DEPRECATION] URLStore命令已弃用

ipfs urlstore现在不推荐使用实验命令。请ipfs add --nocopy URL改用。

[BREAKING] DHT命令Base64编码值

响应ipfs dht get命令时,守护程序现在使用base64对返回的值进行编码。该ipfs命令将在将该值返回给用户之前自动解码该值,因此此更改应仅影响直接使用HTTP API的那些值。

不幸的是,这种更改是必要的,因为DHT记录是任意二进制blob,不能直接存储在JSON字符串中。

[BREAKING] Base32编码的v1 CID默认情况下

js-ipfs和go-ipfs现在默认使用base32编码CIDv1 CID,而不是base58。不幸的是,base58区分大小写并且与浏览器不兼容(参见4143

人类可读数字

ipfs bitswap stat和和ipfs object stat命令现在支持--humanize与人类可读的单元(GIB,MIB等)格式的数字标记。

改进了错误

此版本改进了两种类型的错误:

1. 采用路径/多路径的命令现在在错误消息解析时无法包含路径/ multiaddr。

2. ipfs swarm connect 现在返回一个详细的错误,描述了尝试了哪些地址以及拨号失败的原因。

Ping改进

ping命令已收到一些小的改进和修复:

1. 现在,它在退出时以非零退出状态退出。

2. 如果我们有一个僵尸但是没有功能连接到对等端被ping(6298),它就不会成功ping成功。

3. 它现在打印出取消时的平均延迟^C(如unix ping命令)。

改进的帮助文本

Go-ipfs现在可以智能地包装帮助文本,以便于阅读。在80字符宽的终端上,

之前

USAGE

  ipfs add <path>... - Add a file or directory to ipfs.

SYNOPSIS

  ipfs add [--recursive | -r] [--dereference-args] [--stdin-name=<stdin-name>] [

--hidden | -H] [--quiet | -q] [--quieter | -Q] [--silent] [--progress | -p] [--t

rickle | -t] [--only-hash | -n] [--wrap-with-directory | -w] [--chunker=<chunker

> | -s] [--pin=false] [--raw-leaves] [--nocopy] [--fscache] [--cid-version=<cid-

version>] [--hash=<hash>] [--inline] [--inline-limit=<inline-limit>] [--] <path>

...

ARGUMENTS

  <path>... - The path to a file to be added to ipfs.

OPTIONS

  -r,               --recursive           bool   - Add directory paths recursive

ly.

  --dereference-args                      bool   - Symlinks supplied in argument

s are dereferenced.

  --stdin-name                            string - Assign a name if the file sou

rce is stdin.

  -H,               --hidden              bool   - Include files that are hidden

. Only takes effect on recursive add.

  -q,               --quiet               bool   - Write minimal output.

  -Q,               --quieter             bool   - Write only final hash.

  --silent                                bool   - Write no output.

  -p,               --progress            bool   - Stream progress data.

  -t,               --trickle             bool   - Use trickle-dag format for da

g generation.

  -n,               --only-hash           bool   - Only chunk and hash - do not

write to disk.

  -w,               --wrap-with-directory bool   - Wrap files with a directory o

bject.

  -s,               --chunker             string - Chunking algorithm, size-[byt

es] or rabin-[min]-[avg]-[max]. Default: size-262144.

  --pin                                   bool   - Pin this object when adding.

Default: true.

  --raw-leaves                            bool   - Use raw blocks for leaf nodes

. (experimental).

  --nocopy                                bool   - Add the file using filestore.

 Implies raw-leaves. (experimental).

  --fscache                               bool   - Check the filestore for pre-e

xisting blocks. (experimental).

  --cid-version                           int    - CID version. Defaults to 0 un

less an option that depends on CIDv1 is passed. (experimental).

  --hash                                  string - Hash function to use. Implies

 CIDv1 if not sha2-256. (experimental). Default: sha2-256.

  --inline                                bool   - Inline small blocks into CIDs

. (experimental).

  --inline-limit                          int    - Maximum block size to inline.

 (experimental). Default: 32.

USAGE

  ipfs add <path>... - Add a file or directory to ipfs.

SYNOPSIS

  ipfs add [--recursive | -r] [--dereference-args] [--stdin-name=<stdin-name>]

           [--hidden | -H] [--quiet | -q] [--quieter | -Q] [--silent]

           [--progress | -p] [--trickle | -t] [--only-hash | -n]

           [--wrap-with-directory | -w] [--chunker=<chunker> | -s] [--pin=false]

           [--raw-leaves] [--nocopy] [--fscache] [--cid-version=<cid-version>]

           [--hash=<hash>] [--inline] [--inline-limit=<inline-limit>] [--]

           <path>...

ARGUMENTS

  <path>... - The path to a file to be added to ipfs.

OPTIONS

  -r, --recursive            bool   - Add directory paths recursively.

  --dereference-args         bool   - Symlinks supplied in arguments are

                                      dereferenced.

  --stdin-name               string - Assign a name if the file source is stdin.

  -H, --hidden               bool   - Include files that are hidden. Only takes

                                      effect on recursive add.

  -q, --quiet                bool   - Write minimal output.

  -Q, --quieter              bool   - Write only final hash.

  --silent                   bool   - Write no output.

  -p, --progress             bool   - Stream progress data.

  -t, --trickle              bool   - Use trickle-dag format for dag generation.

  -n, --only-hash            bool   - Only chunk and hash - do not write to

                                      disk.

  -w, --wrap-with-directory  bool   - Wrap files with a directory object.

  -s, --chunker              string - Chunking algorithm, size-[bytes] or

                                      rabin-[min]-[avg]-[max]. Default:

                                      size-262144.

  --pin                      bool   - Pin this object when adding. Default:

                                      true.

  --raw-leaves               bool   - Use raw blocks for leaf nodes.

                                      (experimental).

  --nocopy                   bool   - Add the file using filestore. Implies

                                      raw-leaves. (experimental).

  --fscache                  bool   - Check the filestore for pre-existing

                                      blocks. (experimental).

  --cid-version              int    - CID version. Defaults to 0 unless an

                                      option that depends on CIDv1 is passed.

                                      (experimental).

  --hash                     string - Hash function to use. Implies CIDv1 if

                                      not sha2-256. (experimental). Default:

                                      sha2-256.

  --inline                   bool   - Inline small blocks into CIDs.

                                      (experimental).

  --inline-limit             int    - Maximum block size to inline.

                                      (experimental). Default: 32.

✨功能

此版本主要是一个错误修复版本,但它仍然包含libp2p的两个不错的功能。

Go-ipfs现在具有实验性的TLS1.3支持。目前,libp2p(IPFS的网络库)使用我们称为SECIO的自定义TLS协议。然而,关于定制安全传输的传统观点是“只是不”,所以我们正在努力用TLS1.3替换它

要默认选择此协议,请设置Experimental.PreferTLSconfig变量:

> ipfs config --bool Experimental.PreferTLS true

为什么TLS1.3而不是X(噪音等)?

1. Libp2p允许协商传输,因此没有理由不为libp2p添加噪声支持。

2. TLS具有广泛的语言支持,这使得为新语言实现libp2p变得更加简单。

Go-ipfs现在(可选)可以使用OpenSSL支持构建,以便在建立连接时提高性能。这主要用于每秒接收多个入站连接的节点。

要启用openssl支持,请使用以下命令重建go-ipfs:

> make build GOFLAGS=-tags=openssl

CoreAPI重构仍在进行中,我们在可用的ipfs-as-a-library构造函数方面取得了重大进展。具体来说,我们已经集成了fx依赖注入系统,现在正在努力清理我们的初始化逻辑。这样可以更容易地将新服务注入到go-ipfs进程中,而不会破坏核心内部。

构建:GOCC环境变量

构建系统现在使用GOCC环境变量,允许在构建期间使用特定的go版本。

❤️非常感谢大家让这个版本成为可能

向参与此版本的所有贡献者致敬(包括对ipld,libp2p和多格式的贡献):

贡献者

提交

线±

文件已更改

史蒂文艾伦

220

+ 6078 / -4211

520

ŁukaszMagiera

53

+ 5039 / -4557

274

vyzo

179

+ 2929 / -1704

238

劳尔·克里帕拉尼

44

+ 757 / -1895

134

hannahhoward

11

+ 755 / -1005

49

Marten Seemann

16

+ 862 / -203

44

keks

10

+ 359 / -110

12

简温克尔曼

8

+ 368 / -26

16

Jakub Sztandera

4

+ 361 / -8

7

阿德里安兰扎法梅

1

+ 287 / -18

Erik Ingenito

4

+ 247 / -28

8

里德'arrdem'McKenzie

1

+ 220 / -20

3

Yusef Napora

26

+ 98 / -130

26

迈克尔阿维拉

3

+ 116 / -59

8

Raghav Gulati

13

+ 145 / -26

13

TG

1

+ 41 / -33

1

马特乔伊纳

6

+ 41 / -30

7

科尔布朗

1

+ 37 / -25

1

Dominic Della Valle

2

+ 12 / -40

4

Overbool

1

+ 50 / -0

2

克里斯托弗·比瑟

3

+ 29 / -16

10

myself659

1

+ 38 / -5

2

亚历克斯布朗

3

+ 30 / -8

3

jmank88

1

+ 27 / -4

2

维克拉姆

1

+ 25 / -1

2

MollyM

7

+ 17 / -9

7

Marcin Rataj

1

+ 17 / -1

1

requilence

1

+ 11 / -4

1

Teran McKinney

1

+ 8 / -2

1

奥利埃文斯

1

+ 5 / -5

1

Masashi Salvador Mitsuzawa

1

+ 5 / -1

1

chenminjian

1

+ 4 / -0

1

埃德加李

1

+ 3 / -1

1

德克麦考密克

1

+ 2 / -2

2

IA

1

+ 1 / -1

1

艾伦肖

1

+ 1 / -1

1

您是否愿意为IPFS项目做出贡献而不知道如何做?好吧,有几个地方你可以开始:

· 检查go-ipfs repo中help wanted标签的问题

· 加入IPFS All Hands,自我介绍并告诉我们您想要贡献的地方 - https://github.com/ipfs/team-mgmt/#weekly-ipfs-all-hands

· IPFS攻击并告诉我们你做了什么!All Hands电话也是演示的完美场所,加入并向我们展示您的建设

· 加入http://discuss.ipfs.io/的讨论,帮助用户找到答案。

· 加入Go Core开发团队每周同步并成为行动的一部分!

⁉️你有问题吗?

有关IPFS的问题,工作原理以及使用它可以做些什么的最好的地方是discuss.ipfs.io。我们也可以在#ipfsFreenode 的频道上找到。

评论

最新推荐