新闻详情

新闻详情

首页 / 资讯中心 / 详情

使用 evm b11r 组装与密封区块:go-ethereum 区块构建器实战指南

发布时间:2026/9/19 8:53:47来源:尧图网络
使用 evm b11r 组装与密封区块:go-ethereum 区块构建器实战指南
使用 evm b11r 组装与密封区块go-ethereum 区块构建器实战指南【免费下载链接】go-ethereumGo implementation of the Ethereum protocol项目地址: https://gitcode.com/gh_mirrors/go/go-ethereumb11rblock-builder是 go-ethereumevm命令行工具中的区块装配子命令用于把区块头header、交易列表txs与叔块ommers等原料拼装成完整区块并输出其 RLP 编码与区块哈希。本文以仓库内置测试用例 cmd/evm/testdata/20 为主线带你从一条命令入手逐步理解 b11r 的输入格式、命令行参数、Clique 密封机制以及底层的源码实现掌握自己动手组装一个区块的完整技能。b11r 是什么evm 子命令中的区块装配器在 go-ethereum 仓库中evm工具以子命令的形式提供了多套状态测试与辅助能力例如执行状态转换的t8n、校验交易的t9n以及本文的主角——区块构建器b11r。它的命令注册位于 cmd/evm/main.go#L225-L239blockBuilderCommand cli.Command{ Name: block-builder, Aliases: []string{b11r}, Usage: Builds a block, Action: t8ntool.BuildBlock, Flags: []cli.Flag{ t8ntool.OutputBasedir, t8ntool.OutputBlockFlag, t8ntool.InputHeaderFlag, t8ntool.InputOmmersFlag, t8ntool.InputWithdrawalsFlag, t8ntool.InputTxsRlpFlag, t8ntool.SealCliqueFlag, }, }可以看到b11r只是block-builder的短别名真正干活的是t8ntool.BuildBlock函数实现在 cmd/evm/internal/t8ntool/block.go#L222-L238。它接受区块头、交易 RLP、ommer RLP 等输入输出组装好的完整区块。与t8n负责把交易跑出状态根、收据根不同b11r不做任何 EVM 执行只负责拼装因此非常适合在测试流水线中作为最后一步把t8n等工具产出的中间结果封装成完整区块。快速上手组装一个未密封区块仓库测试用例 cmd/evm/testdata/20/readme.md 给出了 b11r 最经典的用法——组装一个未密封unsealed区块。在仓库根目录执行$ go run ./cmd/evm b11r --input.headercmd/evm/testdata/20/header.json --input.txscmd/evm/testdata/20/txs.rlp --input.ommerscmd/evm/testdata/20/ommers.json --output.blockstdout注意go run .的写法需要在cmd/evm目录内执行如果在仓库根目录运行需要写成go run ./cmd/evm b11r ...并将测试数据路径前加上cmd/evm/前缀。命令成功后会向标准输出打印一段 JSON结构如下完整输出见 cmd/evm/testdata/20/exp.json{ rlp: 0xf902d9f90211a0d6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e997a23b159e2e2a5ce72333262972374b15425ca0325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2e..., hash: 0xaba9a3b6a4e96e9ecffcadaa5a2ae0589359455617535cd86589fe1dd26fe899 }这段输出包含两个关键字段rlp整个区块header body的 RLP 十六进制编码。它是区块在以太坊网络中传输与存储的标准序列化形式可以直接广播或写入数据库。hash区块的 Keccak-256 哈希即区块头的哈希值也是该区块在链上的唯一标识。该输出结构由 cmd/evm/internal/t8ntool/block.go#L320-L347 中的dispatchBlock函数定义type blockInfo struct { Rlp hexutil.Bytes json:rlp Hash common.Hash json:hash }细心的读者可能会发现readme 中的示例输出与当前exp.json中的 RLP 值略有差异——这是因为 readme 保留了较早测试快照的输出而 exp.json 才是当前仓库的权威期望结果。两者的字段结构完全一致仅 RLP 内容随测试数据版本演进。输出目标由--output.block控制除了stdout还可以指定stderr或一个具体的文件名默认是block.json详见 flags.go#L83-L90。输入文件详解组装区块需要三类核心输入区块头、交易列表、叔块列表。下面逐一拆解测试用例testdata/20中的实际文件。header.json区块头cmd/evm/testdata/20/header.json 的内容如下{ parentHash: 0xd6d785d33cbecf30f30d07e00e226af58f72efdf385d46bc3e6326c23b11e34e, miner: 0xe997a23b159e2e2a5ce72333262972374b15425c, stateRoot: 0x325aea6db48e9d737cddf59034843e99f05bec269453be83c9b9a981a232cc2e, logsBloom: 0x0000...0000, difficulty: 0x1000, number: 0xc3be, gasLimit: 0x50785, gasUsed: 0x0, timestamp: 0x55c5277e, extraData: 0x476574682f76312e302e312f6c696e75782f676f312e342e32, mixHash: 0x5865e417635a26db6d1d39ac70d1abf373e5398b3c6fd506acd038fa1334eedf, nonce: 0x97435673d874f7c8 }其中extraData解码后是 ASCII 字符串Geth/v1.0.1/linux/go1.4.2这是当年 geth 客户端写入区块头的客户端标识。区块头 JSON 的字段模型定义在 block.go#L38-L62各字段含义如下JSON 字段Go 字段说明parentHashParentHash父区块哈希sha3UnclesOmmerHash叔块哈希缺省时若提供了 ommers 会自动计算minerCoinbase矿工/受益地址缺省为全零地址stateRootRoot状态根必填transactionsRootTxHash交易根缺省为EmptyTxsHashreceiptsRootReceiptHash收据根缺省为EmptyReceiptsHashlogsBloomBloom日志布隆过滤器difficultyDifficulty难度缺省为 0numberNumber区块号必填gasLimitGasLimit燃料上限必填gasUsedGasUsed已用燃料timestampTime时间戳必填extraDataExtra附加数据mixHashMixDigest混合哈希PoW 相关nonceNonce区块 noncePoW 相关baseFeePerGasBaseFeeEIP-1559 基础费可选RLP 可选字段withdrawalsRootWithdrawalsHash上海升级提款根可选blobGasUsed/excessBlobGasBlobGasUsed/ExcessBlobGasEIP-4844 blob 燃料字段可选parentBeaconBlockRootParentBeaconBlockRoot坎昆升级父信标根可选requestsHashRequestsHashEIP-7685 请求根可选值得注意的是ToBlockblock.go#L122-L171的填充逻辑当某些字段缺省时它会使用对应的空值常量如types.EmptyUncleHash、types.EmptyTxsHash、types.EmptyReceiptsHash、common.Big0保证产出的区块结构始终合法而OmmerHash若未提供但存在 ommers则会调用types.CalcUncleHash自动计算叔块哈希。txs.rlp交易列表--input.txs接受一个RLP 编码的已签名交易列表以十六进制字符串形式存储在文件中。当前用例 cmd/evm/testdata/20/txs.rlp 中包含两笔 legacy 交易从exp.json的 RLP 中可以看到0xf85f...前缀的两笔交易gas 均为0x5208即 21000收款方为0x8a8eafb1cf62bfbeb1741769dae1a9dd47996192。在 readInput 中b11r 读取该 RLP 后调用rlp.DecodeBytes将其解码为[]*types.Transactionif inputData.TxRlp ! { if err : rlp.DecodeBytes(common.FromHex(inputData.TxRlp), txs); err ! nil { return nil, NewError(ErrorRlp, fmt.Errorf(unable to decode transaction from rlp data: %v, err)) } inputData.Txs txs }ommers.json叔块列表--input.ommers接受一个ommer 区块头 RLP 的十六进制列表。测试用例 cmd/evm/testdata/20/ommers.json 是空列表[]解码逻辑见 block.go#L301-L313每个 ommer 条目按区块结构header txs ommers进行 RLP 解码只取其中的Header部分。其他可选输入withdrawals 与 stdin--input.withdrawals上海Shanghai升级后引入接受[]*types.Withdrawal列表 JSON见测试用例testdata/27。所有输入均支持stdin关键字当任意一个输入参数指定为stdin时b11r 会从标准输入读取一个聚合的 JSON 对象bbInput包含header、ommers、txs、withdrawals、clique字段一次性完成全部输入见 block.go#L77-L94 与readInput中的处理分支。命令行参数全景b11r 支持的完整参数列表如下默认值取自 flags.go与 cmd/evm/README.md#L527-L541 中的规范一致参数默认值说明--input.headerheader.json区块头 JSON 文件或stdin--input.txstxs.rlp交易列表 RLP 文件十六进制或stdin--input.ommers空ommer 区块头 RLP 列表文件或stdin--input.withdrawals空提款列表 JSON 文件或stdin--output.basedir空输出文件的基础目录不存在时自动创建--output.blockblock.json区块输出位置stdout/stderr/ 文件名--seal.clique空Clique 密封数据文件或stdin见下节--seal.ethashfalse是否用 ethash 密封区块--seal.ethash.dir空ethash DAG 目录不存在则生成新 DAG--seal.ethash.modenormalethash 验证模式--verbosity3日志详细程度注意--seal.ethash相关参数虽然出现在 README 规范与测试工具的结构体字段中但当前 main.go#L225-L239 注册的block-builder命令仅暴露了output.basedir、output.block、input.header、input.ommers、input.withdrawals、input.txs、seal.clique七个标志ethash 密封相关标志未被挂载到 CLI 上。若需使用 ethash 密封能力可关注仓库后续版本的演进。区块是如何被组装出来的源码级调用链BuildBlock的完整流程只有四步block.go#L222-L238func BuildBlock(ctx *cli.Context) error { baseDir, err : createBasedir(ctx) // 1. 准备输出目录 inputData, err : readInput(ctx) // 2. 读取并解码全部输入 block : inputData.ToBlock() // 3. 组装 header body block, err inputData.SealBlock(block) // 4. 按需密封默认不密封 return dispatchBlock(ctx, baseDir, block) // 5. 编码并输出 }核心的拼装动作发生在ToBlockblock.go#L122-L171先用输入 header 字段构造一个types.Header对缺省字段填入空值常量若输入显式提供了OmmerHash、Coinbase、TxHash、ReceiptHash、Nonce、Difficulty则覆盖默认值最后调用types.NewBlockWithHeader(header).WithBody(...)把交易、叔块和提款列表挂载到区块体上完成整个区块的组装。dispatchBlockblock.go#L320-L347则负责将组装好的区块 RLP 编码连同block.Hash()一起以 JSON 形式写出。Clique 密封让区块可被共识接受默认情况下 b11r 产出的是未密封区块——header 中的 PoW 相关字段mixHash、nonce保持输入原样区块哈希直接由 header 内容决定。对于 CliquePoA网络b11r 还提供了--seal.clique选项用指定密钥完成权威节点的签名密封。Clique 密封数据是一个 JSON 对象定义见 block.go#L96-L119{ secretKey: 0x..., // 必填签名私钥 voted: 0x..., // 可选投票目标地址 authorize: true, // 可选授权/撤销投票 vanity: 0x0000...0000 // 可选extraData 前 32 字节的 vanity 区 }sealCliqueblock.go#L184-L220的执行逻辑值得注意冲突检测如果输入 header 已提供extraData或者投票场景下已提供coinbase/nonce会直接报配置错误避免静默覆盖导致产出与预期不符的区块extra 组装Clique 的extraData固定为 32 字节 vanity 65 字节签名函数先用 vanity 填充前 32 字节签名对clique.SealHash(header)计算的结果调用crypto.Sign得到 65 字节签名填入extra[32:]最终通过block.WithSeal(header)生成密封后的区块。测试用例testdata/21中的clique.json即演示了这种用法见下文测试章节。测试与验证TestB11r 回归测试b11r 的功能由 cmd/evm/t8n_test.go#L522-L599 中的TestB11r表驱动测试覆盖。测试框架会以go run . b11r ...的形式调用命令行并把 stdout 与期望文件做 JSON 语义比较cmpJson。当前用例包括测试目录场景期望输出./testdata/20未密封区块unsealedexp.json./testdata/21ethash 密封测试exp.json./testdata/21clique.jsonClique 密封测试exp-clique.json./testdata/22含叔块的区块exp.json./testdata/27含提款withdrawals的区块exp.json也就是说testdata/20正是未密封区块这条回归用例的测试夹具。你可以在仓库根目录运行以下命令验证 b11r 的全部行为符合预期$ go test ./cmd/evm -run TestB11r -v如果你想亲手验证本文开头那条命令的产物可以与 cmd/evm/testdata/20/exp.json 对比二者在结构上完全一致。编码约定与注意事项数值编码b11r 的 JSON 输入中数值字段如number、gasLimit、timestamp支持十六进制0x...或十进制表示字节字段parentHash、stateRoot、extraData等一律使用十六进制见headerMarshalingblock.go#L64-L75中对math.HexOrDecimal256、math.HexOrDecimal64、hexutil.Bytes的使用。未密封区块的适用场景testdata/20演示的未密封区块适合用于测试向量、状态测试和工具链中间产物若需要广播上链还需配合共识层的密封Clique 可借助--seal.clique一步完成。与其他工具的组合b11r 通常与t8n配合使用——先用t8n执行交易并产出stateRoot、receiptsRoot、logsBloom等状态相关字段再把这些结果写进header.json交给 b11r 组装成最终区块从而在无全节点的情况下完整复现区块生产过程。延伸阅读命令注册与全局入口cmd/evm/main.go区块组装的完整实现cmd/evm/internal/t8ntool/block.go命令行标志定义cmd/evm/internal/t8ntool/flags.gob11r 官方规范文档cmd/evm/README.md更多测试夹具cmd/evm/testdata/21、cmd/evm/testdata/22、cmd/evm/testdata/27【免费下载链接】go-ethereumGo implementation of the Ethereum protocol项目地址: https://gitcode.com/gh_mirrors/go/go-ethereum创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Unity开发者必备:免费Live2D模型获取渠道与实战避坑指南 2026/9/19 9:35:55

