ZKsync升级验证工具:安全可靠的治理

  • cyfrin
  • 发布于 2025-01-24 13:14
  • 阅读 40

本文介绍了ZKsync升级验证工具,它提供了一种通过CLI命令验证提案、解码交易及防止前端欺骗的方法。该工具为ZKsync治理参与者提供了关键功能,包括提案ID提取、提案动作解码及以太坊提案ID确认,旨在提升治理过程中的安全性和透明度。

ZKsync 治理工具:安全提案验证

确保通过强大的 CLI 工具在 ZKsync 治理中实现安全性,验证提案,解码交易,并在批准前防止前端欺骗。

简介

对于 区块链 治理机构和 多签名 委员会,验证交易数据不是可选的,而是绝对必要的。 在批准协议升级或转移巨额资金时,仅依靠前端界面进行信任可能会非常误导。

正如在 Bybit 利用事件 中所看到的,即使是知名的 钱包 UI 也可能会被妥协 以呈现虚假信息。如果没有独立验证,签名者可能会授权与他们所认为的内容有显著不同的交易。 交易验证 作为一项保障:确保 原始交易细节(地址、 calldata 、金额、提案 ID) 确实如预期那样。

其他近期利用事件(例如 Radiant Capital 5000 万美元黑客攻击)强调了 未能仔细检查交易背后的数据可能是灾难性的。 在治理场景中——提案可以升级合约或转移国库资金——风险尤其高。 这就是为什么强有力的验证工具和实践对于保护协议和用户资产至关重要。

ZKsync 升级验证工具概述

为了帮助应对这些风险,Cyfrin 推出了 ZKsync 升级验证工具,这是一款 专为安全的治理交易而构建的命令行实用工具。该工具对于 ZKsync 治理 生态系统中的参与者,特别是安全委员会成员和监护人 至关重要。它通过提供三项主要功能来简化验证和理解治理提案及其升级的过程:

  • 从交易哈希中提取并显示提案 IDget-zk-id

  • 解码并列出提案的详细行动(目标、值和 calldata),包括任何桥接的以太坊交易(get-upgrades

  • 计算以太坊升级提案的 Keccak256 哈希以供验证get-eth-id)。

该工具使用户能够 验证提案细节 与在治理平台(如 Tally,ZKsync 使用)上显示的内容,并 理解提案对协议的确切影响,以及 在批准或签署前确认以太坊提案 ID。无论是确保提案与描述相符,还是验证其在 ZKsync 和以太坊之间的完整性,该工具 简化了整个过程

它为什么有用?

在 ZKsync 治理过程中,验证提案和升级对 维护协议的安全性和完整性至关重要。该工具解决了几个需求:

  • 提案 ID 验证get-zk-id 子命令从 ZKsync 交易 哈希 中提取提案 ID,并以十六进制和十进制格式显示。这使用户能够 确认提案 ID 与治理平台上显示的内容相符,确保投票前的透明和准确。

  • 理解提案行动:使用 get-upgrades,用户可以解码提案的输入数据,查看完整的目标、值和 calldata 列表。如果提案包括对 ETH 桥的调用(例如 sendToL1),它还进一步解码被提议的以太坊交易,提供 提案影响的清晰画面——这是评估其有效性和意图的关键。

  • 以太坊提案 ID 确认get-eth-id 计算嵌入在 ZKsync 提案中的以太坊升级提案的 Keccak256 哈希。该哈希作为以太坊侧的提案 ID,使用户能够 在投票后核实其是否符合预期,降低批准意外操作的风险。

这些功能使该工具对于任何参与 ZKsync 治理的人来说都必不可少,确保在执行之前充分审查提案。

如何使用 ZKsync 升级验证工具

ZKsync 升级验证工具是一个 命令行应用程序,使用子命令、交易哈希以及一个 RPC URL 连接到 ZKsync 网络。该工具使用简单,只需要少量输入。治理者地址是可选的,如果省略则默认为预定义值。以下是如何使用每个子命令的示例:

  1. 获取 ZKsync 提案 ID:要从交易中提取提案 ID:
