zh
开发构建
协议架构
模块

消息(Messages)

MsgUpdatePolicies

UpdatePolicies 用于更新策略。

message MsgUpdatePolicies {
	string creator = 1;
	Policies policies = 2;
}

MsgUpdateChainInfo

UpdateChainInfo 用于更新链信息对象。 当提供的链在链信息对象中不存在时会新增;若已存在则更新。

message MsgUpdateChainInfo {
	string creator = 1;
	pkg.chains.Chain chain = 3;
}

MsgRemoveChainInfo

RemoveChainInfo 会移除指定链 ID 的链信息。

message MsgRemoveChainInfo {
	string creator = 1;
	int64 chain_id = 2;
}

MsgAddAuthorization

AddAuthorization 用于新增授权。如果授权已存在,将以提供的策略覆盖。 该消息应由管理员策略账户调用。

message MsgAddAuthorization {
	string creator = 1;
	string msg_url = 2;
	PolicyType authorized_policy = 3;
}

MsgRemoveAuthorization

RemoveAuthorization 会从列表中移除授权,应由管理员策略账户调用。

message MsgRemoveAuthorization {
	string creator = 1;
	string msg_url = 2;
}

概述

crosschain 模块负责跟踪跨链交易(CCTX)的入站与出站流程。

与该模块交互的主要参与者是观察者验证者(Observers)。观察者运行链下程序 zetaclient,监听连接链上的入站交易、ZetaChain 上待处理的出站交易,以及连接链上的出站交易。

在观察到入站或出站交易后,观察者会参与投票流程。

投票

当观察者为某笔交易提交投票时,会创建一个 ballot(若此前不存在)。观察者可以对该投票单投票。当投票数量达到 BallotThreshold 时,投票单即视为“已完成”。

将投票单推进到“已完成”状态的最后一票会触发跨链交易执行并支付相关 Gas 成本。

投票单完成后提交的投票会被丢弃。

入站交易

入站交易指在连接链上观察到的跨链交易。观察者通过广播 MsgVoteInbound 对入站交易进行投票。

将投票单推进到“已完成”状态的最后一票会触发跨链交易执行。

若目标链是 ZetaChain 且 CCTX 不包含消息,则会将 ZRC-20 代币存入 ZetaChain 上的账户。

若目标链是 ZetaChain 且 CCTX 包含消息,则会存入 ZRC-20 代币并在 ZetaChain 上调用合约。合约地址与参数由消息提供。

若目标链不是 ZetaChain,则会将交易状态更新为 “pending outbound”,并按出站交易流程处理该 CCTX。

出站交易

Pending Outbound

观察者会在 ZetaChain 上监听待处理的出站交易。为处理此类交易,观察者需要参与 TSS 密钥签名(keysign)流程,完成签名后将签名交易广播至连接链。

Observed Outbound

观察者会在连接链上监控已广播的出站交易。一旦交易在连接链上“确认”(或“被打包”),观察者会向 ZetaChain 发送 VoteOutbound 消息进行投票。

当投票超过阈值后,投票流程完成,交易状态更新为最终状态。

权限

Message管理策略账户观察者验证者
MsgVoteTSS
MsgGasPriceVoter
MsgVoteOutbound
MsgVoteInbound
MsgAddOutboundTracker
MsgRemoveOutboundTracker

状态

模块在状态中存储以下信息:

  • 出站交易列表
  • 链的 nonce 列表
  • 链的最新高度列表
  • 跨链交易列表
  • 入站交易与跨链交易之间的映射
  • TSS 密钥
  • 观察者提交的连接链 Gas 价格

消息(Messages)

MsgAddOutboundTracker

AddOutboundTracker 在出站交易跟踪器中新增记录。仅管理员策略账户与观察者验证者可在无需证明情况下广播该消息。如果找不到待处理的 CCTX,而该链 ID 与 nonce 已存在记录,则会移除该跟踪器。

