news 2026/9/16 14:37:49

Chainlink 本地 CRE 分片拓扑解析:workflow-gateway-sharded-5-dons 的 7 DON 架构与能力矩阵

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Chainlink 本地 CRE 分片拓扑解析:workflow-gateway-sharded-5-dons 的 7 DON 架构与能力矩阵

Chainlink 本地 CRE 分片拓扑解析:workflow-gateway-sharded-5-dons 的 7 DON 架构与能力矩阵

【免费下载链接】chainlinknode of the decentralized oracle network, bridging on and off-chain computation项目地址: https://gitcode.com/GitHub_Trending/ch/chainlink

本文以 Chainlink 仓库中自动生成的拓扑文档 workflow-gateway-sharded-5-dons.md 为骨架,结合其对应配置文件 workflow-gateway-sharded-5-dons.toml 与system-tests/lib/crecore/scripts/cre/environment等源码实现,完整讲解 Chainlink 本地 CRE(Capabilities Runtime Environment)中"分片(sharded)"类多 DON 拓扑的部署形态。读完本文,你将掌握:如何读懂该拓扑的能力矩阵与 7 个 DON 的分工、如何从 TOML 配置还原每个节点的角色与端口、拓扑文档的生成机制与校验命令,以及分片拓扑背后的 Ring OCR3 与 ShardConfig 合约启动流程。

一、文档定位:由topology generate自动生成的拓扑说明书

在 Chainlink 仓库中,core/scripts/cre/environment/docs/topologies/下的每一份*.md都是自动生成的,其源头是 TOPOLOGIES.md 中登记的各份 TOML 拓扑配置。索引表明确记载:

ConfigClassDONs
configs/workflow-gateway-sharded-5-dons.tomlsharded7

生成机制在 environment/topology.go 的TopologyCmd中实现,入口命令为:

cd core/scripts/cre/environment go run . topology list # 列出 configs/ 下所有可用拓扑 go run . topology show -c configs/workflow-gateway-sharded-5-dons.toml # 查看单个拓扑 go run . topology generate # 重新生成全部拓扑文档与索引 go run . topology generate --check # 校验文档是否过期

其中isTopologyConfig(topology.go)会检查一份 TOML 是否同时具备nodesetsblockchainsjdinfra四个区块,只有四者齐全才会被识别为合法拓扑配置。因此本文档中的三个元数据字段ConfigClassInfra均直接来自对应 TOML:

  • Config:configs/workflow-gateway-sharded-5-dons.toml
  • Class:sharded
  • Infra:docker

Class字段并非手工填写,而是由 topologyviz.go 的classifyTopology函数动态判定:只要存在任意 DON 的ShardIndex > 0或其DONTypes包含shard,即归类为sharded

二、拓扑总览:1 个网关 + 6 个分片 = 7 个 DON

该拓扑由 7 个 DON 组成,按功能可划分为两类:

DON节点数DON 类型节点角色分工
bootstrap-gateway1bootstrap,gatewaybootstrap / gateway负责 DON 引导(bootstrap)与网关流量(gateway)
shard0~shard5各 4shard,workflowplugin分片工作流 DON,执行工作流并承载本地能力

DON 总节点数为1 + 6 × 4 = 25,且全部 DON 均声明支持 EVM 链1337, 2337,且均不对外暴露远程能力Exposes remote capabilities: false)。

bootstrap-gateway节点在 TOML 配置 中以nodes = 1don_types = ["bootstrap", "gateway"]roles = ["bootstrap", "gateway"]声明,并额外通过custom_ports暴露两个关键入站端口:

# 5002 is the web API capabilities port for incoming requests # 15002 is the vault port for incoming requests custom_ports = ["5002:5002","15002:15002"]

这意味着外部请求(Web API 能力调用、vault 请求)都汇聚到bootstrap-gateway这一单一入口,再由网关路由到各分片。

三、能力矩阵:能力在 DON 间的"放置真相"