zkgov-check get-zk-id <tx-hash> --rpc-url $ZKSYNC_RPC_URL

输出:提案 ID 的十六进制和十进制格式,例如 0xe06945bf...101504078....

  1. 列出提案的行动和以太坊交易:要解码提案的行动:
zkgov-check get-upgrades <tx-hash> --rpc-url $ZKSYNC_RPC_URL

输出:目标、值和 calldata 的详细列表,以及如果调用了 sendToL1 的任何以太坊交易。

zkgov-check get-upgrades <tx-hash> --rpc-url $ZKSYNC_RPC_URL --decode

--decode 选项允许我们 解释在以太坊上执行的 calldata。这使我们能够以人可读格式查看正在调用的函数及其参数的值。

  1. 计算以太坊提案 ID:要根据交易哈希生成以太坊侧的提案 ID:
zkgov-check get-eth-id <tx-hash> --rpc-url $ZKSYNC_RPC_URL

‍ 要根据包含执行者、盐和调用集的 JSON 文件生成以太坊侧的提案 ID:

zkgov-check get-eth-id --from-file <file-path>

输出:提案中每个以太坊交易的 Keccak256 哈希。

快速入门

ZKsync 升级验证工具有两种实现:一种使用 Bash 构建,另一种使用 Rust。你可以选择你喜欢的技术栈:

在本文中,我们将使用 Rust 版本。

选项 1:安装二进制文件
  • 运行安装脚本:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/cyfrin/zksync-upgrade-verification-rs/releases/latest/download/zkgov-check-installer.sh | sh

选项 2:从源代码构建
  1. 克隆库:
git clone https://github.com/Cyfrin/zksync-upgrade-verification
cd zksync-upgrade-verification
  1. 构建二进制文件:
cargo build --release
  1. 将二进制文件添加到路径中:
sudo mv target/release/zkgov-check /usr/local/bin/
  1. 验证工具是否已安装:
zkgov-check --help
ZkSync 治理工具

用法:zkgov-check [OPTIONS] <COMMAND>

命令:
  get-zk-id
  get-upgrades
  get-eth-id
  help          打印此消息或给定子命令的帮助

选项:
      --rpc-url <RPC_URL>
      --governor <GOVERNOR>  [默认: 0x76705327e682F2d96943280D99464Ab61219e34f]
      --decode
  -h, --help                 打印帮助
  -V, --version              打印版本

完成!

该工具的简洁和稳健使其成为在 ZKsync 的去中心化治理过程中自信导航的强大伴侣。

示例

使用 ZKsync 升级验证工具可以 显著提高治理操作的安全性。以下是 安全委员会或监护人成员如何使用它验证提案的逐步指南,以 ZIP-7 为例:

1. 获取包含提案的交易哈希:当提议新的协议升级时,你需要获取创建提案的交易哈希。你可以从 Tally 或块浏览器获得这个信息。

Tally 中的治理提案的屏幕快照,标题为 [ZIP-7] 关于 Elastic Network 的 Lens Chain 包含,显示其状态、时间轴以及查看 ZKSync 块浏览器交易的选项。

2. 运行工具获取提案 ID:对交易哈希使用 get_zk_id 命令。例如:

zkgov-check get-zk-id 0x94d49c27617ea2dfd78bb3316e6849bdb1a1dd80ddd22151ecb6c644d3fd86f6 --rpc-url $ZKSYNC_RPC_URL

工具将输出提案 ID 的十六进制和十进制格式:

提案 ID
十六进制:0x7551655cb1bd662c2090a1227ea4eef89a4fdefc83bf33b06ca5b41b53fcadd4
十进制:53064417471903525695516096129021600825622830249245179379231067906906888383956

这项提案 ID 应该与 Tally 中显示的身份一致。

Cyfrin 提出的题为 [ZIP-7] 的活跃治理提案的屏幕快照,展示其提案 ID、治理者和投票状态,带有链上投票选项。

