首页
/ uniond 全节点详解:Union 网络的 Cosmos SDK 区块链实现、构建方式与 CLI 使用

uniond 全节点详解:Union 网络的 Cosmos SDK 区块链实现、构建方式与 CLI 使用

2026-09-04 14:18:26作者:薛曦旖Francesca

uniond 是 Union 网络(一个面向去中心化金融的信任最小化零知识桥接协议)的规范全节点实现,验证者、RPC 节点与归档节点运营者都通过运行它参与网络。本文以 uniond/README.md 为核心,结合仓库内的源码、Go 依赖清单与 Nix 构建脚本,完整讲解 uniond 的获取与构建方式、CLI 命令体系、基于 Cosmos SDK + Wasmd + ibc-go 的节点架构、PoA 共识的过渡安排,以及面向生产环境的部署推荐方案。

一、uniond 是什么

根据 uniond/README.md 的定义,uniond 是 union 网络的规范(canonical)全节点实现。它同时面向三类运营角色:

  • 验证者(Validators):运行共识、出块并维护 validator set;
  • RPC 节点:为外部应用提供 gRPC/REST/JSON-RPC 查询接口;
  • 归档节点(Archive operators):保留完整历史状态,支持任意高度的状态查询。

从代码组织看,uniond 是一个独立的 Go 模块(uniond/go.mod,模块路径为 github.com/unionlabs/union/uniond,使用 Go 1.23.5),目录结构为:

目录/文件 职责
uniond/cmd/uniond/ 二进制入口与 Cobra 命令定义
uniond/app/ 应用装配:模块注册、IBC 栈、Wasm 集成、升级处理器
uniond/x/staking/ 自定义 staking 模块(含 keeper、CLI 与 proto)
uniond/proto/ IBC 轻客户端与 staking 模块的 protobuf 定义
uniond/uniond.nix Nix 构建定义(静态二进制与 Docker 镜像)

二、获取与构建 uniond 二进制

README 给出两种获取方式。

方式一:直接使用官方发布版本。 最省事的做法是从 union 项目的 releases 页面下载对应平台的预编译二进制。

方式二:从源码构建。 仓库提供了 Nix 构建入口:

nix build .#uniond

构建过程由 uniond/uniond.nix 定义,其中包含几个值得注意的工程细节:

  • Linux 上静态链接:使用 pkgsStatic.buildGo123Module,以 musl 工具链配合 CGO 标志 -z noexecstack -static -L${pkgs.musl}/lib -L${libwasmvm}/lib -s -w 静态链接,并启用 netgomuslc 构建标签,使二进制不依赖系统动态库。
  • Wasm 运行时以动态库形式注入:构建依赖 libwasmvm-2_2_1(即 Wasmvm 2.2.1),通过 -L 路径在 CGO 链接阶段引入。
  • Darwin 上动态链接:macOS 构建通过 makeWrapper 设置 DYLD_LIBRARY_PATH 指向 libwasmvm。
  • 版本信息注入:发布构建(uniond-release)通过 -X ldflags 将 version.Name=uniondversion.AppName=uniondversion.Commitversion.Version 写入 SDK 的版本常量。
  • 附带 Docker 镜像包uniond-image / uniond-release-imagedockerTools.buildImage 打包,入口点为 Entrypoint = ["uniond"]Cmd = ["start"],并注入 CA 证书路径环境变量 SSL_CERT_FILE,便于直接 docker run uniond start
  • 构建时执行测试(doCheck = true),源码过滤排除了 .nix.md 文件。

三、CLI 使用:命令体系与默认值

README 建议通过 --help 查看命令总览:

/path/to/uniond --help

这些命令既能启动节点,也能以命令行客户端的方式与网络交互。下面结合源码说明命令体系的实际构成。

3.1 入口与根命令

入口在 uniond/cmd/uniond/main.go:它调用 cmd.NewRootCmd() 构建根命令,追加一条自定义命令 ProofOfPossession,然后交给 Cosmos SDK 的 svrcmd.Execute,以 clienthelpers.EnvPrefix(即 UNIOND_)作为环境变量前缀、app.DefaultNodeHome 作为默认 home 目录执行。