能力矩阵(Capability Matrix)被文档明确标注为"source of truth for capability placement by DON",即能力在哪个 DON 上运行、以何种模式(local/-)存在,都以这张表为准:

Capabilitybootstrap-gatewayshard0shard1shard2shard3shard4shard5
consensus-locallocallocallocallocallocal
cron-locallocallocallocallocallocal
don-time-locallocallocallocallocallocal
evm-local (1337,2337)local (1337,2337)local (1337,2337)local (1337,2337)local (1337,2337)local (1337,2337)
http-action-local-----
http-trigger-local-----
vault-local-----

读表的要点:

  1. -表示该 DON 未声明此能力,即工作流在该分片上运行到对应步骤时会失败或无法调度;
  2. local表示能力以本地插件形式装载在该 DON 的节点内,非远程代理;
  3. local (1337,2337)表示链相关能力绑定到具体 EVM 链 ID——evm能力在配置中实际写作evm-1337evm-2337两个能力标志。

矩阵中的local/-判定由 topologyviz.go 的buildCapabilityMatrix生成:它先按BaseFlag(去掉链 ID 后缀后的能力名)聚合并按名称排序,随后对每个 DON 标记localremote-exposed。链 ID 后缀的解析逻辑splitCapabilityFlag(topologyviz.go)会把evm-1337拆成evm+ 链 ID1337——这也是矩阵中evm行出现(1337,2337)的原因。

分片能力的差异化放置

从矩阵可以直观看到本拓扑的核心设计意图:

  • cronconsensusdon-timeevm是"全分片标配":6 个分片各自独立承载,任何分片都能独立完成基于 cron/时间/共识/EVM 的工作流;
  • http-actionhttp-triggervault仅放置在shard0:这类"与外部 HTTP/敏感凭据相关"的能力被刻意收敛到单一分片。TOML 中shard1~shard5的注释说明了原因:"add vault, http-action, http-trigger, when gateway can support more than 1 DON per service"——即当前网关对每个服务仅支持单 DON 挂载,因此这类能力暂时只能放在一个分片。

配置侧的对应关系:shard0capabilities列表为["vault", "cron", "http-action", "http-trigger", "consensus", "don-time", "evm-1337", "evm-2337"](TOML 第 50 行),而shard1~shard5则缺省为["cron", "consensus", "don-time", "evm-1337", "evm-2337"]

四、逐 DON 解剖:从文档字段到 TOML 配置

文档为每个 DON 列出了TypesNodesRolesEVM chainsExposes remote capabilities五个字段。这些字段与 TOML 的映射关系如下:

4.1shard0:分片组长(shard leader)

Types: shard, workflow Nodes: 4 Roles: plugin EVM chains: 1337,2337 Exposes remote capabilities: false

shard0是唯一显式写出 4 个node_specs的 nodeset(TOML 第 41-95 行),其中node 0额外暴露了两个调试端口:

[[nodesets.node_specs]] roles = ["plugin"] [nodesets.node_specs.node] docker_ctx = "../../../.." docker_file = "core/chainlink.Dockerfile" docker_build_args = { "CL_IS_PROD_BUILD" = "false" } custom_ports = ["60051:50051", "19876:9876"] user_config_overrides = ""
  • 60051:50051对应 ShardOrchestrator 的 gRPC 端口;
  • 19876:9876对应 Arbiter 端口;

配置注释明确说明使用高位端口(60051、19876)是为了避免与其他服务冲突。结合 sharding.go 的getShardLeaderDON(按ShardIndex == 0寻找组长),可以确认shard0即分片组长:Ring OCR3 的 Ring 任务只创建在组长 DON 上。

4.2shard1~shard5:通用分片

这 5 个 nodeset 结构完全一致(以shard1为例):

[[nodesets]] nodes = 4 name = "shard1" don_family = "test-don-family" don_types = ["workflow", "shard"] shard_index = 1 override_mode = "all" http_port_range_start = 10100 env_vars = { CL_EVM_CMD = "" } capabilities = ["cron", "consensus", "don-time", "evm-1337", "evm-2337"] registry_based_launch_allowlist = ["cron-trigger@1.0.0", "dontime@1.0.0"] [nodesets.db] image = "postgres:12.0" port = 13100

