BNB Smart Chain(bsc)CHANGELOG 深度解读:从 Pasteur 硬分叉到版本升级运维指南
【免费下载链接】bscA BNB Smart Chain client based on the go-ethereum fork项目地址: https://gitcode.com/GitHub_Trending/bs/bsc
导读
本文以开源仓库 bsc(基于 go-ethereum 的 BNB Smart Chain 客户端)根目录的 CHANGELOG.md 为绝对主线,系统梳理 v1.0 至 v1.7.6 的版本演进脉络,重点展开最新 v1.7.6 Pasteur 硬分叉的共识与出块变更、v1.7.x 升级前的弃用标志检查清单、MEV 出块机制的源码实现,以及历史上各 BEP 驱动的关键演进。读者读完本文后,将能:① 看懂 BSC 版本号语义与硬分叉时间戳配置;② 依据 MetaInfo 完成一次安全的主网/测试网节点升级(重点处理弃用配置);③ 从源码层面理解 Parlia 共识、Fast Finality 投票、Blob 交易与 MEV 出块的实现位置,为后续源码研读建立索引。
一、版本发布节奏与版本号语义
CHANGELOG 从 v1.0.0-beta.0 一路记录到 v1.7.6,结合 README.md 的说明,bsc 采用三轨发布模型:
| 发布类型 | 版本格式 | 用途 |
|---|---|---|
| Stable Release | v<Major>.<Minor>.<Patch> | 生产环境主推版本,如 v1.7.5 |
| Feature Release | v<Major>.<Minor>.<Patch>-feature-<FeatureName> | 单特性早期访问,如v1.5.19-feature-SI |
| Preview Release | v<Major>.<Minor>.<Patch>-<alpha/beta/rc> | 前沿体验版本,如 v1.6.0-alpha、v1.6.1-beta |
从 CHANGELOG 可以观察到清晰的节奏规律:
- 主版本携带硬分叉:v1.7.0 同步 go-ethereum v1.16.7 并带来 Osaka 系列 EIP;v1.7.1/v1.7.2 落地 Osaka/Mendel 硬分叉;v1.7.6 落地 Pasteur 硬分叉。
- 维护版本修 bug:v1.7.3、v1.7.4、v1.7.5 均为 maintenance release,其中 v1.7.3 重点修复在线区块修剪(block pruning)与 kvdb 异常持续增长问题。
- 预览版本标识成熟度:v1.6.0-alpha 是上游同步预览版,v1.6.1-beta 表示修复了 alpha 若干问题、更可靠。
二、v1.7.6:Pasteur 硬分叉(Chapel 测试网)
v1.7.6 面向 BSC Chapel 测试网的 Pasteur 硬分叉(对应 BEP-673 中定义:
PasteurTime: newUint64(1784601000), // 2026-07-21 02:30:00 AM UTC注意同一文件中主网PasteurTime仍为nil(params/config.go),表示主网尚未排期;而OsakaTime/MendelTime主网已配置为1777343400(2026-04-28),Chapel 为1774319400(2026-03-24),对应 CHANGELOG 中 v1.7.2(主网)与 v1.7.1(Chapel)的记录。PasteurTime字段在链配置结构体中的定义见 params/config.go,并注册进分叉列表osakaTime/mendelTime/pasteurTime(params/config.go)。
2.1 共识与系统合约变更
v1.7.6 的 Pasteur 相关合并:
- 拒绝重复的 bridge validator(#3623 相关共识校验):在 Pasteur 硬分叉激活后,核心虚拟机层拒绝重复的 bridge validator,加固跨链桥验证者集合的合法性检查。
- builder 提议区块 + validator 盲签(#3691,实现见 miner/bid_block.go):miner 支持 builder 提议的区块(BidBlock)由 validator 进行盲签名(blind signing),
prepareBidBlockTask会先复制交易切片再绑定签名,避免修改缓存的 BidBlock。 - 系统合约升级(#3721、#3727):
UpgradeBuildInSystemContract的升级管线中新增 Pasteur 分支(core/systemcontracts/upgrade.go),pasteurUpgrade[network]指向 genesis-contract v1.2.6 的 CommitUrl。 - 硬分叉激活块禁用 BidBlock(#3741):
miner在硬分叉激活块禁用 BidBlock,防止激活瞬间的竞态。 - 优化 BidBlock 签名哈希(#3742):对签名哈希计算进行优化。
2.2 配套修复
v1.7.6 同时包含一批稳健性修复,分布在多个模块:
| 模块 | 修复内容 |
|---|---|
| eth/handler.go | 增加 balance 校验(#3668) |
| eth/protocols/bsc/handler.go | GetBlocksByRange响应按块数(MaxRequestRangeBlocksCount = 64)与软响应上限(softResponseLimit = 8MB)双重限流(#3671) |
| eth/protocols/bsc | 按投票数量而非包数量对入站投票限流(#3672) |
| internal/ethapi | getProofskeys 数量上限、eth_simulateV1调用次数与 gas cap 修复(#3680-#3682) |
| core | 修复 reorg() 错误返回时的txLookupLock互斥锁泄漏(#3683)、RPC 中禁止状态刷新(#3684) |
| core/tracing | 修复 nonce 回滚边界情况(#3685) |
| eth/filters | 修复 pending tx 与新头订阅、NewVotes 等的竞态问题及过滤器资源泄漏(#3686、#3689、#3692) |
| crypto | nocgoVerifySignature增加哈希长度校验(#3700) |
| p2p/discover | 读错误缓冲区拷贝、超时循环提前退出等修复(#3701-#3702、#3710) |
| eth/tracers | 修复 exclude 地址列表、OnSystemCall钩子透传(#3703、#3707) |
| triedb/pathdb | 修复零磁盘层 root 的 sentinel 冲突(#3706) |
| eth/downloader | 丢弃无效对等节点 + 修复 deliver index(#3708) |
| core/state | 修复 StateDB Reader 错误在 Commit 后被丢弃(#3709) |
| core/rawdb | 修复 freezer 错误路径的 fd 泄漏、copyFrom 先 fsync 临时文件再 rename(#3711-#3712) |
改进类包括:减少一轮中最后一个块的本地出块时间(#3669)、提取VerifyUnsealedHeader(#3694,见 consensus/parlia)、为 BidBlock 增加验证指标(#3736)。
2.3 清理与重构
v1.7.6 移除了大量历史包袱:删除 pathdb 的 legacy 字段JournalFilePath(#3670)、移除可选交易 gas limit cap(#3678)、移除 BEP-592 非共识区块访问列表(#3690)、删除 multidb 代码(#3716)、清理 bep-592 bal key(#3720)、移除 txpool overflowpool(#3722)、移除 fake-beacon op-stack shim(#3728),并将 bid/block mev 信息提取为 builder 子包(#3739)。
三、v1.7.6 升级前的弃用标志检查清单(重点)
v1.7.6 的 MetaInfo 明确要求:Mandatory Update Required: Yes,面向所有 BSC 测试网用户。升级前必须逐项核对以下 CLI 标志与 TOML 配置,确认移除后不影响自身节点,再执行二进制替换即可。
3.1 CLI 标志
| Flag | 变化 | 说明 |
|---|---|---|
--journalfile | 弃用(无效果) | 需从启动脚本移除(#3670);源码中 cmd/utils/flags.go 已输出--journalfile is deprecated and has no effect警告,对应 legacy 标志定义见 cmd/utils/flags_legacy.go |
--miner.txgaslimit | 弃用(无效果) | 单交易 gas 上限改由 EIP-7825(Transaction Gas Limit Cap)强制,移除前确认 EIP-7825 行为符合预期(#3678) |
--enablebal | 弃用(无效果) | BEP-592 区块访问列表已删除,可安全移除(#3690) |
--multidatabase | 移除 | 单数据库模式是唯一选项,需确认数据目录兼容(#3716) |
--txpool.overflowpoolslots | 弃用(无效果) | overflow pool 已移除,若依赖过它请复核 txpool 容量设置(#3722) |
--fake-beacon/--fake-beacon.addr/--fake-beacon.port | 移除 | fake-beacon op-stack shim 已删除(#3728,回退 #2678) |
3.2 配置文件(TOML)字段
| 字段 | 变化 | 说明 |
|---|---|---|
[Eth] EnableBAL | 移除——若保留将导致加载错误 | 升级前必须从 config.toml 删除该字段(#3690) |
[TxPool] OverflowPoolSlots | 弃用——静默忽略 | 可保留但建议删除以保持配置整洁(#3722) |
操作建议:升级前先用grep -i "journalfile\|txgaslimit\|enablebal\|multidatabase\|overflowpool\|fake-beacon" config.toml自检配置文件,再检查启动脚本中的对应标志;确认无误后直接替换二进制,无需重启数据目录。
四、v1.7.0–v1.7.5:Osaka/Mendel 硬分叉与维护期
4.1 v1.7.2(主网 Osaka/Mendel,2026-04-28)
对应 BEP-658,硬分叉时间 2026-04-28 02:30:00 AM UTC,与 params/config.go 中主网OsakaTime = MendelTime = 1777343400一致。本版本包含两项关键修复:miner 为 bids 支持 blob sidecar 验证(#3597)、eth 延迟 p2p 消息解码(#3590)、core 拒绝 DA 检查中的未来 chasing heads(#3601)。
4.2 v1.7.1(Chapel Osaka/Mendel,2026-03-24)
测试网先行落地(params/config.go),特性包括:BEP-655 bid block 大小检查(#3529)、BEP-652 mev bid gas 检查(#3528)、禁用 eip-7918(#3531)、BEP-657 按区块号限制 Blob 交易包含(#3533)。修复了 super-instruction 系列问题(#3582、#3584)与 rlp listIterator 解析错误死循环(#3586)等。
4.3 v1.7.0(上游代码同步,geth v1.16.2 ~ v1.16.7)
v1.7.0-alpha 为预览版,核心价值是同步 go-ethereum v1.16.7,带来的 Osaka 系列 EIP 直接解释了后续版本的硬分叉能力:
- EIP-7823:MODEXP 设置上限
- EIP-7825:交易 gas limit cap(v1.7.6 中
--miner.txgaslimit弃用的依据) - EIP-7883:ModExp gas 成本上调
- EIP-7918:Blob base fee 由执行成本约束
- EIP-7934:RLP Execution Block Size Limit
- EIP-7939:CLZ 操作码
- EIP-7951:secp256r1 曲线预编译
同时引入eth_sendRawTransactionSync同步交易提交、TriePrefetcher 按账户并行预取、基于文件的状态日志(state journal)等性能与架构优化。
4.4 v1.7.3–v1.7.5(维护期)
- v1.7.3:修复在线区块修剪(#3653 修复 freeze header-number shadowing)与 kvdb 异常持续增长(#3633 将
SlowFreezerBatchLimit从 100 提升到 200);新特性--history.transactions(#3624)——归档节点默认禁用交易去索引,由该标志指定交易历史范围;history.logs默认值设为 576000(#3634,见 eth/ethconfig/config.go 中LogHistory: 576000)。 - v1.7.4 / v1.7.5:维护发布,MetaInfo 为 Mandatory Update: No,直接二进制替换即可。
五、MEV 出块机制:从 BEP-652/655 到 Pasteur 盲签
CHANGELOG 中反复出现的 “bid / MEV / builder” 是 bsc 近几个版本的核心演进方向,源码集中在 miner 与 miner/bid_block.go:
- BidBlock 数据结构:#3739 将 bid 与 block mev 信息抽离为 builder 子包(core/types/builder),
setBidMevInfo依据isBidBlock写入BlockMevInfoVersionBidBlock(miner/bid_block.go)。 - 投标选择:
selectBidBlock会比较本地模拟出块奖励与 builder 出价,只有 builder 出价高于本地模拟奖励才采纳(miner/bid_block.go),并配合revokeBidBlockBuilder惩罚无效 builder。 - Blob 校验:v1.7.2 #3597 为 bids 增加 blob sidecar 验证,
validateBidBlockBlobTxs检查 sidecars 与系统交易起始位置(miner/bid_block.go)。 - 盲签名:v1.7.6 #3691 支持 builder 提议区块由 validator 盲签,
prepareBidBlockTask在准入阶段先由 validator 通过SetExtraData定稿 Extra,再在 Seal 阶段填充(miner/bid_block.go)。 - 相关演进:#3121 模拟前丢弃过期 bids、#3145 为 bids 模拟预取状态、#3204 仅在无错误时重新提交 bids、#3160/#3736 增加 mev/bid 模拟指标、#2971 过晚不中断本地出块。
六、快节奏出块(BEP-520/524/619)与网络层限流
BSC 的短区块间隔演进是版本节奏的重要驱动:BEP-520(1.5s,v1.5.9)、BEP-524(0.75s,v1.5.13)、BEP-619(0.45s,v1.6.2)。配合极短出块间隔,网络层做了大量限流与稳定性改造:
- GetBlocksByRange 响应上限:#3671 将每请求块数限制为 64、软响应上限 8MB(eth/protocols/bsc/handler.go),防止超大响应拖垮磁盘查询与带宽。
- 投票按数量限流:#3672 按投票数而非包数计费限流(eth/protocols/bsc/handler.go 附近的注释说明了这一设计),配套 peer 侧
maxKnownVotes/voteBufferSize配置(eth/protocols/bsc/peer.go)。 - 延迟 p2p 消息解码(#3590)与 450ms 块时序参数调优(#3626)都是为了压榨出块节奏的边际性能。
七、Fast Finality 与投票机制
BSC 的快速最终性(BEP-126,v1.2.0 引入)贯穿多版本:
- v1.2.11 在 ethclient 增加
FinalizedHeader/Block接口。 - v1.2.10 增加 RPC
GetFinalizedHeader/Block,简化快速最终性使用。 - v1.6.2 落地 BEP-590(扩展投票规则提升稳定性),并设置
kAncestorGenerationDepth = 3。 - v1.7.6 修复
NewVotes/NewFinalizedHeaders订阅竞态(#3689)。 - 代码层面,投票组装与校验集中在 consensus/parlia(如
assembleVoteAttestation、updateAttestation),投票池在 core/vote(v1.3.3 修复 votepool 停止客户端时的死锁)。
八、状态存储演进:PBSS、Pebble、多数据库到单数据库
- v1.3.1:激活 PBSS(path-based state scheme),并配套
hbss2pbss转换工具(v1.6.1 移除)。 - v1.4.3:翻转 hash→path 状态方案,Pebble 成为默认 kvdb。
- v1.4.6/v1.4.16:支持区块数据分离数据库(multidatabase)并在 v1.4.16 修复其问题。
- v1.5.18-v1.6.x:逐步收窄 multidatabase(#3208 禁用 multidatabase 的 blockstore)。
- v1.7.6:彻底移除 multidb 代码(#3716),同时移除
--multidatabase标志与 pathdb 的JournalFilePathlegacy 字段——单数据库时代正式到来。
九、常见升级操作速查(MetaInfo 汇总)
| 版本 | 强制升级 | 目标用户 | 操作 |
|---|---|---|---|
| v1.7.6 | 是 | 全部 BSC 测试网用户 | 先核对弃用标志/配置(见第三节),后替换二进制 |
| v1.7.5 / v1.7.4 | 否 | 全部主网/测试网 | 直接替换二进制 |
| v1.7.3 | 否 | 全部主网/测试网 | 直接替换二进制;从 v1.6.x 升级需确保配置无JournalFileEnabled字段 |
| v1.7.2 | 硬分叉版本 | 主网 | 在 2026-04-28 前完成升级 |
| v1.7.1 | 硬分叉版本 | Chapel 测试网 | 在 2026-03-24 前完成升级 |
通用原则:硬分叉版本必须在时间戳前完成二进制替换;维护版本可直接替换;任何跨大版本升级(如 v1.6.x → v1.7.x)建议先检查配置文件中是否有已移除字段。
十、结语与进一步阅读
通过 CHANGELOG 可以完整复盘 BSC 客户端从 v1.0 到 v1.7.6 的演进:上游 geth 同步(v1.5.x/v1.6.x/v1.7.0)、EIP/BEP 落地(Osaka/Mendel/Pasteur)、出块间隔不断压缩(1.5s→0.75s→0.45s)、MEV 出块从试验到盲签正式化、存储从多数据库回归单数据库。若需深入某一机制,可按以下路径继续阅读仓库源码:
- 链配置与硬分叉时间:查看 params/config.go 与 params/network_params.go
- Parlia 共识:查看 consensus/parlia
- MEV/BidBlock:查看 miner/bid_block.go 与 miner/miner_mev.go
- 系统合约升级管线:查看 core/systemcontracts/upgrade.go
- BSC 扩展协议与限流:查看 eth/protocols/bsc/handler.go
- 状态存储:查看 triedb/pathdb 与 ethdb/pebble
【免费下载链接】bscA BNB Smart Chain client based on the go-ethereum fork项目地址: https://gitcode.com/GitHub_Trending/bs/bsc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考