该报告更新了 0xB10C、 Coinbase 加密社区基金赠款接受者,在他为期一年的比特币开发补助金的上半年一直致力于。这特别涵盖了他在用户空间、对比特币核心的静态定义跟踪支持方面的工作。

通过 0xB10C,Coinbase 比特币开发者赠款接受者
比特币协议规则的参考实现 Bitcoin Core 是与比特币网络交互使用最广泛的软件。然而,对于大多数用户来说,比特币核心是一个黑匣子。虽然可以通过 RPC 接口查询信息或在调试日志中搜索信息,但没有定义的接口用于实时洞察进程内部。然而,一些用户可以从更多的可观察性中受益于他们的节点。在生产中运行比特币核心的爱好者和公司希望将他们的节点包含在他们的实时监控中。开发人员需要了解测试部署,以评估、审查、调试和基准测试更改。研究人员希望观察和分析点对点网络上节点的行为。处理大量比特币的交易所和其他服务希望及早发现攻击和其他异常情况。
使用用户空间窥视内部,静态定义的跟踪
这 eBPF Linux 内核中存在的技术可用于对用户空间应用程序的可观察性。该技术允许在 Linux 内核中运行一个小的沙盒程序,它可以连接到正在运行的进程中的预定义跟踪点。一旦挂钩到跟踪点,每次到达跟踪点时都会执行程序。跟踪点可以传递数据,例如应用程序状态。跟踪脚本可以进一步处理数据。在用户空间应用程序中挂钩跟踪点的做法被称为用户空间,静态定义的跟踪 (USDT)。例如,这些跟踪点也包含在 PostgreSQL、MySQL、Python、NodeJS、Ruby、PHP 以及 libc、libpthread 和 libvirt 等库中。
比特币核心用户可以利用静态跟踪点,希望对其节点有更多的了解。添加 USDT 支持 不需要侵入性的改变,并且无需编写自定义工具。不使用时,跟踪点的性能影响最小甚至不存在。只有特权进程才能挂钩到跟踪点,不会向主机上的其他进程泄漏信息。这些属性使用户空间静态定义跟踪非常适合比特币核心。
例如,我 放置了两个跟踪点 在比特币核心的点对点消息处理代码中。对于每个入站和出站 P2P 消息,跟踪点传递有关对等方、连接和消息的信息。这些数据可以通过跟踪脚本进行过滤和处理。作为演示,我构建了一个 P2P 监视器,可以实时显示两个对等方之间的通信。用户可以在其他脚本旁边找到此脚本 USDT 示例 在比特币核心存储库的 contrib/tracing/ 目录中。
身体[data-twttr-rendered=”true”] {背景颜色:透明;}.twitter-tweet {边距:自动!重要;}
函数 notifyResize(height) {height = height ?高度:document.documentElement.offsetHeight; var 调整大小 = false; if (window.donkey && donkey.resize) {donkey.resize(height);resized = true;}if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe(obj); resized = true;}if (window.location && window.location.hash === “#amp=1” && window.parent && window.parent.postMessage) {window.parent.postMessage({sentinel: “amp”,类型:“嵌入大小”,高度:高度},“*”);}if(window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize){window.webkit.messageHandlers.resize.postMessage(高度); resized = true;}return resized;}twttr.events.bind(‘rendered’, function (event) {notifyResize();}); twttr.events.bind(‘resize’, function (event) {notifyResize();}); if (parent && parent._resizeIframe) {var maxWidth = parseInt(window.frameElement.getAttribute(“width”)); if ( 500 < maxWidth) {window.frameElement.setAttribute("width", "500");}}
用户空间的用例,静态定义的跟踪
我列出了一些我考虑过或研究过的用户空间、静态定义跟踪的用例。由于仅合并了三个跟踪点,开发人员有足够的空间来添加新的跟踪点并利用跟踪脚本发挥创意。 问题 #20981 包含有关可以实现的其他跟踪点的讨论和想法。
研究人员和开发人员可以使用 P2P 消息跟踪点来实时监控 P2P 网络异常。一个例子可能是检测最近的 addr 消息泛滥,如本文所述 bitcointalk.org 帖子.这些消息宣布了不属于比特币网络节点的随机 IP 地址。洪水已经 覆盖 由 Grundmann 和 Baumstark 详细介绍。他们讨论了攻击者可以获得连接对等点的数量并了解节点正在侦听的其他地址,包括 Tor 地址。这会降低节点运营商的隐私。重要的是要对这些攻击保持警惕,讨论它们,然后在需要时对它们做出反应。
同样,我一直在用跟踪点检测比特币核心网络地址管理器。 addrman 会跟踪节点建立的潜在出站对等连接的八卦网络地址。它旨在抵御 日食攻击,其中一个节点只与攻击者控制的对等点建立连接。攻击者可以选择向节点提供哪些信息,从而实现双花攻击。当与其他数据结合时,有关 addrman 中地址的信息可能有助于检测日食攻击的累积。
此外,这些 addrman 跟踪点在调试和代码审查期间会很有帮助。为了展示这一点,我构建了一个工具,该工具根据提交给跟踪点的数据将 addrman 数据结构中的地址可视化。
身体[data-twttr-rendered=”true”] {背景颜色:透明;}.twitter-tweet {边距:自动!重要;}
函数 notifyResize(height) {height = height ?高度:document.documentElement.offsetHeight; var 调整大小 = false; if (window.donkey && donkey.resize) {donkey.resize(height);resized = true;}if (parent && parent._resizeIframe) {var obj = {iframe: window.frameElement, height: height}; parent._resizeIframe(obj); resized = true;}if (window.location && window.location.hash === “#amp=1” && window.parent && window.parent.postMessage) {window.parent.postMessage({sentinel: “amp”,类型:“嵌入大小”,高度:高度},“*”);}if(window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.resize){window.webkit.messageHandlers.resize.postMessage(高度); resized = true;}return resized;}twttr.events.bind(‘rendered’, function (event) {notifyResize();}); twttr.events.bind(‘resize’, function (event) {notifyResize();}); if (parent && parent._resizeIframe) {var maxWidth = parseInt(window.frameElement.getAttribute(“width”)); if ( 500 < maxWidth) {window.frameElement.setAttribute("width", "500");}}
Prometheus 指标导出器还可以在跟踪点之上构建,而无需在 Bitcoin Core 中添加额外代码。已经存在基于 RPC 的 Prometheus 导出器和项目,例如 立志.然而,基于 RPC 的导出器受到通过 RPC 接口公开的信息的限制,并且 Statoshi 是一个很大的补丁集,需要在每个比特币核心版本上进行维护。我发布了一个基于 USDT 的实验性导出器,名为 bitcoind-观察者 挂钩到三个当前合并的跟踪点并以 Prometheus 格式提供指标。当前运行使用 USDT 支持编译的比特币核心节点的每个人都可以使用导出器。演示可在 bitcoind.观察者.
已经存在的跟踪点验证:block_connected 可用于对块验证进行基准测试。例如,这允许比较不同补丁之间的初始块下载性能,并有助于检测性能改进和回归。例如, 比特币性能 项目可能会受益于此类跟踪点。我已经使用跟踪点 基准 Martin Ankerls 拉取请求 #22702.如果合并,他提议的更改将显着加快块验证速度并减少内存使用。
下一步
我将收集有关跟踪点的更多想法,并将它们与示例跟踪脚本和更多工具一起实现。这还将涉及与其他比特币和比特币核心开发人员就哪些跟踪点可能对他们的项目有所帮助进行沟通。一个例子是 Antoine Riard 跨层异常检测看门狗 他最初提议将其作为比特币核心的一个新的内部模块。但是,可以通过挂钩到跟踪点来收集许多所需的事件和指标。这意味着看门狗可以是一个外部运行时,这将加快看门狗的开发,并且在比特币核心端需要更少的代码和维护。
如果一切按计划进行,预计在 2022 年初发布的比特币核心 v23.0 版本将包括第一组跟踪点。一个目标是默认在发布版本中启用 USDT 支持,这仍然需要一些工作。此外,tracepoint API 应该是半稳定的,因此需要测试。
简而言之:我一直在向比特币核心添加跟踪点,用户可以连接到这些跟踪点以深入了解内部状态。跟踪点基于 Linux 内核技术,不需要侵入性更改或自定义工具。基础工作已完成。现在可以添加更多跟踪点,并且可以编写工具。
Coinbase 正在正式寻求我们的 2021 年开发者补助金申请,重点是直接为区块链代码库做出贡献的区块链开发者或制作白皮书的研究人员。了解更多关于 在这里打电话申请.
用户空间,对比特币核心的静态定义跟踪支持最初发布在媒体上的 Coinbase 博客中,人们通过突出显示和回应这个故事来继续对话。