要点:

  • override_mode = "all"表示下方单个node_specs会应用到该 nodeset 的所有 4 个节点(对比shard0override_mode = "each"+ 4 个独立node_specs);
  • shard_index从 1 递增到 5,是分片在 Ring 中的唯一标识;
  • 每个分片有独立的 PostgreSQL 实例(postgres:12.0,端口 13100~13500 递增);
  • http_port_range_start从 10100 递增到 10500,为各分片节点分配独立的 HTTP 端口段;
  • registry_based_launch_allowlist限定了通过 registry 启动的触发器插件版本(cron-trigger@1.0.0dontime@1.0.0)。

4.3bootstrap-gateway:引导与网关合一

Types: bootstrap, gateway Nodes: 1 Roles: bootstrap, gateway EVM chains: 1337,2337 Exposes remote capabilities: false

在 TOML 中通过don_types = ["bootstrap", "gateway"]声明双重职责,并显式给出supported_evm_chains = [1337, 2337]。它不声明任何capabilities,仅作为工作流 DON 与外部世界之间的流量入口。

五、分片拓扑的底层原理:Ring OCR3 与 ShardConfig

sharded类拓扑与普通多 DON 拓扑的本质差异在于:分片之间需要通过链上的分片协调机制保证共识与状态一致性。这一机制在 sharding.go 的SetupSharding中以六步流程落地:

  1. 校验分片拓扑:调用ValidateShardTopology,确保分片数量、shard_index=0的组长唯一性等约束成立(校验逻辑见 sharding_test.go,其中覆盖了"多个shard_index=0"、"找不到shard_index=0"等错误场景);
  2. 部署 ShardConfig 合约:以len(shardDONs)作为InitialShardCount部署分片配置合约;
  3. 部署 Ring OCR3 合约:为分片 Ring 部署多链共识合约;
  4. 获取 Ring P2P bootstrap URL:从 bootstrap DON 收集 P2P 引导地址;
  5. 在组长 DON 上创建 Ring 任务
  6. 等待 ConfigPoller filter 注册后配置 OCR3

分片的 DON 类型在 system-tests/lib/cre/don.go 中以ShardIndex uint \toml:"shard_index"`建模,而classifyTopology也正是读取该字段来判定sharded` 类别。

六、本地实操:启动该拓扑并部署工作流

6.1 环境准备

先在 core/scripts/cre/environment 目录下完成依赖准备(详见go run . setup),然后通过CTF_CONFIGS环境变量指定拓扑并启动:

cd core/scripts/cre/environment export CTF_CONFIGS=configs/workflow-gateway-sharded-5-dons.toml go run . env start --auto-setup

启动流程(environment.go)的关键行为:

  • 若设置--auto-setup,会先执行RunSetup
  • 框架会自动把 capability_defaults.toml前置拼接CTF_CONFIGS之前(setDefaultCtfConfigs),因此最终生效的是"默认能力配置 + 拓扑配置"的组合;
  • 设置TESTCONTAINERS_RYUK_DISABLED=true,避免命令结束时 Ryuk 销毁容器;
  • 清理历史state目录后开始拉起容器。

注意:若不设置CTF_CONFIGSenv start会默认使用configs/workflow-gateway-capabilities-don.toml(见 environment.go)。

6.2 部署工作流时的 DON 选择

分片拓扑下部署工作流必须明确目标 DON,否则会因为存在多个 workflow DON 而报错。选择逻辑实现在 workflow_don_resolver.go 的ResolveWorkflowDONMetadata,优先级为:

  1. --workflow-don-name:按nodesets.name精确匹配(如shard0);
  2. --don-family:按don_family匹配,多个分片共享同一 family 时必须再带--shard-index
  3. 若拓扑中恰好只有一个 workflow DON 则自动选中。