根命令的装配逻辑在 uniond/cmd/uniond/cmd/root.go

  • 使用 depinjectuniond/app/app_config.goapp.AppConfig() 注入依赖,得到 autocli 选项、模块管理器和客户端上下文;
  • 由于 IBC 模块尚不支持依赖注入(App Wiring),根命令里手动调用 app.RegisterIBC 将 IBC 相关模块注册进 CLI(源码注释说明待 IBC 支持 App Wiring 后移除);
  • 通过 autoCliOpts.EnhanceRootCommand 为所有模块自动生成 query/tx 子命令。

根命令还显式覆盖了两个默认标志值(overwriteFlagDefaults,见 root.go):

标志 默认值 说明
--chain-id union(由 app.Name 去连字符得到) 网络标识,默认指向主网
--keyring-backend test 开发友好型密钥环后端,生产环境应显式改为 osfile

环境变量统一以 UNIOND_ 为前缀(如 UNIOND_HOMEUNIOND_CHAIN_ID),来自 svrcmd.Execute 传入的 EnvPrefix

3.2 子命令清单

initRootCmduniond/cmd/uniond/cmd/commands.go)注册了如下命令族:

命令 来源 用途
init genutilcli.InitCmd 初始化节点与 genesis 文件
in-place-testnet NewInPlaceTestnetCmd 在本地主网节点上替换验证者并启动,便于贴近主网状态做调试
testnet NewTestnetMultiNodeCmd 多节点本地测试网创建
debug / config / pruning / snapshot SDK 工具命令 调试、配置、状态修剪、快照
start server.AddCommands 启动节点等标准服务命令
status server.StatusCommand 节点状态查询
genesis / query(q) / tx / keys 标准 CLI 族 genesis 编辑、查询、交易、密钥管理
wasm ...(含扩展的 unsafe-reset-all wasmcli.ExtendUnsafeResetAllCmd CosmWasm 合约部署与管理
prove-possession [private_key] possession.go Union 特有的 BLS 密钥存在性证明

其中 prove-possession 是 Union 的定制命令:接收 base64 编码的 BN-254 私钥,对其公钥进行签名并输出十六进制签名,用于 BLS 验证者证明其对私钥的实际持有。

query 族默认包含事件交易查询、验证者、区块、区块结果等子命令(commands.go);tx 族包含签名、批量签名、多签、广播、编解码与模拟(--simulate)等标准交易工具。此外,autocli 会为每个注册模块(包括 wasm 与自定义 staking 模块)自动生成对应的 query/tx 子命令。

3.3 地址前缀与本地配置

uniond/app/config.goinit() 中固定了 Bech32 前缀并调用 Seal()

地址类型 前缀
账户地址 / 公钥 union / unionpub
验证者 operator / 公钥 unionvaloper / unionvaloperpub
共识节点 / 公钥 unionvalcons / unionvalconspub

因此 Union 链上地址形如 union1...,验证者地址形如 unionvaloper1...。应用名常量 Name = "union" 定义在 uniond/app/app.go,这也解释了 --chain-id 的默认值来源。

3.4 本地测试网调试

in-place-testnet 命令(testnet.go)允许在已有的本地主网节点上替换验证者集合并立即启动,源码注释说明其目标是让开发者把本地环境调整得尽量贴近主网条件;每个测试验证者的初始投票权为 900,000,000,000,000(valVotingPower 常量)。配合 --accounts-to-fund 可批量给指定账户注资。

四、架构:Cosmos SDK + Wasmd + ibc-go

README 的架构一节给出了总体定位:Uniond 是一个 Cosmos SDK 区块链;除核心 Cosmos SDK 模块外,它使用 Wasmd 托管虚拟化的 IBC-Union 栈,并支持 ibc-go 模块以建立原生 IBC 连接。 uniond/go.mod 证实了核心依赖的版本构成:

依赖 版本 备注
github.com/cosmos/cosmos-sdk v0.51.0 被 replace 为 unionlabs 维护的 fork
github.com/CosmWasm/wasmd v0.54.0 被 replace 为 unionlabs fork(2025-02-28 快照)
github.com/CosmWasm/wasmvm/v2 v2.2.1 Wasm 执行引擎
github.com/cometbft/cometbft v1.0.1 被 replace 为 unionlabs/cometbls fork
github.com/cosmos/ibc-go/v8 v8.5.1 被 replace 为 unionlabs fork
github.com/skip-mev/feemarket v1.1.1 被 replace 为 unionlabs fork,提供基于市场的交易费机制
cosmossdk.io/x/upgrade 标准 SDK 模块

从源码结构看,uniond 对上游 SDK、Wasmd、ibc-go 与 CometBFT 均通过 replace 指令指向 Union Labs 自有 fork,这意味着节点的二进制行为(尤其是 IBC-Union 所需的定制逻辑)以 fork 中的补丁为基础;阅读源码时应以这些 fork 的实际内容为准。

4.1 IBC 栈与 IBC-Union 集成

uniond/app/ibc.go 注册了完整的 IBC 模块栈:capability、ibc core、transfer(ICS-20)、ibc-fee(ICS-29 中继费),以及 06-solomachine07-tendermint 两个内置轻客户端。而 IBC-Union 的虚拟化部分则以 CosmWasm 合约形式存在——仓库中的 cosmwasm/ 目录即为该合约栈,包含 lightclient/(各链的 Wasm 轻客户端:ethereum、starknet、sui、aptos、cosmos 等)、core/(消息类型与轻客户端接口)、lstgatekeeperaccess-manager 等模块;uniond 侧的 uniond/app/wasm.go 负责把这些合约挂上 IBC 端口(见下文 IBC 端口的 wasm 栈装配)。

proto 侧还定义了 Union 自己的 IBC 轻客户端消息类型 uniond/proto/union/ibc/lightclients/cometbls/v1/cometbls.proto,与仓库中 11-cometbls/ 的 Go 参考实现、cairo/cometbls_light_client/ 的 Cairo 实现共同构成 CometBLS 轻客户端的多语言栈。

4.2 Wasm 运行时与费用市场

uniond/app/wasm.go 展示了 Wasm 集成的关键配置:

  • 合约内存上限固定为 32 MiBContractMemoryLimit 常量,源码注释说明这是为了“让所有节点运行在同一限制下”);
  • WasmVM 目录为 $HOME/wasm,使用 wasmvm.NewVMwasmkeeper.BuiltInCapabilities() 初始化,节点级调试开关与内存缓存大小来自 wasm 的 NodeConfig;
  • ** Ante/Post 处理器是定制版本**:setAnteHandlerwasm.go)将 CircuitBreaker、FeeMarketKeeper 等注入 HandlerOptions,说明交易在签名验证之外还经过 feemarket 的基于订单簿的费用处理;setPostHandler 在块末用账户、银行、fee market 与 staking keeper 执行后处理逻辑;
  • Wasm 的 IBC 端口中继费栈wasm.NewIBCHandler 之上再包一层 ibcfee.NewIBCMiddleware,使得通过 Wasm 合约发出的 IBC 数据包可附加中继费(ISC4 包装);
  • 快照器注册了 wasmkeeper.NewWasmSnapshotter,保证状态快照包含合约代码存储;
  • 启动时通过 msgservice.ValidateProtoAnnotations 校验全部 proto 注解。

