本文档介绍了Governor的设计,旨在限制特定漏洞的影响,通过赋予 Guardians 延迟来自已注册Token Bridge的Wormhole消息的选项来实现,特别是当其总名义价值非常大时,给守护者24小时的时间来删除通过软件错误创建的消息,而不是准确地表示原始链的状态,从而防止了漏洞利用。
如果注册的 Token Bridge 的 Wormhole 消息的总名义价值非常大,则赋予 Guardian 延迟这些消息的选项,以此来限制某些漏洞利用的影响。
如果没有任何额外的安全缓解措施,核心消息桥的单个完整性故障可能会对建立在 Wormhole 之上的 Token Bridge 的用户造成灾难性后果。例如,在 2022 年 2 月 2 日,Solana 核心智能合约中的一个漏洞被利用,以在 Solana 上恶意铸造 wETH,随后它被桥接回以太坊。
该桥有多种潜在的故障模式:
即使 Wormhole 的代码和操作是完美无缺的,如果存在源链的漏洞,它仍然可能产生“无效”消息:源链智能合约运行时中的“错误”导致了不希望的 Wormhole 消息,这些消息可以由社区修补,从而有效地导致分叉,从而还原这些 Wormhole 消息。rpc 节点中的错误可能导致 Guardian 无法准确查看链上状态。
如果 Token Bridge 的传输是无限且即时的,则单个连接链中的错误可能导致整个 Token Bridge 被耗尽。
如果 Guardian 决定启用此功能:
配置:
Governor 将基于 Token 的交易分为两类:小额交易和大额交易。
由于阈值以基础货币计价,因此 Governor 必须知道以这种基础货币计价的转账的名义价值。为了确定 Token 的价格,它使用以下各项的 最大值:
Token 配置位于 manual_tokens.go 和 generated_mainnet_tokens.go 中。
如果 CoinGecko 为 Token 提供了错误的低价,则 Governor 会优先考虑安全,而改用硬编码的最低价格。
每个 Guardian 都在 Wormhole Gossip 网络上发布其 Governor 配置和状态,任何人都可以通过 Guardian 侦察员(说明)订阅。一些 Guardian 还通过公共 API 提供 Governor 状态,该状态可以在 Wormhole Dashboard 上可视化。一个功能更丰富的 Wormhole Explorer 正在开发中,它将汇总所有 Guardian 的 Governor 状态。
Governor 被实现为一个额外的软件包,该软件包定义了 (1) 一个 ChainGovernor
对象,(2) mainnet_tokens.go
,一个将被监控的 Token 的单个映射,以及 (3) mainnet_chains.go
,一个由链 Governor 管理的链的映射。
mainnet_tokens.go
映射了一个 Token 列表,其中包含硬编码的 Token 最低价格和从 CoinGecko 读取的最新价格之间的最高价格。
如果启用了节点级别配置参数以指示已启用链 Governor,则所有 VAA 将传递给 ChainGovernor
以执行一系列额外的检查,以指示是否可以发布消息,或者是否不应发布消息并由处理器丢弃。
执行的检查包括:
mainnet_chains.go
中列出?mainnet_tokens.go
中列出?bigTransactionSize
)?bigTransactionSize
)?以上检查将产生 3 种可能的情况:
ChainGovernor
将指示可以发布该消息。ChainGovernor
将等待 24 小时后再签署 VAA,并将消息放入队列中。ChainGovernor
将确定其是否适合该链的 dailyLimit
。如果适合,它将立即被签署。如果不适合,它将在队列中等待直到适合。如果它在 24 小时内不适合,它将从队列中释放。当消息排队时,任何 Guardian 都有机会使用自己的欺诈检测流程来确定消息是否是欺诈性的。如果 Guardian 确定消息是欺诈性的,他们可以从自己独立管理的队列中删除该消息。如果超级少数派的 Guardian(19 个中的 7 个)从他们的队列中删除一条消息,则此欺诈性消息将被有效地审查,因为它无法再达到超级多数的法定人数。
在此设计中,有三种发布排队消息的机制:
Guardian 运营商可以使用 ChainGovernorResetReleaseTimer
管理 RPC 或 governor-reset-release-timer [VAA_ID] <num_days>
管理命令将延迟重置为指定的天数 (num_days
),最多 7 天。省略参数默认为 1 天。
Guardian 运营商可以使用 ChainGovernorDropPendingVAA
管理 RPC 或 governor-drop-pending-vaa [VAA_ID]
管理命令从 Governor 队列中删除 VAA。请注意,在大多数情况下,这应与断开链或阻止某些消息一起完成,否则消息可能会通过自动观察请求重新观察到。
目前,添加更多受管的 emitter 需要修改 Guardian 代码。将来,能够动态添加新的合约供 Guardian 节点观察将是理想的。
- 原文链接: github.com/wormhole-foun...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!