2019-06-10 17:32:39
我们很高兴宣布go-ipfs 0.4.21。此版本有一些关键的错误修复和一些新功能,因此每个用户都应升级。
关键错误修复,实验性TLS1.3支持,减少内存使用,base32 CIDv1 CID等等!
我们很高兴宣布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连接中删除。具体来说,这发生在:
1. 读缓冲区的容量大于长度。
2. 远程对等体在单个secio“帧”中发送的长度超过了长度但小于容量。
在这种情况下,我们将读取缓冲区填充到其容量而不是其长度。
Go-ipfs在累积太多连接时自动关闭最不实用的连接。不幸的是,一些中继连接阻塞Close()了整个过程。
许多用户注意到此版本失控的CPU使用率。对于DHT如何处理提供者记录(记录哪些同伴拥有哪些内容的记录),这是一个长期存在的问题:
1. 在提供者集完全清空之前,它不会删除内容的提供者记录。
2. 每当我们更新提供者集时,它就会将每个提供者记录加载到内存中。
结合起来,这两个问题正在破坏提供者记录缓存,迫使DHT重复加载和丢弃提供者记录。
当ip-ipfs资源不足时,Go-ipfs有一个名为“连接管理器”的子系统来关闭最不实用的连接。
不幸的是,其他IPFS子系统可能会在连接管理器之前了解连接。以前,如果某个IPFS子系统在连接管理器了解连接之前尝试将连接标记为有用,则连接管理器将丢弃此信息。我们认为这导致#6271。它不再那样做了。
Bitswap现在使用连接管理器将所有下载块的对等体标记为重要(下载时)。此前,它不仅标志着从同行它正在下载块。
此版本中最显着的内存减少来自修复连接关闭。但是,我们进行了一些额外的改进:
· Bitswap的“工作队列”不再记得它无限期看到的每个同伴。
· peertore现在实现协议名称。
· 每个对等的goroutine计数已减少。
· DHT现在通过汇集缓冲的写入器并在不主动使用它们时将它们返回到池中,从而浪费了空闲对等体上较少的内存。
默认文件描述符限制已提升到8192(从2048开始)。不幸的是,当go-ipfs用完文件描述符并且使用大量文件描述符时,它的行为很差。
幸运的是,大多数现代内核可以毫无困难地处理数千个文件描述符。
Libp2p现在通过在远程对等体响应初始握手消息之前开始协议协商来启动连接,从而减少了几次往返。
在最佳情况下(当目标对等方说出我们的首选协议时),这会将握手往返次数从6减少到4(包括TCP握手)。
此版本不会带来任何新命令,但会引入一些更改,错误修正和增强功能。本节很难完成,但它列出了最显着的变化。
请注意:此版本还引入了一些重大更改。
ipfs urlstore现在不推荐使用实验命令。请ipfs add --nocopy URL改用。
响应ipfs dht get命令时,守护程序现在使用base64对返回的值进行编码。该ipfs命令将在将该值返回给用户之前自动解码该值,因此此更改应仅影响直接使用HTTP API的那些值。
不幸的是,这种更改是必要的,因为DHT记录是任意二进制blob,不能直接存储在JSON字符串中。
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命令已收到一些小的改进和修复:
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环境变量,允许在构建期间使用特定的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 的频道上找到。