主页 > imtoken华为 > 比特币核心开发人员迈克尔福特:BTC 核心构建系统的最新改进

比特币核心开发人员迈克尔福特:BTC 核心构建系统的最新改进

imtoken华为 2023-01-17 13:17:23

概述

构建系统是比特币核心代码库中吸引力较小但重要的部分。它控制代码的配置和编译方式,以及代码如何与其依赖项交互比特币钱包大小,这有助于我们构建一个完全可复制的二进制文件,许多比特币用户可以运行。

在这篇文章中比特币钱包大小,我将快速讨论我最近参与的一些构建系统更改,其中大部分是 Bitcoin Core 0.20.0 版本的一部分。

弃用 BIP70

自比特币核心移除 BIP70 支持以来已经有很长时间了。有很多文章总结了它的问题,这里就不赘述了,只说它包括安全漏洞、隐私问题和实现之间的不兼容。BIP70 也是代码库中需要 OpenSSL 的最后一部分,因此无法将其移除。可以在 GitHub 评论中找到对上述内容的一个很好的总结。

从任何项目中删除传出功能通常需要多个阶段,从比特币核心钱包中删除功能也不例外。2018 年 10 月,拉取请求 #14451 基于前一年提出的代码 #11622,使得在构建比特币核心钱包时禁用 BIP70 成为可能。但是,它作为 0.18.0 的一部分保留在二进制版本中。

此后不久,在 #15584 中,默认情况下禁用了 BIP70 支持,这意味着任何构建比特币核心钱包的人都必须在编译时选择使用“-enable-bip70”。默认情况下禁用 BIP70 是最新 0.19.0 版本的一部分,以及 GUI 警告和尽可能切换到 BIP21URL 的建议。

移除 BIP70

建议在 #17165 中从比特币核心钱包中删除 BIP70。PR 移除了我们功能的依赖,OpenSSL 使用与 X509 相关,需要将 OpenSSL 链接到 GUI,总共大约 2000 行代码。在后续请求#17730 中,还可以从比特币核心钱包中删除几乎所有 Qt 的内部网络功能;但是,Windows 版本的问题阻止了它们被完全删除。删除 BIP70 是删除 OpenSSL 之前需要完成的最后步骤之一。

随机的.cpp

Random.cpp 维护一个内部 RNG(随机数生成器),它从许多不同的来源获取熵,包括硬件、操作系统和历史上的 OpenSSLs RNG。在移除 OpenSSL 之前,决定添加 Bitcoin Core 的随机数生成器,以确保它会从环境中获取额外的熵(时间、性能数据、系统配置等),其中还包括 OpenSSL 以前使用的一些来源。这是在#17270 中完成的。另外两个获取请求通过删除对 RAND_screen() #17191 和 RAND_event() #17151 的调用删除了一些 OpenSSL 的随机数生成器种子。

删除 OpenSSL

此时,可以从项目中删除所有剩余的 OpenSSL 用法,这在 #17265 和 #17515 中完成;这些更改将成为 Bitcoin Core 0.20.0 版本的一部分。OpenSSL 长期以来一直是错误、紧急版本和性能问题的来源。它的共识关键用法(签名验证)早已被 secp256k1 库所取代,该库由比特币核心开发人员开发,以解决 OpenSSL 作为版本 0 的比特币核心 0.12. 的一部分的缺点。

减少对 Apple OS 的依赖

我参与的其他与构建系统相关的工作更多是针对 macOS 的,包括减少我们的 macOS 二进制文件链接的动态库的数量。与 0.19.0 相比,使用最新代码库的 Apple OS 二进制文件(将在即将发布的 0.20.0 版本中构建)链接到六个动态库被减少了。我们不再链接的库包括 DiskArbitration、Security、SystemConfiguration、OpenGL、AGL 和 CFNetwork。

其中一些库尚未使用,但在构建过程中仍然链接。在 #17663 中引入 -dead_strip_dylibs 链接器标志后,它们被删除。Qt 已经引入了诸如 OpenGL 或 D-Bus 之类的其他功能,但最终并未使用,可以通过更改我们的 Qt 构建配置来删除(请参阅#17521 和#17676) 了解这些更改。

提高苹果操作系统的安全性

在努力减少 Apple OS 依赖项的数量之后,似乎有必要确保我们不会不必要地重新引入这些依赖项。#17863 已打开以添加 Apple OS 动态库检查(在 Linux 中完成)作为构建过程的一部分。#17787 向我们的 security-check.py 脚本添加了 PIE(位置无关的可执行文件)和 NOUNDEFS(没有未定义的引用)。

总结

以下是我最近参与的一些构建系统工作的简要高级概述。结果,如果仅通过减少攻击面,比特币核心钱包存储库(不是比特币)中的代码更少,比特币和比特币-qt 的构建依赖性更弱,可执行文件大小更小,安全性也得到了提高。

这里的大部分工作都是通过之前无数小时的工作以及许多其他比特币核心贡献者的审查完成的。我特别要感谢 Cory Fields 对我的许多构建系统工作的帮助和指导。

Michael Ford,比特币核心开发者