4.3 自定义 staking 模块与升级处理器

uniond 在 SDK 的 x/staking 之外另有一套 uniond/x/staking/ 模块,包含 keeper(含 hook 机制)、msg server、CLI tx 与 proto(uniond/proto/union/staking/module/v1/module.proto),从源码结构看,这为 Union 的委托/质押流程提供了模块级的定制空间。

链的升级管理集中在 uniond/app/upgrades.goUpgrades 列表注册了 v1_1_0v1_2_0v1_3_0 三个历史升级(实现位于 uniond/app/upgrades/),setupUpgradeStoreLoaders 在启动时读取磁盘上的升级信息并在对应高度应用 store 结构迁移,setupUpgradeHandlers 则为每个升级名注册 handler。这也解释了生产环境中为何需要“包含历史二进制”的打包方式——每个升级高度可能要求特定版本的二进制。

五、Wasmd 与 Wasmvm 版本说明

README 指出 Union 主网随附 Wasmvm 2.1.2。需要注意当前仓库快照的版本演进:uniond/go.mod 已固定 wasmvm/v2 v2.2.1uniond/uniond.nix 也引用 libwasmvm-2_2_1 作为 CGO 链接库。Wasmvm 版本决定可执行合约的编译目标,节点侧版本必须与链上已部署合约的编译目标兼容——这一事实约束在从源码构建或升级节点时应予关注。

