ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Hardhat Ignition Core 演进全解:从 0.0.2 到 3.1.9 的部署引擎能力图谱

Hardhat Ignition Core 演进全解:从 0.0.2 到 3.1.9 的部署引擎能力图谱 Hardhat Ignition Core 演进全解从 0.0.2 到 3.1.9 的部署引擎能力图谱【免费下载链接】hardhatHardhat is a development environment to compile, deploy, test, and debug your Ethereum software.项目地址: https://gitcode.com/GitHub_Trending/ha/hardhat导读本文以 packages/ignition-core/CHANGELOG.md 为主线系统梳理 Hardhat Ignition 声明式部署引擎nomicfoundation/ignition-core从最初的原型发布到 Hardhat 3 时代的完整演进脉络。你将看到非ce同步、Gas 自动加价、create2 策略、交易追溯、模块参数、跨链验证等核心能力是如何一步步落地为可运行的源码实现的并学会如何用配置与 API 驱动这套系统完成可靠、可复现、可审计的智能合约部署。一、定位与仓库布局ignition-core 在 Hardhat 生态中的位置nomicfoundation/ignition-core是 Hardhat 的声明式合约部署核心包其 package.json 这样描述自身Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them.核心入口位于 packages/ignition-core/src/index.ts对外导出buildModule、deploy、status、listDeployments、listTransactions、wipe、trackTransaction、getVerificationInformation以及完整的事件与模块类型。整个包的运行骨架集中在src/internal下execution/执行引擎、Future 处理器、非ce 管理、Gas 决策、策略basic / create2、journal 事件 reducerreconciliation/重跑时的状态对账逐 Future 比对参数、依赖、策略等validation/对 Module API 定义的 Future 做类型与参数校验deployment-loader/内存态Ephemeral与文件态File两种部署加载器journal/执行事件序列化ndjson构成部署可重放的基础。在 monorepo 中它被 packages/hardhat-ignition插件、packages/hardhat-ignition-ethers、packages/hardhat-ignition-viem结果封装消费。CHANGELOG 中每一次版本迭代几乎都能在src中找到对应实现。本文以版本时间为轴把能力演进与源码证据一一对应。二、0.x 时代2022-10 ~ 2023-09从原型到首秀的能力地基2.1 模块化与依赖图0.0.2 → 0.0.3首个记录版本 0.0.2 即支持“将模块部署到临时本地 Hardhat 节点”并为 plan 生成执行图。0.0.3 加入了模块间的依赖关系m.call之间可互相依赖且“依赖模块返回的合约等价于依赖整个模块”。这与今天 Module API 的after参数见 0.15.9 的演进一脉相承依赖图的核心数据结构至今仍保留在 packages/ignition-core/src/internal/utils/adjacency-list.ts 与拓扑排序 packages/ignition-core/src/internal/topological-order.ts 中模块与 Future 的依赖解析是每次执行前必经的步骤。2.2 部署产物落盘与重跑0.1.00.1.0 确立了 ign、ion-core 日后最重要的两个行为部署记录真实网络部署写入./ignition/deployments/deploy-id包含已部署地址与每个合约所用 artifactabi、build-info 等。对应实现即 packages/ignition-core/src/internal/deployment-loader/file-deployment-loader.ts这也是deployed_addresses.json的来源。对账重跑reconciliation重跑时通过对账阶段允许模块在两次运行之间有一定改动。这就是 packages/ignition-core/src/internal/reconciliation/ 整个目录的职责从reconcile-artifact-contract-deployment.ts到reconcile-read-event-argument.ts每个 Future 类型都有对应的对账器。2.3 静态调用、事件参数与配置项成型0.0.5 → 0.1.20.0.5 起支持staticCall、getBytesForArtifact、以及用事件参数作为后续 Future 的入参readEventArgument0.0.6 支持--force之外的重跑失败/挂起恢复以及不调用任何函数直接给合约发 ETHsend0.0.9 引入 TypeScript 定义模块的能力0.0.10 让 Hardhat 网络的账户可在模块内使用0.0.12 支持m.call的递归类型参数。这批能力后来统一收敛为 Module Builder 与 Future 类型系统定义于 packages/ignition-core/src/types/module-builder.ts 和 packages/ignition-core/src/types/module.ts。0.1.1/0.1.2 修复了readEventArgument/staticCall结果作为contractAt地址的校验问题这类链上值 → 地址的串联至今仍是 Module API 的核心卖点。2.4 命名与配置调整0.0.8 → 0.4.00.0.8 将配置项gasIncrementPerRetry更名为gasPriceIncrementPerRetry并禁止向buildModule传入 async 函数0.0.11 用m.getArtifact取代m.getBytesForArtifact0.4.0 包名改为nomicfoundation/ignition-core并约束模块 id 与 action id以兼容 Windows 文件系统同时修复非自动出块链上的批次完成问题。至此Module API 的主干与部署落盘机制已经完备为 0.11.0 的公开首秀做好了准备。三、0.11 ~ 0.15 时代2023-10 ~ 2024-12公开首秀与生产化打磨3.1 公开首秀EIP-1559 与自动 Gas 加价0.11.0 / 0.3.00.3.0 引入了EIP-1559 交易支持与自动 Gas 加价automatic gas bumping0.11.0 正式公开启动。自动加价逻辑至今仍是部署可靠性的核心在 packages/ignition-core/src/internal/defaultConfig.ts 中可以看到默认timeBeforeBumpingFees 3 * 60 * 10003 分钟、maxFeeBumps 4最多加价 4 次、requiredConfirmations 5在自动出块的网络automined上确认数降为DEFAULT_AUTOMINE_REQUIRED_CONFIRMATIONS 1。0.11.1 还专门为 deploy 任务中的 Gas 加价增加了可视提示。3.2 非ce 同步机制的确立0.11.0 → 3.1.90.11.0 修复了“重跑时的非ce 校验失败”与“Future 的 sender 必须满足非ce 同步检查”两个问题这正是 nonce sync 机制的开端也是后续多个版本持续打磨的领域0.13.2 加入内存池查询重试以缓解传播慢导致的错误3.1.8 在非ce 校验中遇到 stale pending count 时先重试再报错对应 issue #80923.1.9 修复了非ce 同步中的一个 off-by-one该问题可能让部署在“用户替换交易少一个确认数”时错误继续。源码实现集中在两个文件packages/ignition-core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts 负责把本地状态与网络对齐比对pendingCount、latestCount与confirmedBlockNumber最新块号减requiredConfirmations加 1从而判定 Ignition 的待处理交易是被用户替换ONCHAIN_INTERACTION_REPLACED_BY_USER还是被丢弃ONCHAIN_INTERACTION_DROPPEDpackages/ignition-core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts 负责为新交易分配非ce以maxUsedNonce 1为期望值与节点pending交易计数比对当节点计数偏低时以 200ms 间隔重试最多 5 次等待内存池同步最终不匹配则抛NONCE_TOO_HIGH/NONCE_TOO_LOW模拟失败未发出的交易可通过revertNonce归还非ce。注意一个设计取舍如果用户替换了 Ignition 的交易Ignition 会重新分配新非ce 而不是复用原非ce——因为“交易被节点丢弃不代表整个网络忘记它”复用用户非ce 可能产生意外结果。这正是 3.1.9 修复的 off-by-one 所守护的语义。3.3 重跑与批量控制0.11.0 补丁集0.11.0 集中修复了重跑相关的三个错误被已发送交易阻塞IGN403、跨多批次重跑触发错误IGN405、以及“重跑时非ce 校验失败”。这类状态错误通过 wiper 机制解决wipe(futureId)清除某个 Future 的历史状态以允许其重新执行对应公开 API packages/ignition-core/src/wipe.ts内部实现见src/internal/wiper.ts。批量执行由 packages/ignition-core/src/internal/batcher.ts 负责把可并行、相互无依赖的 Future 聚合到同一批次提升吞吐。3.4 策略系统与 create20.15.00.15.0 引入create2 策略。策略是可插拔的执行器定义于 packages/ignition-core/src/strategies/basic-strategy.ts默认策略每个部署/调用/发送对应单笔交易每个静态调用对应一次eth_callcreate2-strategy.ts通过 CreateX 工厂按盐值部署得到确定性地址resolve-strategy.ts根据用户传入的strategy与strategyConfig解析具体策略。策略配置类型在 packages/ignition-core/src/types/deploy.ts 中定义basic无配置create2需要{ salt: string }。创建合约的字节码编码位于src/internal/execution/strategy/createx-artifact.ts。这为预言机地址、升级代理等“地址敏感”场景提供了确定性部署手段。3.5 CLI 交易追溯与区块浏览器链接0.15.6 ~ 0.15.90.15.6可视化 UI 支持对 mermaid 图缩放和平移新增gasPrice、disableFeeBumping配置L2 Gas 逻辑更新支持 JSON5 格式模块参数新增writeLocalhostDeployment标志控制是否在临时 Hardhat 网络部署时落盘。0.15.7新增 CLI 命令ignition transactions按部署 id 列出所有已发送交易支持$global全局模块参数。0.15.8transactions命令正确序列化bigint加强全局参数校验。0.15.9脚本部署时可开启标准 UIdisplayUi: true模块可在after中作为依赖ignition transactions输出附带区块浏览器链接脚本部署时模块参数可通过绝对路径 JSON 文件传入parameters选项。对应的核心 API 实现位于 packages/ignition-core/src/list-transactions.ts、packages/ignition-core/src/status.ts 与 packages/ignition-core/src/list-deployments.ts。3.6 Gas 相关的链特化修补0.15.1 ~ 0.15.6这个区间大量修补集中在 Gas 与链适配上侧面说明了主网之外的部署可靠性考量0.15.1为maxFeePerGas增加可配置上限对应deploy参数maxFeePerGasLimit见 packages/ignition-core/src/deploy.tsignition status显示 chainIdautomine 检测更健壮getCode用法对齐以太坊 RPC 标准。0.15.2支持maxPriorityFeePerGas配置优先使用 RPCeth_maxPriorityFeePerGas计算 Gas支持零 Gas 链如私有 Besu。0.15.3 / 0.15.5将 BNB Chain、BNB Test Chain 排除在零费配置之外。0.15.4修复地址参数大小写不一致checksum问题对余额不足给出更友好的错误信息。0.15.5新增m.encodeFunctionCall修复带数组参数的重载函数调用、create2 部署时hardhat_setBalance的 anvil 响应、循环/深层嵌套导入下的 verify 解析。3.7 验证与前端细节0.12.0 → 0.15.90.12.0加入合约验证verify支持改进“费用超过区块 Gas 上限”的错误提示。0.13.0增强 artifact 与 ABI 类型以支持Viem 类型推断修复默认 sender 大小写识别。0.13.1修复非 tty 环境下使用process.stdout的 bug。0.13.2优化 Module API 的 TypeScript 文档注释IntelliSense支持模块参数默认值为账户。0.15.9修复使用外部 artifact 时 verify 与ignition status的错误。模块参数解析统一走resolve-module-parameter.tssrc/internal/utils/JSON/JSON5 两种格式都能加载。四、3.x 时代2025Hardhat 3 集成与工程化收敛4.1 Hardhat 3 首版3.0.03.0.0 是 Hardhat 3 的首个发布ignition-core 作为其部署核心随之进入 3.x 线。随后多个补丁版本完成对硬链接3.0.1修复类型守卫使m.encodeFunctionCall被正确归类为“不提交交易的 Future”3.0.2增加守卫阻止同时多次调用ignition.deploy(...)issue #64403.0.3新增 Linea 网络验证支持3.0.5让 ignition UI 与 Ledger 等插件良好协作3.0.6恢复 v3 升级中丢失的 gas 配置在用户配置中暴露 ignition 重试循环变量issue #73033.0.7 ~ 3.0.8依赖升级hardhat-utils主版本。3.0.9修复使用完全限定名FQN合约的验证支持不在 viem 内置链列表中的自定义链issue #7763。4.2 工程化与体验优化3.1.0 → 3.1.93.1.0支持在所有已启用的验证服务上验证如 Sourcifyissue #75383.1.2修复 Ignition Ledger UI 交互与 Hardhat 3 用户中断流程集成hre.network.connect()更名为hre.network.create()语义更明确3.1.3await 所有返回的 Promise 以提升可调试性3.1.4用轻量自研实现替换 debug 日志库性能提升3.1.5将 Ignition 核心 API 标记为公开进入生成的 API 文档小幅性能优化3.1.6导出./package.json子路径供消费者读取包清单3.1.7修复m.readEventArgument在解码带 indexed 动态兄弟参数事件时的问题issue #83383.1.8非ce 校验中处理内存池滞后重试替代直接报错3.1.9修复非ce 同步 off-by-one见 3.2 节cbor2、immer更新到最新主版本更新依赖以减少安装警告。其中 3.1.4 的“debug 日志库替换”与 3.1.5 的“性能优化”可从依赖清单印证当前 packages/ignition-core/package.json 的 dependencies 中已不含独立 debug 库而保留immer、cbor2、lodash-es、ndjson、ethers等运行时依赖。五、核心部署参数与默认值速查综合 CHANGELOG 提到的配置演进与 packages/ignition-core/src/internal/defaultConfig.ts 的实现DeployConfig的完整字段如下类型定义见 packages/ignition-core/src/types/deploy.ts配置项默认值说明引入版本blockPollingInterval1000 ms轮询新区块间隔0.0.5pollingIntervaltimeBeforeBumpingFees180000 ms交易确认前等待多久开始加价0.3.0maxFeeBumps4单笔交易最大加价次数0.3.0requiredConfirmations5automined 网络为 1视为已确认所需区块确认数0.1.0 起disableFeeBumpingfalse关闭全部加价L2 场景0.15.6maxRetries10getTransactionReceipt最大重试次数0.13.2 相关retryInterval1000 ms收据查询重试间隔0.13.2 相关其余可由deploy()直接传入的运行时参数包括maxFeePerGasLimit0.15.1、maxFeePerGas、maxPriorityFeePerGas0.15.2、gasPrice、disableFeeBumping以及策略相关strategy/strategyConfig0.15.0。在自动出块automined网络上deploy()会自动将requiredConfirmations降为 1这一逻辑写在 packages/ignition-core/src/deploy.ts。六、典型工作流一次带可靠性的 Ignition 部署把 CHANGELOG 中零散的能力串起来一次完整的部署会经历以下阶段定义模块buildModule描述合约实例与操作部署、contractAt、call、staticCall、send、encodeFunctionCall可声明依赖与链上参数。校验validationvalidate()检查每个 Future 的 artifact、参数与类型src/internal/validation/。网络检查checkAutominedNetwork决定 automined 下的确认数与加价策略。非ce 同步getNonceSyncMessages对比 pending/latest/confirmed 计数识别用户替换或交易被丢弃JsonRpcNonceManager随后为后续交易分配非ce。执行Deployer按拓扑序推进批次BasicStrategy/Create2Strategy 提交交易若超时未确认则自动加价默认 3 分钟等待、最多 4 次。落盘FileDeploymentLoader写入ignition/deployments/deploy-id/地址、artifact、journal。重跑下次运行时 reconciliation 阶段对账变化过大则报RECONCILIATION_ERROR出错/超时的 Future 可用wipe清掉状态后重试。审计listDeployments/listTransactions/status查询历史verify走 Etherscan 或 Sourcify 等服务完成验证。七、结语从 2022 年的原型0.0.2到今天 Hardhat 3 时代的稳定核心3.1.9ignition-core 的 CHANGELOG 记录的正是一条“声明式部署”从概念走向生产可靠的路线图依赖图与对账重跑解决可复现性EIP-1559 与自动加价解决交易确认的鲁棒性非ce 同步解决多账户与用户替换交易的边界情况策略系统与 create2 扩展了部署方式的表达力验证与交易追溯则把部署从“跑通一次”推进到“可审计、可验证”。理解这份演进史也就理解了 Hardhat Ignition 在 packages/ignition-core/src 里每一处设计选择的初衷。如果你正在评估或使用 Hardhat Ignition本文可以当作一张“能力地图”当你需要确定性地址时查 create2 策略当你遭遇非ce 或内存池同步问题时读 nonce 相关源码当你想调整重试与加价行为时改 defaultConfig.ts 里的默认值并保持与 Hardhat v3 用户配置的同步即可。【免费下载链接】hardhatHardhat is a development environment to compile, deploy, test, and debug your Ethereum software.项目地址: https://gitcode.com/GitHub_Trending/ha/hardhat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进