3. 获取并交叉验证以太坊侧 ID:为增加安全性,通过运行 get-eth-id 命令检索记录在以太坊上的提案 ID。以下有两种方式来实现:

  • 从交易哈希:
zkgov-check get-eth-id 0x94d49c27617ea2dfd78bb3316e6849bdb1a1dd80ddd22151ecb6c644d3fd86f6 --rpc-url $ZKSYNC_RPC_URL
  • 工具将计算以太坊侧提案 ID,例如:
以太坊提案 ID #1:0x5ebd899d036aae29b12babe196b11380d8304e98ac86390ac18a56ff51ada9bd
  • 你可以对比这一提案 ID 和显示在 verify.zknation.io 上的提案 ID。

  • 从提案文件:

你还可以从包含执行者、盐和调用集的 JSON 文件中获得以太坊提案 ID。例如,参见 这里 的示例文件。

zkgov-check get-eth-id --from-file test-data/zip5.json

以太坊提案 ID
提案 ID:0xa34bdc028de549c0fbd0374e64eb5977e78f62331f6a55f4f2211348c4902d13
编码提案:0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ece8e30bfc92c2a8e11e6cb2e17b70868572e3f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000320000000000000000000000000303a465b659cbb0ab36ee643ea362c509eeb521300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000479ba509700000000000000000000000000000000000000000000000000000000000000000000000000000000c2ee6b6af7d616f6e27ce7f4a451aedc2b0f5f5c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000479ba5097000000000000000000000000000000000000000000000000000000000000000000000000000000005d8ba173dc6c3c90c8f7c04c9288bef5fdbad06e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000479ba509700000000000000000000000000000000000000000000000000000000000000000000000000000000f553e6d903aa43420ed7e3bc2313be9286a8f98700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000479ba509700000000000000000000000000000000000000000000000000000000

4. 验证 ZKsync 和以太坊交易的 calldata:通过 get-upgrades 命令简化这一复杂的任务:

zkgov-check get-upgrades 0x94d49c27617ea2dfd78bb3316e6849bdb1a1dd80ddd22151ecb6c644d3fd86f6 --decode --rpc-url $ZKSYNC_RPC_URL

ZKsync 交易

ZKsync 交易 #1:
目标地址:0x0000000000000000000000000000000000008008
值:0
Calldata:0x62f84b24000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000009da9f5dad070649811d77c40ccdcab479ce3fa070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000479ba509700000000000000000000000000000000000000000000000000000000000000000000000000000000590e6587b37dc4152b6b036ff88a835bd2ab892400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000479ba50970000000000000000000000000000000000000000000000000000000000000000000000000000000034899f8b01cf52160c88ddb9e29ec3c269019165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000479ba509700000000000000000000000000000000000000000000000000000000000000000000000000000000c2ee6b6af7d616f6e27ce7f4a451aedc2b0f5f5c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000479ba5097000000000000000000000000000000000000000000000000000000000000000000000000000000005d8ba173dc6c3c90c8f7c04c9288bef5fdbad06e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000479ba509700000000000000000000000000000000000000000000000000000000000000000000000000000000f553e6d903aa43420ed7e3bc2313be9286a8f987000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000479ba509700000000000000000000000000000000000000000000000000000000
(ETH 交易)