message MsgAddOutboundTracker {
	string creator = 1;
	int64 chain_id = 2;
	uint64 nonce = 3;
	string tx_hash = 4;
	pkg.proofs.Proof proof = 5;
	string block_hash = 6;
	int64 tx_index = 7;
}

MsgAddInboundTracker

AddInboundTracker 会在入站交易跟踪器中新增记录。

message MsgAddInboundTracker {
	string creator = 1;
	int64 chain_id = 2;
	string tx_hash = 3;
	pkg.coin.CoinType coin_type = 4;
	pkg.proofs.Proof proof = 5;
	string block_hash = 6;
	int64 tx_index = 7;
}

MsgRemoveInboundTracker

RemoveInboundTracker 会在存在时移除入站跟踪器。

message MsgRemoveInboundTracker {
	string creator = 1;
	int64 chain_id = 2;
	string tx_hash = 3;
}

MsgRemoveOutboundTracker

RemoveOutboundTracker 会按链 ID 与 nonce 移除出站交易跟踪器中的记录。 授权:管理员策略第 1 组。

message MsgRemoveOutboundTracker {
	string creator = 1;
	int64 chain_id = 2;
	uint64 nonce = 3;
}

MsgVoteGasPrice

VoteGasPrice 提交指定区块高度的连接链 Gas 价格信息。每位验证者提交的价格会单独记录,并更新中位数索引。

仅观察者验证者可广播此消息。

message MsgVoteGasPrice {
	string creator = 1;
	int64 chain_id = 2;
	uint64 price = 3;
	uint64 priority_fee = 6;
	uint64 block_number = 4;
	string supply = 5;
}

MsgVoteOutbound

VoteOutbound 为在连接链上已广播并确认的出站交易投票。若这是首个投票,会创建新的投票单;当投票达到阈值时,投票单完成并处理出站交易。

若观测成功,将铸造等量于 burnedminted 差值的 ZETA,并存入模块账户。

若观测失败,则根据之前的状态处理:

  • 若之前状态为 PendingOutbound,将创建新的回退交易。为支付回退交易费用,会用 CCTX 携带的代币在 ZetaChain 上的 Uniswap V2 合约中兑换目标链的 ZRC-20 Gas 代币,然后销毁。更新 nonce,若成功则状态改为 PendingRevert
  • 若之前状态为 PendingRevert,则 CCTX 作废。

仅观察者验证者可广播此消息。

message MsgVoteOutbound {
	string creator = 1;
	string cctx_hash = 2;
	string observed_outbound_hash = 3;
	uint64 observed_outbound_block_height = 4;
	uint64 observed_outbound_gas_used = 10;
	string observed_outbound_effective_gas_price = 11;
	uint64 observed_outbound_effective_gas_limit = 12;
	string value_received = 5;
	pkg.chains.ReceiveStatus status = 6;
	int64 outbound_chain = 7;
	uint64 outbound_tss_nonce = 8;
	pkg.coin.CoinType coin_type = 9;
	ConfirmationMode confirmation_mode = 13;
}

MsgVoteInbound

VoteInbound 为在连接链上观察到的入站交易投票。若为首个投票,会创建新的投票单;当投票达到阈值时,投票单完成并创建新的 CCTX。

若接收链为 ZetaChain,则调用 HandleEVMDeposit。若存入的是 ZETA,则调用 MintZetaToEVMAccount 将代币铸造至接收账户;若是连接链的 Gas 代币或 ERC-20,则调用 ZRC-20 的 deposit,并在消息非空时调用系统合约的 depositAndCall 执行 ZetaChain 上的全链合约。若成功,CCTX 状态更新为 OutboundMined

若接收链为连接链,则调用 FinalizeInbound 以准备将 CCTX 作为出站交易处理。为支付出站交易费用,会用 CCTX 携带代币在 ZetaChain 上的 Uniswap V2 合约中兑换目标链的 ZRC-20 Gas 代币并销毁。更新 nonce,若成功则状态改为 PendingOutbound

仅观察者验证者可广播此消息。