六、PoA 共识与向 PoS 的迁移

README 明确说明:Union 在主网孵化阶段(incubation stage)暂时使用 PoA(Proof of Authority),待主网就绪后会按照 PoA 项目的集成指南从 PoA 迁移到 PoS(Proof of Stake)。结合 uniond/go.modcometbft 被 replace 为 unionlabs 的 cometbls fork 这一事实,可以推断共识层的 PoA/PoS 切换逻辑实现在该 fork 内部,而非 uniond 仓库本体;对运行者而言,当前阶段运行 uniond 即代表运行 PoA 共识,迁移到 PoS 属于链上计划中的后续升级。

七、生产部署:推荐使用 unionvisor

README 的 “Production Usage” 一节建议:在生产环境运行 uniond 时,推荐使用 unionvisor

unionvisor/README.md 进一步说明:Unionvisor 是一个管理 uniond 部署的工具,负责升级生命周期管理,并与 NixOS 深度集成。其推荐用法是把 union.nixosModules.unionvisor 加进 NixOS 模块列表(示例配置见 unionvisor/usage.nix),关键配置项包括:

services.unionvisor = {
  enable = true;
  moniker = "your-testnet-moniker";
};

同时需要为验证者放行 80、443(gRPC/HTTPS)、26656(CometBFT P2P)、26657(RPC/API)四个 TCP 端口。

Unionvisor 的底层机制是使用 unionbundle——包含历史 uniond 二进制的包。借助这些历史二进制,节点可以从高度 0 开始逐步同步并在每次升级时切换到对应版本,从而完成全历史的自举与验证(bootstrapping)。这与 uniond/app/upgrades.go 中注册的 v1.1.0/v1.2.0/v1.3.0 升级 handler 相互呼应:每个历史升级点都可能要求匹配的历史二进制版本。

八、小结

  • uniond 是 Union 网络的规范 Go 全节点,同时服务验证者、RPC 与归档节点三类角色;
  • 获取二进制优先选择官方 releases 或 nix build .#uniond,Nix 构建在 Linux 上产出静态链接二进制并可进一步打包为 Docker 镜像;
  • CLI 由 Cobra + SDK autocli 构成,UNIOND_ 环境变量前缀、union 默认 chain-id、test 默认 keyring 后端等默认值均有源码出处,地址前缀固定为 union/unionvaloper/unionvalcons
  • 架构上 = Cosmos SDK(unionlabs fork)+ Wasmd(托管虚拟化 IBC-Union 合约栈)+ ibc-go(原生 IBC 连接),合约执行固定 32 MiB 内存上限并叠加 feemarket 费用市场;
  • 共识当前为 PoA,后续按计划迁移到 PoS;
  • 生产运行推荐 unionvisor,通过 NixOS 模块管理部署与全历史升级自举。

继续深入的入口:uniond/README.mduniond/app/app.gounionvisor/README.mdcosmwasm/README.mdARCHITECTURE.md

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
527
590
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
889
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
982
502
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384