以太坊交易
  调用:
  目标:0x9da9f5dad070649811d77c40ccdcab479ce3fa07
  值:0
  Calldata: 0x79ba5097
  函数:acceptOwnership()()

  调用:
  目标:0x590e6587b37dc4152b6b036ff88a835bd2ab8924
  值:0
  Calldata: 0x79ba5097
  函数:acceptOwnership()()

  调用:
  目标:0x5c03468829a26981c410a7930bd4853622f0b2e5
  值:0
  Calldata: 0x79ba5097
  函数:acceptOwnership()()

  调用:
  目标:0x34899f8b01cf52160c88ddb9e29ec3c269019165
  值:0
  Calldata: 0x79ba5097
  函数:acceptOwnership()()

  调用:
  目标:0xc2ee6b6af7d616f6e27ce7f4a451aedc2b0f5f5c
  值:0
  Calldata: 0x0d14edf700000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000c29d04a93f893700015138e3e334eb828dac3cef
  函数:registerAlreadyDeployedHyperchain(uint256,address)(232, 0xc29d04a93f893700015138e3e334eb828dac3cef)

  调用:
  目标:0x303a465b659cbb0ab36ee643ea362c509eeb5213
  值:0
  Calldata: 0x3f58f5b500000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000c2ee6b6af7d616f6e27ce7f4a451aedc2b0f5f5c0000000000000000000000001ff1dc3cb9eedbc6eb2d99c03b30a05ca625fb5a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000
  函数:createNewChain(uint256,address,address,uint256,address,bytes)(232, 0xc2ee6b6af7d616f6e27ce7f4a451aedc2b0f5f5c, 0x1ff1dc3cb9eedbc6eb2d99c03b30a05ca625fb5a, 0, 0x0000000000000000000000000000000000000000, 0x)

  调用:
  目标:0x590e6587b37dc4152b6b036ff88a835bd2ab8924
  值:0
  Calldata: 0xe34a329a00000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000600000000000000000000000004d89b79a893ac95eb46e96e452ad21f71144c9180000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640528f3f700000000000000000000000006aa7a7b07108f7c5539645e32dd5c21cbf9eb66000000000000000000000000c2ee6b6af7d616f6e27ce7f4a451aedc2b0f5f5c0000000000000000000000005d8ba173dc6c3c90c8f7c04c9288bef5fdbad06e00000000000000000000000000000000000000000000000000000000
  函数:executeUpgrade(uint256,((address,uint8,bool,bytes4[])[],address,bytes))(232, ([], 0x4d89b79a893ac95eb46e96e452ad21f71144c918, 0x0528f3f700000000000000000000000006aa7a7b07108f7c5539645e32dd5c21cbf9eb66000000000000000000000000c2ee6b6af7d616f6e27ce7f4a451aedc2b0f5f5c0000000000000000000000005d8ba173dc6c3c90c8f7c04c9288bef5fdbad06e))

执行者:0x0000000000000000000000000000000000000000
盐:0x0000000000000000000000000000000000000000000000000000000000000000

  1. ZKsync 交易 部分中的调用数据应与你在 Tally 中看到的一致。

以太坊交易 部分基本上是对 sendToL1 调用的解码,这帮助我们了解发送给以太坊的调用内部究竟发生了什么。这些调用接下来应该与提案背后的动机进行对比验证。

结论

随着越来越多针对区块链治理的复杂攻击,“ 不信任,验证” 的格言从未如此相关。ZKsync 升级验证工具展示了治理委员会和多签名操作员应当成为标准实践的那种严格验证过程。

通过验证交易 ID,交叉检查提案数据和模拟结果,该工具确保批准的行为与原始意图一致——不仅仅是这,什么也没有。这减少了繁忙的签署者批准由 恶意提案或欺骗性前端伪造 所产生意外交易的风险。

Bybit 黑客攻击与类似利用事件的经验教训明确:无论合约或多签名多么安全,最薄弱的环节往往是基于未经验证信息批准交易的人。通过结合验证脚本和独立检查,我们为安全性添加了一层有力的保障。

强烈建议治理参与者采用这种工具和实践 - 无论是 ZKsync 用于协议升级的 CLI,还是其他安全交易验证器,用以保护决策的完整性。

总之,安全的区块链治理 依赖于审慎和正确的工具。验证每笔交易的细节可能意味着一次例行升级与一次灾难性攻击之间的区别。像 ZKsync 升级验证工具 这样的解决方案赋予社区对每个提案进行深入尽职调查的能力,促进了对系统的更大信任。

随着去中心化组织和协议管理的金额越来越大以及基础设施至关重要,构建“在签名前验证” 的文化是韧性的关键。这就是为什么我们能自信地朝着链上治理的未来迈进—— 安全、透明和防灾

  • 原文链接: cyfrin.io/blog/zksync-go...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cyfrin
cyfrin
Securing the blockchain and its users. Industry-leading smart contract audits, tools, and education.