Unity开发者必备:免费Live2D模型获取渠道与实战避坑指南

1. 免费Live2D模型到底能从哪里"捡"到做Unity项目的人,尤其是做虚拟主播工具、桌面宠物、视觉小说或者轻量级互动应用的朋友,大概率都绕不开一个需求:我需要一个能动的、精致的、最好还不要钱的Live2D模型。这个需求听起来简单&…

阅读更多 →
Claw系AI智能体选型与部署指南:从OpenClaw到多智能体协作 2026/9/19 9:35:55

Claw系AI智能体选型与部署指南:从OpenClaw到多智能体协作

1. 从“龙虾”乱斗说起:Claw系智能体到底在解决什么问题第一次看到“Claw系产品”这个说法,我脑子里蹦出来的画面是一群龙虾在池子里挥钳子互掐。但真把二十多款带Claw名号的东西拉出来遛一遍,你会发现它们压根不是同一物种——有的像寄居蟹&…

阅读更多 →
前端小游戏开发实战:游戏循环、碰撞检测与性能优化全解析 2026/9/19 9:35:55

前端小游戏开发实战:游戏循环、碰撞检测与性能优化全解析

简介:这是一份面向 Web 前端初学者与 JavaScript 游戏开发入门者的代码学习文档。资源包共 1 个 doc 文件,整体约 152KB,以可复制浏览的文档形式整理了一段完整的网页小游戏源码,并系统附带了 HTML 基础、JavaScript 函数、游戏对…