message MsgVoteInbound {
	string creator = 1;
	string sender = 2;
	int64 sender_chain_id = 3;
	string receiver = 4;
	int64 receiver_chain = 5;
	string amount = 6;
	string message = 8;
	string inbound_hash = 9;
	uint64 inbound_block_height = 10;
	uint64 gas_limit = 11;
	pkg.coin.CoinType coin_type = 12;
	string tx_origin = 13;
	string asset = 14;
	uint64 event_index = 15;
	ProtocolContractVersion protocol_contract_version = 16;
	RevertOptions revert_options = 17;
	CallOptions call_options = 18;
	bool is_cross_chain_call = 19;
	InboundStatus status = 20;
	ConfirmationMode confirmation_mode = 21;
}

MsgWhitelistERC20

WhitelistERC20 会部署新的 ZRC-20、创建外部代币对象,并发起跨链交易在外部链上将该 ERC-20 加入白名单。 授权:管理员策略第 1 组。

message MsgWhitelistERC20 {
	string creator = 1;
	string erc20_address = 2;
	int64 chain_id = 3;
	string name = 4;
	string symbol = 5;
	uint32 decimals = 6;
	int64 gas_limit = 7;
	string liquidity_cap = 8;
}

MsgUpdateTssAddress

UpdateTssAddress 用于更新 TSS 地址。

message MsgUpdateTssAddress {
	string creator = 1;
	string tss_pubkey = 2;
}

MsgMigrateTssFunds

MigrateTssFunds 将资金从当前 TSS 迁移至新 TSS。

message MsgMigrateTssFunds {
	string creator = 1;
	int64 chain_id = 2;
	string amount = 3;
}

MsgAbortStuckCCTX

AbortStuckCCTX 用于终止卡住的 CCTX。授权:管理员策略第 2 组。

message MsgAbortStuckCCTX {
	string creator = 1;
	string cctx_index = 2;
}

MsgRefundAbortedCCTX

RefundAbortedCCTX 用于为已终止的 CCTX 退款。它会验证 CCTX 是否已终止且尚未退款,并检查退款地址有效性,然后将金额退还给退款地址,并将 CCTX 标记为已退款。相关退款地址与金额逻辑可参考文档中的 GetRefundAddressGetAbortedAmount

message MsgRefundAbortedCCTX {
	string creator = 1;
	string cctx_index = 2;
	string refund_address = 3;
}

MsgUpdateRateLimiterFlags

UpdateRateLimiterFlags 更新速率限制器标志。授权:管理员策略(运维)。

message MsgUpdateRateLimiterFlags {
	string creator = 1;
	RateLimiterFlags rate_limiter_flags = 2;
}

MsgMigrateERC20CustodyFunds

MigrateERC20CustodyFunds 将资金从当前 ERC20Custody 合约迁移到新合约。

message MsgMigrateERC20CustodyFunds {
	string creator = 1;
	int64 chain_id = 2;
	string new_custody_address = 3;
	string erc20_address = 4;
	string amount = 5;
}

MsgUpdateERC20CustodyPauseStatus

UpdateERC20CustodyPauseStatus 会创建管理员命令 CCTX,以更新 ERC20Custody 合约的暂停状态。

message MsgUpdateERC20CustodyPauseStatus {
	string creator = 1;
	int64 chain_id = 2;
	bool pause = 3;
}

概述

emissions 模块负责协调观察者、验证者与 TSS 签名者的奖励分配。目前仅在每个区块向验证者分发奖励,未分配的观察者与 TSS 奖励会存于各自池中。

奖励分发逻辑在 begin blocker 中实现。

模块会记录用于计算奖励的参数:

  • 最大质押因子
  • 最小质押因子
  • 平均出块时间
  • 目标质押比例
  • 验证者奖励比例
  • 观察者奖励比例
  • TSS 签名者奖励比例
  • 持续时间因子常数

消息(Messages)

MsgUpdateParams

UpdateParams 定义了通过治理更新 x/emissions 模块参数的操作。 权限账户固定为 x/gov 模块账户。