# 方式一:显式指定分片名 go run . workflow deploy -w ./examples/workflows/v2/cron/main.go --compile -n cron_example \ --workflow-don-name shard0 # 方式二:按 family + shard index 定位 go run . workflow deploy -w ./examples/workflows/v2/cron/main.go --compile -n cron_example \ --don-family test-don-family --shard-index 0

resolveWorkflowDONByFamily(workflow_don_resolver.go)会在don_family命中多个分片且未指定--shard-index时报错,提示set --shard-index or --workflow-don-name——这正是本拓扑(6 个分片同属test-don-family)的典型使用场景。

6.3 校验放置是否与预期一致

修改拓扑配置后,务必重新生成并核对矩阵:

go run . topology show -c configs/workflow-gateway-sharded-5-dons.toml go run . topology generate

生成的产物包括docs/topologies/*.mddocs/TOPOLOGIES.md索引,generate --check可校验其是否过期。官方实践指南(docs/local-cre/environment/topologies.md)强调:sharded 及专用拓扑只应在测试或功能确实需要分片能力时选用——如果工作流仅依赖cronconsensus等本地能力,使用更简单的拓扑(如workflow-gateway-don.tomlworkflow-gateway-capabilities-don.toml)即可获得更快的启动与迭代速度。

七、小结

workflow-gateway-sharded-5-dons是 Chainlink 本地 CRE 中规模最大的分片拓扑之一:bootstrap-gateway承担引导与网关入口,shard0作为组长承载http-action/http-trigger/vault等受限能力,shard1~shard5各自以 4 节点并行承载cron/consensus/don-time/evm通用能力。其能力矩阵文档由go run . topology generate自动维护,可作为能力放置的"单一事实来源";部署工作流时则需借助--workflow-don-name--don-family --shard-index精确路由。理解了这份拓扑,也就掌握了 Chainlink CRE 从"单 DON"到"多分片协同"的扩展路径及其链上协调机制(Ring OCR3 + ShardConfig)的运作方式。

【免费下载链接】chainlinknode of the decentralized oracle network, bridging on and off-chain computation项目地址: https://gitcode.com/GitHub_Trending/ch/chainlink

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 14:34:56

SpringBoot智慧校园系统源码跑通实战指南

简介:本资源是一套基于SpringBoot开发的智慧校园管理系统完整源码,面向Java全栈初学者与高校课程设计者,提供可运行、可二次开发的B/S架构校园信息化解决方案。系统涵盖用户管理、图片与视频素材库等核心模块,技术栈包括Java 1.8、…

作者头像 李华
网站建设 2026/9/16 14:34:36

双通道语音增强:基于NLMS/DNLMS的自适应滤波实现与Matlab解析

简介:这是一份面向Matlab语音处理学习与研发人员的双通道语音增强算法源码包,针对嘈杂环境下的语音通信场景,采用归一化最小均方(NLMS)自适应滤波方法,可有效消除环境噪声并保持语音可懂度,实测…

作者头像 李华
网站建设 2026/9/16 14:32:59

51单片机电子密码锁系统设计:矩阵键盘与EEPROM存储详解

简介:面向电子类专业课程设计与毕业设计的电子密码锁仿真资源包,基于51单片机完成软硬件设计,适合学习矩阵键盘、LCD显示、密码校验与报警逻辑等知识点的读者参考。包内共18个文件,以C语言源程序、Proteus仿真工程(DSN…

作者头像 李华
网站建设 2026/9/16 14:30:14

Dify 里 Chrome MCP 工具正常,Agent 却不动?TaoToken 这样调模型通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/16 14:30:01

STM32+ESP8266+OneNet:物联网数据上报完整指南

简介:面向ESP8266与STM32F103ZET6开发初学者的智能物联实战资料,演示将DHT11温湿度数据通过ESP8266模块上传至OneNET云平台。内容涵盖器件选型、引脚接线说明(ESP8266-01S与正点原子模组均适用)、云端产品与设备创建、固件烧录方法…

作者头像 李华