
Bitcoin Core 0.4.6 / 0.6.0.7 修复版发布说明钱包密钥校验、RPC 输入校验与 GUI 稳定性修复全解【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin本篇基于当前仓库中的历史发布说明 release-notes-0.4.6.md完整梳理 Bitcoin Core 0.4.6及同步打标签的 Bitcoin-Qt 0.6.0.7这一轮纯缺陷修复bugfix-only发布的全部修复项涵盖私钥导入校验、加密/解密填充失败检测、区块重复交易检查、JSON-RPC 十六进制输入拒绝、网络死锁规避以及大量 Bitcoin-Qt 界面修复。读完本文你既能掌握该版本每一处修复的技术含义也能在当前代码库中定位到其中多项修复遗留至今的实现痕迹理解这些早期修复如何演化为今日 Bitcoin Core 的对应机制。发布背景与版本说明根据发布说明原文bitcoind 0.4.6 已发布下载提供 Windows 安装包installer、Windows zip含签名 sig与源码 tar.gz 三种形式同时 Bitcoin-Qt 0.6.0.7 与 bitcoind 0.6.0.7 在 git 中打上了标签但官方明确建议直接升级到 0.6.10.6.0.7 更多是历史标签意义。需要特别记住的三条发布声明本轮为纯修复版本These are bugfix-only releases不包含新功能wxBitcoin GUI 停止维护0.4.x 的 wxBitcoin 图形客户端不再被维护和支持。发布说明指出如果有人愿意接手维护 wxBitcoin应联系 Luke-Jr反馈渠道当时的缺陷反馈方式是回复发布对应的论坛帖子forum thread这与今天通过仓库 issue 系统报告问题的方式已经完全不同。修复项全量梳理以下按技术领域对发布说明中的全部修复条目进行分类归纳不遗漏原文档任何一条修复。1. 钱包与密钥安全修复项说明私钥导入合法性校验0.6.0.70.6.0 版本允许导入无效的私钥导入后这些私钥实际上无法用于花费unspendable。0.6.0.7 在导入时会先验证私钥有效性拒绝导入非法私钥加密/解密调用的填充失败检测在 encrypt/decrypt 调用后检查状态以检测 padding填充失败避免把失败的密文解密结果当作有效数据处理私钥导入校验是其中影响面最广的一条在 0.6.0 之前的行为下用户可能把一个格式合法但数学上不是有效 ECDSA 私钥的字符串导入钱包并长期保存而对应的 UTXO 永远无法花费。该修复确立了一个至今仍然成立的原则——任何密钥进入钱包的路径都必须先通过有效性校验。2. 共识与区块校验更早检查区块中的重复交易Fixes #1167把一个区块内包含重复交易duplicate transactions的检测时机提前。重复交易意味着同一笔交易在同一区块中出现两次这既浪费空间也构成规则违规将检查前移可以在进入更耗时的连接connect流程之前快速拒绝该区块。3. RPC 接口与输入校验修复listtransactions的 from/count 参数处理JSON-RPC 方法listtransactions中from与count两个分页参数的处理逻辑存在错误本版本修复拒绝而非误解十六进制参数中的非 ASCII 输入Some non-ASCII input in JSON-RPC expecting hexadecimal may have been misinterpreted rather than rejected——对于期望十六进制字符串的 RPC 参数此前部分非 ASCII 输入可能被误解错误地按某种字符编码转换而不是被明确拒绝。这属于输入校验类修复直接关系 RPC 接口的健壮性与安全边界。4. 网络与并发修复潜在的网络死锁Fix potential networking deadlock规避网络层在特定条件下可能出现的死锁优化并修复是否已知某交易判断的多线程访问Optimize and fix multithreaded access, when checking whether we already know about transactions——对本节点是否已经知道这笔交易这一高频查询路径同时做了性能优化与线程安全修复。5. GUIBitcoin-Qt发布说明中标注 (Bitcoin-Qt) 的条目均为图形客户端修复修复项说明地址已带标签时的标签设置Fixes #1080选择一个已经带有标签的地址时正确设置该标签显示地址设置的误开启不再为并未显式开启 Display addresses 的用户错误地设置该选项绿色对勾green tick状态Fixes #921只有当所有已知区块都下载完毕时才显示已同步的绿色对勾最新状态的时间阈值判断up to date所用的距最新区块的时间阈值从 30 分钟提高到 90 分钟减少因区块间隔波动造成的误报落后失控异常提示当发生 runaway exception未被捕获的失控异常时弹出消息框而不是直接崩溃退出-server未配置 RPC 密码提供-server但没有提供 RPC 密码时用消息框显示错误而非异常RPC 端口绑定失败无法绑定 RPC 端口时显示错误信息而非抛出异常崩溃签名消息的地址提示文本修正签名消息功能中 bitcoin 地址 tooltip 文案Fixes #1050设置对话框补上设置对话框中缺失的 tooltip 与按键快捷键part of #1088QR 码编码失败处理0.6.0.7编码 QR Code 失败时显示错误信息而不是崩溃QR 码对话框标题0.6.0.7没有标签时从 QR Code 对话框标题栏移除 (no label) 字样成熟交易 tooltip移除成熟mature交易 tooltip 中难看的强制换行0.6.0.7其中崩溃改为显示错误信息类修复runaway exception、RPC 端口绑定、QR 编码失败、-server无密码体现了一条清晰的工程方向GUI 客户端必须优雅降级任何可预见的错误都应呈现为错误消息而非进程崩溃。6. 构建、平台与工具链Windows 构建升级至 OpenSSL 1.0.1bUpgrade Windows builds to OpenSSL 1.0.1b跟进当时 OpenSSL 安全更新Growl 1.3 通知支持正确支持 Mac 上 Growl 1.3 版本的桌面通知clang 编译修复绕过boost::program_options中的一个问题该问题导致代码无法在 clang 下编译无符号 char 平台的隐性 bugFixed bugs occurring only on platforms with unsigned characters (such as ARM)——在char默认无符号的平台如 ARM上才触发的缺陷被修复。这类 bug 通常源于把char当有符号数做移位、比较或字节处理是移植性问题的典型代表脚本命名修正Fixes #1099把make_windows_icon.py重命名为.sh因为它实际上是一个 shell 脚本计数/尺寸循环的类型与告警若干内部类型修正统一计数与尺寸循环中使用的类型并消除相关编译告警补充缺失的错误条件检查Missing error condition checking added为若干此前忽略返回值的调用补上错误检查。在当前代码库中验证修复的延续上述修复大多属于 2011 年前后的历史变更但其中几项的修复思想在当前仓库的源码中仍然可以直接找到对应实现可作为交叉验证的依据。1. 90 分钟同步阈值至今仍存在于 GUI 中。发布说明中的Display an error / up-to-date 阈值从 30 分钟提高到 90 分钟其结果直接体现在当前的 src/qt/bitcoingui.cpp 中/** * Maximum gap between node time and block time used * for the Catching up... mode in GUI. */ static constexpr int64_t MAX_BLOCK_TIME_GAP 90 * 60;这个 90×60 秒的常量正是当年修复的数值被保留为 GUI 判断是否处于追赶区块Catching up...模式的最大时间差上限——当年为了避免区块间隔波动导致的误报而放宽的阈值沿用了十余年。2. RPC 十六进制输入的严格校验沿用至今。当年非 ASCII/非十六进制输入应被拒绝而非误解的修复方向在当前 src/rpc/util.cpp 的ParseHexV中仍然可以清楚看到std::vectorunsigned char ParseHexV(const UniValue v, std::string_view name) { std::string strHex; if (v.isStr()) strHex v.get_str(); if (!IsHex(strHex)) throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf(%s must be hexadecimal string (not %s), name, strHex)); return ParseHex(strHex); }即先以IsHex严格判定字符串是否为纯十六进制不是则抛出RPC_INVALID_PARAMETER并回显原始输入。所有需要十六进制数据的 RPC如 src/rpc/rawtransaction.cpp 中的脚本解析、src/rpc/txoutproof.cpp 中的 Merkle 证明解析都通过这类工具函数走同一条拒绝而非猜测的校验路径。3. 重复交易检查仍是区块校验的一部分。当年更早检查区块内重复交易#1167所建立的检查项在当前代码树中依然是共识校验与包策略的一部分区块连接路径的相关逻辑见 src/validation.cpp交易包package层面不得包含 txid 重复的交易的约束则记录在 src/policy/packages.h 的注释中。小结一轮小版本发布的工程价值从今天回看0.4.6 / 0.6.0.7 只是一次没有新功能的修复发布但它浓缩了早期 Bitcoin Core 工程实践中的几个关键原则而这些原则在后续版本中全部被制度化密钥路径的入口校验私钥等敏感数据进入钱包前必须验证有效性杜绝导入成功但永不可用的静默损坏错误必须显式化无论是 crypto 调用的 padding 失败、RPC 端口的绑定失败还是 QR 编码失败都改为检查返回状态 报告错误而不是吞掉错误或直接崩溃输入校验的拒绝优先期望十六进制的参数遇到非法字符时直接报RPC_INVALID_PARAMETER而不是尝试容错解析——当前 src/rpc/util.cpp 的实现即是这一思想的现行版本状态提示要有确定语义GUI 的同步指示绿色对勾、90 分钟阈值只在所有已知区块下载完毕后才呈现已同步避免给用户虚假的安全感。对于研究 Bitcoin Core 演进史或需要在极老版本链上排查问题的开发者而言这份发布说明原文见 doc/release-notes/release-notes-0.4.6.md与同期其他历史发布说明同目录下 doc/release-notes/ 收录了从 0.3.x 到 31.x 的全部版本说明配合使用可以完整追踪每一条修复在代码中的去向。需要再次强调该轮发布为纯缺陷修复且官方建议用户直接升级到 0.6.1wxBitcoin GUI 自该时期起不再受维护任何基于 0.4.x/0.6.0.x 的部署都不应被视为受支持的运行版本。【免费下载链接】bitcoinBitcoin Core integration/staging tree项目地址: https://gitcode.com/GitHub_Trending/bi/bitcoin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考