CCoins现在变为纯虚接口——本周Bitcoin Core #39

INSIDER 发布于 2026-04-17 阅读 62

本周Bitcoin Core的更新包括:l0rinc将CCoinsView改造为纯虚接口以简化代码理解;pinheadmz改进了HTTP测试以覆盖更多libevent行为,为移除libevent做准备;frankomosh新增了p2p_private_broadcast模糊测试。IRC会议中讨论了性能优化和QML GUI进展,并提及v32版本目标。

bitcoin++ 是一个国际比特币开发者会议系列。“Insider Edition”是我们的新闻编辑室,报道 bitcoin++ 领域内外发生的事件。

上周比特币动态

现在 ccoins 是虚拟的了 - 本周比特币核心 #39

本周,在间隔一段时间后,PR 审查俱乐部再次举行...

大家好 👋,我是 kevkevin。我是一名开源开发者,也是 Insider Edition 的记者。上周,我审查了 Bitcoin Core 仓库中的几个拉取请求。

本周 l0rincCCoinsView 变成了一个纯虚拟类。在合并的 PR 部分了解更多信息。

已合并的 PR
每周,都会有多个变更正式添加到比特币核心中。本周有 10 个变更被合并。以下是我觉得本周比较有趣的一些。

这个改动是对 CCoinsView 接口的改进。这个 PR 的作用是将 CCoinsView 变成一个纯虚拟接口。它引入了 CoinsViewEmpty,这是一个无操作的 coins 视图。我们不再需要声明一个虚拟的 coinsDummy 然后从中创建 CCoinsViewCache,而是可以直接使用 CoinViewEmpty::Get()

以下所有方法都被改为纯虚拟方法:PeekCoinGetCoinHaveCoinGetBestBlockGetHeadBlocksBatchWriteCursorEstimateSize。这个改动还移除了 coins.cpp 中遗留的默认实现。

这是一个重构改动,因此没有对代码库带来功能性的改变,但它确实使与 CCoinsView 的接口变得更直观易懂。重构比特币核心中混乱的代码库,使其更易理解,总是一件好事。

这又是一个帮助移除 Libevent,转而使用我们自己的 HTTP 套接字处理实现的 PR。这个 PR 仅是一个测试改动,更新了 test/functional/interface_http.py 以覆盖更多的 Libevent 行为,这样当迁移完全完成后,就不会有隐藏的 bug 或预期应有的功能缺失。

如果你想及时了解 Libevent 的变更,请关注 跟踪问题

总有一些变更在实时更新和审查中。以下是一些仍在等待审查的值得关注的 PR。

为 ConnectionType::PRIVATE_BROADCAST 添加了一个模糊测试框架。这是一种注重隐私的交易中继机制,其 P2P 代码路径之前没有有意义的模糊测试覆盖。

当前的 process_message 会触及它,但不足以对其进行充分测试。它通过 ConsumeNode() 创建 PRIVATE_BROADCAST 节点,但一些结构性问题阻止它覆盖相关逻辑:

  1. m_tx_for_private_broadcast 从未被播种,PushPrivateBroadcastTx 总是走立即断开连接的路径(7 次偶然命中,全部在第 3559–3562 行)。第 3564–3570 行(实际的 INV 发送)命中次数为 0。

  2. 使用 ALL_NET_MESSAGE_TYPES 作为消息池。CConnman::PushMessage 会静默丢弃私有广播连接允许列表之外的任何内容,浪费了大部分迭代。

  3. 连接类型是随机选择的,因此私有广播的覆盖是偶然的。

为解决上述问题;

  • 该框架显式地构造了 ConnectionType::PRIVATE_BROADCAST 的节点

  • 在对等节点连接之前,通过 InitiateTxBroadcastPrivate 播种 m_tx_for_private_broadcast,以便 PushPrivateBroadcastTx 能够到达交易发送路径

  • 将消息池限制为 CConnman::PushMessage 在私有广播连接上允许的五种类型(VERSION、VERACK、INV、TX、PING)

  • 将 ServiceFlags{NODE_NONE} 传递给 InitializeNode,以匹配 PushNodeVersion 为私有广播对等节点通告的内容。


IRC 会议笔记
每周四都会举行 IRC 会议。以下是该会议的一些简短记录。
<abubakarsadiq> #topic 基准测试工作组更新 (l0rinc, andrewtoth)
<l0rinc> #34124 已合并,感谢各位的审查!
<l0rinc> 基于那里的讨论,我开了 #35078 作为下一步,进行 coins 清理工作。
<l0rinc> #34132 和 #34320 在最近的合并后重新进行了变基——Ubuntu PPA 可能仍然不可用,所以 CI 并不总能通过,但它们已准备好再次接受审查。
<l0rinc> 接下来几天我会参加一个会议,但我想下周再次专注于 #34887 和 #31132。
<l0rinc> 我还在我的 Mac 上使用我们待定的优化重新测量了完整的 reindex-chainstate:它在 1 小时 14 分钟内完成
<l0rinc> 在 Umbrel 上大约 5 小时,完整的 IBD 大约 8-10 小时
<l0rinc> 以上就是我这边的情况——andrewtoth 呢?
<abubakarsadiq> #topic 网络拆分工作组更新 (cfields)
<cfields> 一直在忙其他事情,本周没有更新
<abubakarsadiq> #topic QML GUI 工作组更新 (johnny9dev)
<johnny9dev> 完成了 bitcoin-core/gui-qml#547 中的外部签名器支持。现在正在处理剩余的钱包功能集:bitcoin-core/gui-qml#548、bitcoin-core/gui-qml#550,并设计了一个“钱包设置”页面,将实现备份、密码更改和删除功能。最后,正在修复 bitcoin-core/gui-qml#549 中的一个入门回归更新。
<johnny9dev> 另外,在利用 AI 辅助设计方面取得了很大成功,使用 Figma 和 Christoph 的 Web 原型生成了这些设置页面的一些设计。对此我感到非常兴奋。
<johnny9dev> epicleafies:有什么更新吗?
<johnny9dev> 我没看到他在这里,但他一直专注于完成所有接收功能。
<johnny9dev> 我们现在已经非常接近为核心功能提供某种实现了。
<johnny9dev> 就这些。
<abubakarsadiq> #topic Libevent 移除 (pinheadmz, fjahr)
<pinheadmz> 我认为我们可以将目标定为在 v32 中移除 Libevent。
<pinheadmz> 本周合并了一些好东西。
<pinheadmz> #32061 我将进行变基,然后关闭并重新打开一个新的 PR,整合 hodlinator 和 basil 的最新评论。
<pinheadmz> 哦,是 vasild。
<pinheadmz> 就这些!
<abubakarsadiq> 本周没有预先提出的会议主题。有什么临时议题吗?
<abubakarsadiq> 还有别的事情要讨论吗?
<janb84> pinheadmz:也请看看我的评论,它们是经过手工检查/概念验证的手工制作的。
<pinheadmz> 哦,是的,手工评论。
<pinheadmz> 实际上真的很好。谢谢。

发布

感谢阅读。请务必在下周再次收听,获取比特币核心的最新动态!

如果有任何评论、建议或错误,请随时联系或评论

  • 原文链接: insider.btcpp.dev/p/the-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论