ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

btcd 可复现构建系统实战指南:从源码构建逐字节一致的发布二进制

btcd 可复现构建系统实战指南:从源码构建逐字节一致的发布二进制 区块链【免费下载链接】btcdAn alternative full node bitcoin implementation written in Go (golang)项目地址https://gitcode.com/gh_mirrors/bt/btcd点击查看免费下载导读btcd 是一个用 Go 编写的比特币全节点实现其发布工程采用了一套基于 Go 1.13 以上版本构建标志的可复现Reproducible构建系统确保在不同机器上构建出的二进制文件逐字节byte-for-byte完全一致。本文以仓库内 release/README.md 为骨架结合 release/release.sh、version.go 与 cmd/btcctl/version.go 等源码完整讲解从打标签、跨平台构建、签署 manifest 到第三方独立验证发布的端到端流程读完即可独立复现并核验 btcd 任一官方发布。一、可复现构建为什么发布者不再需要被无条件信任比特币节点软件的发布安全性至关重要全节点二进制一旦被篡改可能诱导用户接受无效区块、泄漏密钥或干扰共识判断。在 Go 1.13 之前第三方用户只能信任发布管理者release manager在私有环境中构建出的二进制而自 Go 1.13 起配合一组新的构建标志Go 工具链生成的二进制可以做到可复现——任何人在任何机器上只要使用相同版本的 Go 与源码就能得到哈希完全一致的产物。btcd 的可复现构建系统正是基于这一能力设计其核心诉求有两个发布方可证明发布者将构建流程、构建所用 Go 版本全部公开任何人可独立复现用户可验证用户无需信任发布者机器只需重新构建并与官方哈希比对即可确认二进制未被篡改。因此每个发布版本都必须在其发布说明release notes中注明构建所用的 Go 版本验证者必须使用同一 Go 版本复现这是整个信任链条的起点。二、构建新版本维护者的完整操作清单从打标签到发布流程分为三个阶段标签前的准备工作、运行构建脚本、签署并发布。2.1 标签前的准备更新 CHANGES 变更日志在创建 tagged commit 之前必须先将本版本相对上一版本的变更提交进 CHANGES 文件。该文件实质上是与发布说明release notes大致对应的变更日志通常将上次发布以来合并的 PR 按类别整理归档。历史上其格式大致如下Changes in X.YY.Z (Month Day Year): - Protocol and Network-related changes: - PR Title One (#PRNUM) - PR Title Two (#PRNUMTWO) ... - RPC changes: - Crypto changes: ... - Contributors (alphabetical order): - Contributor A - Contributor B - Contributor C ...仓库当前的 CHANGES 文件即遵循该格式例如Changes in 0.22.0 (Tue Jun 01 2021)一节就按 Protocol and network-related changes、Crypto changes、Notable developer-related package changes、RPC changes 等类别罗列了带 PR 编号的条目。获取贡献者名单时假设上一个标签是vA.B.C从该标签到当前HEAD的贡献者可通过如下命令得到按姓名排序去重git log vA.B.C..HEAD --pretty%an | sort | uniq2.2 版本号 bump两处 version.go 必须同步修改CHANGES 提交完成后即可创建 tagged release commit。该提交的核心改动是同时提升两个文件中的语义化版本号根目录 version.gobtcd 守护进程cmd/btcctl/version.go命令行客户端 btcctl以实际发布提交为例对应提交 f3ec130改动形如diff --git a/cmd/btcctl/version.go b/cmd/btcctl/version.go index 2195175c71..f65cacef7e 100644 --- a/cmd/btcctl/version.go b/cmd/btcctl/version.go -18,7 18,7 const semanticAlphabet 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr const ( appMajor uint 0 appMinor uint 20 - appPatch uint 0 appPatch uint 1 // appPreRelease MUST only contain characters from semanticAlphabet // per the semantic versioning spec. diff --git a/version.go b/version.go index 92fd60fdd4..fba55b5a37 100644 --- a/version.go b/version.go -18,7 18,7 const semanticAlphabet 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr const ( appMajor uint 0 appMinor uint 20 - appPatch uint 0 appPatch uint 1 // appPreRelease MUST only contain characters from semanticAlphabet // per the semantic versioning spec.从源码可以看到两处版本定义遵循语义化版本 2.0.0 规范appMajor、appMinor、appPatch为编译期常量appPreRelease如beta与appBuild可通过-ldflags -X main.appBuild foo在构建时覆盖都会经过normalizeVerString过滤只保留semanticAlphabet0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-允许的字符再由version()拼接为X.Y.Z-premeta形式。因此 bump 版本号时只需修改appMajor/appMinor/appPatch常量即可两处必须保持一致的版本号。2.3 签名提交与签名标签版本号 bump 完成后git commit -S # 维护者用 GPG 对提交签名 git tag TAG -s # 对提交打签名标签 git push origin TAG # 推送标签签名提交-S与签名标签-s共同保证发布内容出自可信维护者之手且标签所指的源码状态不可抵赖。这也是后续验证者使用git verify-commit与git verify-tag核验的对象。2.4 运行构建脚本release.sh构建脚本位于 release/release.sh。Linux 与 macOS 无需任何前置准备即可运行Windows 用户则需要通过 WSLWindows Subsystem for Linux来执行git clone btcd 仓库地址 btcd cd btcd ./release/release.sh TAG # TAG 为下一个发布版本的标签名运行完毕后当前目录会生成一个形如btcd-TAG的目录其中包含面向各受支持操作系统与 CPU 架构的发布二进制压缩包记录每个压缩包哈希的manifest 清单文件manifest-TAG.txt。2.5 源码级拆解release.sh 内部到底做了什么深入阅读 release/release.sh 可以完整还原构建流程脚本受set -e保护任何一步失败即终止1标签参数处理if [[ $1x x ]]; then DATEdate %Y%m%d VERSION01 TAG$DATE-$VERSION else TAG$1 fi若未传入标签则以日期加序号如20261006-01作为默认标签正式发布必须显式传入标签名。2依赖归档与源码快照go mod vendor tar -cvzf vendor.tar.gz vendor ... PACKAGESRC$MAINDIR/$PACKAGE-source-$TAG.tar git archive -o $PACKAGESRC HEAD gzip -f $PACKAGESRC $PACKAGESRC.gz先执行go mod vendor将模块依赖打入vendor/目录并打包为vendor.tar.gz再使用git archive基于当前HEAD生成完整源码快照btcd-source-TAG.tar.gz与二进制一起随发布提供——这保证验证者无需依赖易变的外部模块仓库即可独立重建。3目标平台矩阵与 BTCDBUILDSYS 覆盖脚本默认构建以下 30 个OS-ARCH组合SYS变量darwin-amd64 darwin-arm64 dragonfly-amd64 freebsd-386 freebsd-amd64 freebsd-arm illumos-amd64 linux-386 linux-amd64 linux-armv6 linux-armv7 linux-arm64 linux-ppc64 linux-ppc64le linux-mips linux-mipsle linux-mips64 linux-mips64le linux-s390x netbsd-386 netbsd-amd64 netbsd-arm netbsd-arm64 openbsd-386 openbsd-amd64 openbsd-arm openbsd-arm64 solaris-amd64 windows-386 windows-amd64同时支持通过环境变量BTCDBUILDSYS覆盖默认列表只构建你关心的子集例如验证时只构建自己的平台其注释明确说明这是releasing for a subset of systems/architectures的便捷通道。armv6/armv7会被映射为 Go 的GOARCHarm并分别设置GOARM6/GOARM7。4可复现构建的关键标志env CGO_ENABLED0 GOOS$OS GOARCH$ARCH GOARM$ARM go build -v -trimpath \ -ldflags-s -w -buildid github.com/btcsuite/btcd env CGO_ENABLED0 GOOS$OS GOARCH$ARCH GOARM$ARM go build -v -trimpath \ -ldflags-s -w -buildid github.com/btcsuite/btcd/cmd/btcctl每个平台构建两个可执行文件主节点btcd与命令行工具btcctl。四个参数是实现可复现的关键参数作用CGO_ENABLED0禁用 CGO保证纯 Go 静态构建消除 C 编译器版本/头文件差异对产物的影响-trimpath从二进制中剥离构建机上的绝对源码路径避免因克隆目录不同导致字节差异-ldflags-s -w去掉符号表与 DWARF 调试信息缩小体积并减少非确定性元数据-ldflags-buildid清空 Go 工具链默认写入的随机 build ID这是二进制可逐字节复现的前提之一同样的参数也出现在根目录 Makefile 的release-install目标中第 8386 行开发者可用make release-install在本地安装与官方发布二进制等价的 btcd/btcctl。5打包与哈希清单if [[ $OS windows ]]; then zip -r $PACKAGE-$i-$TAG.zip $PACKAGE-$i-$TAG else tar -cvzf $PACKAGE-$i-$TAG.tar.gz $PACKAGE-$i-$TAG fi ... shasum -a 256 * manifest-$TAG.txtWindows 平台产物打包为.zip其余平台打包为.tar.gz。全部打包完成后脚本对btcd-TAG目录下所有文件执行shasum -a 256生成manifest-TAG.txt哈希清单——它就是验证者对账的官方账本。三、发布流程签署 manifest 并上传发布文件btcd-TAG目录生成后维护者需要1签署 manifest 文件gpg --sign --detach-sig manifest-TAG.txt该命令生成manifest-TAG.txt.sig独立签名文件它必须随发布文件一同提供供验证者核验哈希清单确实出自签名维护者。2发布前的复核正式发布前务必按照本文档所述的可复现流程对release/release.sh生成的产物完整走一遍包括使用git verify-commit与git verify-tag分别核验提交签名与标签签名。一切确认无误后才在 GitHub Releases 页面创建发布。3创建 GitHub Release在 GitHub UI 中创建 Release 时将btcd-TAG目录下的每一个文件都作为发布附件上传包括各平台压缩包、源码快照、vendor.tar.gz、manifest 及其签名在发布说明release notes中明确写出构建所用的 Go 版本这是用户复现与核验的前提release notes 的内容应与 CHANGES 文件高度重合二者信息大部分相同但注意二者定位不同CHANGES 文件位于 tagged commit 之前的 git 历史中而 release notes 写在 GitHub 发布页面中。完成上述步骤后即可点击 Publish Release。四、验证发布第三方如何独立核验官方二进制这是可复现构建系统带给普通用户的最大价值不再需要信任发布者机器。验证分为两个层级。4.1 快速验证签名与哈希对账首先准备好工具gpg/gpg2校验签名、shasum计算哈希、tar/unzip解包。多数 Unix 系统默认自带。第 1 步获取材料。下载适合你操作系统与架构的二进制压缩包、manifest 文件及其签名文件manifest-TAG.txt.sig。第 2 步核验 manifest 签名。manifest 的 PGP 签名密钥信息会公布在 release notes 中先获取该公钥再执行gpg --verify manifest-TAG.txt.sig第 3 步核验压缩包哈希。重新计算压缩包的 SHA256与 manifest 中的对应条目比对shasum -a 256 filename比对结果必须完全一致exactly。若你信任发布管理者的诚信到此即可放心使用下载的二进制。4.2 完整复现验证从源码重建并比对若想彻底证明二进制确实由公开源码构建而来需要从头重建。前提是安装shasum以及与 release notes 中完全相同的 Go 版本版本不一致会破坏可复现性。第 4 步解压官方压缩包按上述方法计算其中btcd与btcctl二进制的 SHA256 并记录下来。第 5 步确认本机 Go 版本与 release notes 标注的版本一致。第 6 步获取 btcd 源码并检出发布标签git clone btcd 仓库地址 btcd cd btcd git checkout TAG第 7 步核验标签签名并仅为目标平台执行可复现构建git verify-tag TAG BTCDBUILDSYSOS-ARCH ./release/release.sh TAG其中OS-ARCH替换为你验证的目标平台如linux-amd64。通过BTCDBUILDSYS只构建单个平台可显著缩短验证时间。第 8 步解压btcd-TAG目录中由脚本生成的对应压缩包重新计算其中二进制的 SHA256shasum -a 256 filename将结果与第 4 步记录的官方哈希比对必须逐字节完全一致。一致即证明官方发布的二进制确实由公开的、带签名标签的源码在使用既定 Go 版本的可复现构建参数下产生中间不存在任何篡改空间。五、可复现构建的注意事项与最佳实践结合 release/README.md 与 release/release.sh 的源码以下是实践中最容易踩坑的几点Go 版本是复现的第一要素Go 编译器自身会演进不同小版本生成的二进制通常不一致。验证者必须严格使用 release notes 中记录的 Go 版本btcd 项目在每次发布时都会明确记录该版本。不要在构建机上使用自定义环境CGO_ENABLED0、-trimpath、-s -w -buildid四个标志缺一不可。若自行编译时遗漏任一标志产物哈希将与官方不符无法通过验证。验证时善用BTCDBUILDSYS限定平台全量 30 个平台矩阵构建耗时较长第三方验证通常只需证明我能复现即可因此只构建自己的OS-ARCH子集是官方推荐的验证姿势。源码快照与 vendor 目录随发布提供btcd-source-TAG.tar.gz与vendor.tar.gz保证了即便未来模块仓库发生变动验证者仍能基于与发布完全一致的依赖图重建。提交与标签的双重签名git commit -Sgit tag -s构成了发布内容的完整性锚点验证者应使用git verify-commit/git verify-tag在构建前先行核验。结语btcd 的可复现构建系统将信任发布者转化为信任可验证的流程发布者公开源码、版本、构建参数与哈希清单验证者用同一套参数在本地重建并逐字节比对。这套体系不仅适用于 btcd 官方发布也完全可以作为其他 Go 项目构建供应链安全基础设施的参考范式——从 release/release.sh 的 109 行脚本出发你就能在自己的项目中复刻同样的发布与验证能力。赞分享区块链【免费下载链接】btcdAn alternative full node bitcoin implementation written in Go (golang)项目地址https://gitcode.com/gh_mirrors/bt/btcd点击查看免费下载相关推荐ESP-IDF 可重复构建完全指南让同一份代码产出逐字节一致的固件ESP IDF 可重复构建完全指南让同一份代码产出逐字节一致的固件 ESP IDF 构建系统原生支持“可重复构建”Reproducible Builds物联网嵌入式LND 安装与后端配置完全指南二进制发布、Docker 与源码构建、btcd/Neutrino/bitcoind 三种后端实战LND 安装与后端配置完全指南二进制发布、Docker 与源码构建、btcd/Neutrino/bitcoind 三种后端实战 本指南以 LNDLightn区块链lnd 可复现构建系统实战指南从发布构建、签名到独立验证的完整流程lnd 可复现构建系统实战指南从发布构建、签名到独立验证的完整流程 Lightning Network Daemonlnd的每一次版本发布都依赖一套精心设区块链上一篇Phaser 3.1.2Onishi版本更新详解关键 Bug 修复与 API 变更全解析下一篇CANN ops-transformer 算子详解aclnnNsaCompressWithCache 推理阶段 NSA KV 压缩实现与调用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表