message MsgUpdateParams {
	string authority = 1;
	Params params = 2;
}

MsgWithdrawEmission

WithdrawEmission 允许用户提取可提取的排放奖励。成功提取后,会将未分发奖励池中的金额转入用户账户。 若请求金额大于可提取余额,则会提取最大可用金额;若池内余额不足以满足请求,则返回错误。

message MsgWithdrawEmission {
	string creator = 1;
	string amount = 2;
}

概述

fungible 模块用于在 ZetaChain 上部署连接链(外部链)中的同质化代币(称为 “foreign coins”)。

外部代币会在 ZetaChain 上表示为 ZRC-20 代币。

当在 ZetaChain 上部署外部代币时,会部署 ZRC-20 合约、创建流动性池、为池子注入流动性,并将该代币添加到模块状态中的外部代币列表。

模块包含以下逻辑:

  • 在 ZetaChain 上部署外部代币
  • 部署系统合约、Uniswap 与包装 ZETA
  • 从连接链向 ZetaChain 的全链智能合约存入并调用(DepositZRC20AndCallContractDepositZRC20

该模块高度依赖协议合约 (opens in a new tab)

状态

fungible 模块会跟踪以下状态:

  • 系统合约地址
  • 外部代币列表

消息(Messages)

MsgDeploySystemContracts

DeploySystemContracts 用于部署新的系统合约实例。 授权:管理员策略第 2 组。

message MsgDeploySystemContracts {
	string creator = 1;
}

MsgDeployFungibleCoinZRC20

DeployFungibleCoinZRC20 会将连接链上的同质化代币以 ZRC-20 形式部署到 ZetaChain。

若该代币为 Gas 代币,将执行以下操作:

  • 部署该代币的 ZRC-20 合约;
  • 在系统合约中设置 ZRC-20 合约地址为代币地址;
  • 铸造 ZETA 并存入模块账户;
  • 在系统合约上调用 setGasZetaPool 记录池信息;
  • 调用 addLiquidityETH 向池子添加流动性。

若该代币非 Gas 代币:

  • 部署 ZRC-20 合约;
  • 将该代币加入模块状态的外部代币列表。

授权:管理员策略第 2 组。

message MsgDeployFungibleCoinZRC20 {
	string creator = 1;
	string ERC20 = 2;
	int64 foreign_chain_id = 3;
	uint32 decimals = 4;
	string name = 5;
	string symbol = 6;
	pkg.coin.CoinType coin_type = 7;
	int64 gas_limit = 8;
	string liquidity_cap = 9;
}

MsgRemoveForeignCoin

RemoveForeignCoin 会从模块状态的外部代币列表中移除某个代币。 授权:管理员策略第 2 组。

message MsgRemoveForeignCoin {
	string creator = 1;
	string zrc20_address = 2;
}

MsgUpdateSystemContract

UpdateSystemContract 用于更新系统合约。

message MsgUpdateSystemContract {
	string creator = 1;
	string new_system_contract_address = 2;
}

MsgUpdateContractBytecode

UpdateContractBytecode 用于将合约的字节码更新为现有合约的字节码。仅 ZRC-20 合约或 WZeta 连接器合约可更新。 重要:新合约字节码必须与旧合约保持相同的存储布局;可以新增变量,但不能移除已有变量。 授权:管理员策略第 2 组。

message MsgUpdateContractBytecode {
	string creator = 1;
	string contract_address = 2;
	string new_code_hash = 3;
}

MsgUpdateZRC20WithdrawFee

UpdateZRC20WithdrawFee 用于更新 ZRC-20 代币的提现费用与 Gas 上限。

message MsgUpdateZRC20WithdrawFee {
	string creator = 1;
	string zrc20_address = 2;
	string new_withdraw_fee = 6;
	string new_gas_limit = 7;
}

MsgUpdateZRC20LiquidityCap

UpdateZRC20LiquidityCap 用于更新 ZRC-20 代币的流动性上限。 授权:管理员策略第 2 组。

message MsgUpdateZRC20LiquidityCap {
	string creator = 1;
	string zrc20_address = 2;
	string liquidity_cap = 3;
}

MsgPauseZRC20

PauseZRC20 可暂停一组 ZRC-20 代币。 授权:管理员策略 groupEmergency

message MsgPauseZRC20 {
	string creator = 1;
	string zrc20_addresses = 2;
}

MsgUnpauseZRC20

UnpauseZRC20 恢复 ZRC-20 代币的运行。 授权:管理员策略 groupOperational

message MsgUnpauseZRC20 {
	string creator = 1;
	string zrc20_addresses = 2;
}

MsgUpdateGatewayContract

UpdateGatewayContract 更新 ZetaChain 协议用于读取入站、处理出站的 zevm 网关合约。

message MsgUpdateGatewayContract {
	string creator = 1;
	string new_gateway_contract_address = 2;
}

MsgUpdateZRC20Name

UpdateZRC20Name 更新 ZRC-20 代币的名称和/或符号。

message MsgUpdateZRC20Name {
	string creator = 1;
	string zrc20_address = 2;
	string name = 3;
	string symbol = 4;
}

MsgBurnFungibleModuleAsset

BurnFungibleModuleAsset 会销毁 fungible 模块上的 ZRC-20 余额。若提供零地址,则会销毁 fungible 模块持有的原生 ZETA。

message MsgBurnFungibleModuleAsset {
	string creator = 1;
	string zrc20_address = 2;
}

MsgUpdateGatewayGasLimit

UpdateGatewayGasLimit 更新 ZetaChain 协议使用的网关 Gas 上限。

message MsgUpdateGatewayGasLimit {
	string creator = 1;
	uint64 new_gas_limit = 2;
}

消息(Messages)

MsgEnableHeaderVerification

EnableHeaderVerification 为指定链 ID 启用区块头验证标志。启用后可提交区块头并用于校验证明正确性。

message MsgEnableHeaderVerification {
	string creator = 1;
	int64 chain_id_list = 2;
}

MsgDisableHeaderVerification

DisableHeaderVerification 为指定链 ID 禁用区块头验证标志。禁用后无法提交区块头或用其校验证明。

message MsgDisableHeaderVerification {
	string creator = 1;
	int64 chain_id_list = 2;
}

概述

observer 模块维护用于投票的投票单、链与观察者账户的映射、受支持的连接链列表、核心参数(合约地址、出站交易调度间隔等)、观察者参数(投票阈值、最低观察者委托等)以及管理员策略参数。

投票单用于为入站与出站交易投票。observer 模块提供投票单的创建、读取、更新、删除(CRUD)能力,并提供辅助函数判断投票单是否完成。投票机制也为其他模块所用,例如观察者验证者在 crosschain 模块中对交易进行投票。

观察者验证者是在 zetacored(区块链节点)旁运行 zetaclient 的验证者,获授权对跨链交易的入站与出站进行投票。

链与观察者账户之间的映射目前在创世阶段设定,并在 crosschain 模块中用于判断某观察者验证者是否有权对特定链的交易进行投票。

消息(Messages)

MsgAddObserver

AddObserver 将观察者地址加入观察者集合。

message MsgAddObserver {
	string creator = 1;
	string observer_address = 2;
	string zetaclient_grantee_pubkey = 3;
	bool add_node_account_only = 4;
}

MsgUpdateObserver

UpdateObserver 用于更新观察者地址。 授权:管理员策略(管理员更新)或旧观察者地址(当观察者因违规被记墓碑时)。

message MsgUpdateObserver {
	string creator = 1;
	string old_observer_address = 2;
	string new_observer_address = 3;
	ObserverUpdateReason update_reason = 4;
}

MsgUpdateChainParams

UpdateChainParams 更新特定链的参数,或新增一条链。链参数包括确认次数、出站交易调度间隔、ZETA 代币、连接器与 ERC20 托管合约地址等。 仅管理员策略账户可广播。

message MsgUpdateChainParams {
	string creator = 1;
	ChainParams chainParams = 2;
}

MsgRemoveChainParams

RemoveChainParams 会移除某条链的参数。

message MsgRemoveChainParams {
	string creator = 1;
	int64 chain_id = 2;
}

MsgVoteBlame

message MsgVoteBlame {
	string creator = 1;
	int64 chain_id = 2;
	Blame blame_info = 3;
}

MsgUpdateKeygen

UpdateKeygen 更新密钥生成所在的区块高度,并将状态设置为“pending keygen”。 授权:管理员策略第 1 组。

message MsgUpdateKeygen {
	string creator = 1;
	int64 block = 2;
}

MsgVoteBlockHeader

VoteBlockHeader 为新区块头投票,以便存储。

message MsgVoteBlockHeader {
	string creator = 1;
	int64 chain_id = 2;
	bytes block_hash = 3;
	int64 height = 4;
	pkg.proofs.HeaderData header = 5;
}

MsgResetChainNonces

ResetChainNonces 处理链 nonce 的重置。

message MsgResetChainNonces {
	string creator = 1;
	int64 chain_id = 2;
	int64 chain_nonce_low = 3;
	int64 chain_nonce_high = 4;
}

MsgVoteTSS

VoteTSS 就创建 TSS 密钥并记录其信息(公钥、参与者与运营者地址、完成与 keygen 高度)进行投票。

当投票通过时,会在链上记录 TSS 密钥信息,并将 keygen 状态设为 “success”。

若 keygen 不存在、已完成或已失败,则投票会失败。

仅节点账户可广播该消息。

message MsgVoteTSS {
	string creator = 1;
	string tss_pubkey = 2;
	int64 keygen_zeta_height = 3;
	pkg.chains.ReceiveStatus status = 4;
}

MsgEnableCCTX

EnableCCTX 启用 IsInboundEnabledIsOutboundEnabled 标志,这两个标志用于控制入站与出站的创建。由具备 groupOperational 策略类型的策略账户启用。

message MsgEnableCCTX {
	string creator = 1;
	bool enableInbound = 2;
	bool enableOutbound = 3;
}

MsgDisableCCTX

DisableCCTX 禁用 IsInboundEnabledIsOutboundEnabled 标志。由具备 groupEmergency 策略类型的策略账户禁用。

message MsgDisableCCTX {
	string creator = 1;
	bool disableInbound = 2;
	bool disableOutbound = 3;
}

MsgDisableFastConfirmation

DisableFastConfirmation 为指定链 ID 禁用快速确认。被禁用的链仅使用安全确认次数(SAFE confirmation count)来确认入站与出站。

message MsgDisableFastConfirmation {
	string creator = 1;
	int64 chain_id = 2;
}

MsgUpdateGasPriceIncreaseFlags

UpdateGasPriceIncreaseFlags 更新 GasPriceIncreaseFlags,这些标志用于控制 Gas 价格上调。由具备 groupOperational 策略类型的策略账户更新。

message MsgUpdateGasPriceIncreaseFlags {
	string creator = 1;
	GasPriceIncreaseFlags gasPriceIncreaseFlags = 2;
}

MsgUpdateOperationalFlags

message MsgUpdateOperationalFlags {
	string creator = 1;
	OperationalFlags operational_flags = 2;
}

MsgUpdateOperationalChainParams

UpdateOperationalChainParams 更新与运维相关的链参数。与 MsgUpdateChainParams 不同,该消息不会修改敏感参数,例如用于监听连接链的网关合约地址。

message MsgUpdateOperationalChainParams {
	string creator = 1;
	int64 chain_id = 2;
	uint64 gas_price_ticker = 3;
	uint64 inbound_ticker = 4;
	uint64 outbound_ticker = 5;
	uint64 watch_utxo_ticker = 6;
	int64 outbound_schedule_interval = 7;
	int64 outbound_schedule_lookahead = 8;
	ConfirmationParams confirmation_params = 9;
	bool disable_tss_block_scan = 10;
}