阅读更多 →
EOS本地开发实战:从nodeos启动到智能合约部署与ABI调试 2026/9/19 9:35:55

EOS本地开发实战:从nodeos启动到智能合约部署与ABI调试

1. 从一条命令行开始:EOS到底在折腾什么很多人第一次接触EOS,脑子里冒出来的第一个问题不是“它怎么用”,而是“它到底是个什么东西”。我当初也一样,翻了一堆资料,看到的全是“区块链操作系统”“企业级高性能公链”这…

阅读更多 →
主流美颜SDK技术评测与选型指南 2026/9/19 9:35:55

主流美颜SDK技术评测与选型指南

1. 美颜技术行业现状与评测背景手机摄像头已经成为现代人记录生活的标配工具,而美颜功能则是影响用户拍摄体验的关键因素。根据第三方数据统计,超过92%的用户在自拍时会开启美颜功能,其中67%的用户会特别关注美颜效果的自然程度。这种需求催生…

阅读更多 →
2026大模型选型指南:从性价比到行业适配的全景解析 2026/9/19 9:32:54

2026大模型选型指南:从性价比到行业适配的全景解析

选大模型这件事,现在早就不只是技术团队的烦恼了。我最近帮朋友做AI客服的需求评估,老板开口就问:“别扯那么多术语,你直接说,到底用哪个模型,一个月烧多少钱?”这个问题看似简单,实…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