跨链桥是如何工作的?以 Wormhole 为例(第二部分)

  • Sec3dev
  • 发布于 2023-01-12 11:29
  • 阅读 24

这篇文章重点讨论了 Wormhole 跨链桥中验证 guardian 签名的机制,分别针对 Solana 和 Ethereum 平台进行深入分析,详细介绍了如何确保签名的有效性,防止伪造,以及如何应对恶意签名者的攻击。文章还包含了一些代码示例和程序流程图,进一步说明技术实现。

继续第一部分,在本文中,我们关注 Wormhole 在 Solana 和 Ethereum 上的监护人签名验证。

如何验证监护人签名(以防止虚假 VAA)?

在 Solana 上,Wormhole 使用 verify_signatures 函数来验证 VAA 中的所有签名。每个 VAA 可能包含多个签名(至少需要 2/3 的 19个经过验证的签名以达到法定人数)。由于计算限制,它将签名验证分成多个步骤(即多次调用 verify_signatures),每次调用 验证一个子集(例如六个或七个)监护人签名:

VerifySignatures 中的输入账户如下定义:

两个 PDA 账户 guardian_setsignature_set 非常重要。guardian_set 账户必须已初始化(AccountState::Initialized),它存储经过验证的监护人集合(包括它们的 keys):

signature_set 存储每个监护人签名的验证状态(真或假)(signatures: Vec<bool>)、消息 hashguardian_set_index

signature_set 账户在第一次调用 verify_signatures 时创建并初始化:

在后续调用中,使用相应的消息 hashguardian_set_index 来验证相同的 signature_set,以确保其不能被伪造(上面的行 188192)。

一旦签名被验证,对应的 signer_indexsignature_set.signatures 将被设置为真:

每个监护人签名是如何验证的?

Wormhole(在 Solana 上)使用预编译的 Secp256k1 SigVerify 程序,并且每次调用 verify_signatures 都会前置一个指令到 SigVerify 程序,该程序验证一系列签名:

Wormhole 使用 sysvar_instructions 加载与 verify_signatures 对应的 current_instruction,并检查其前一个指令必须是一个 secp 验证指令(即调用 SigVerify):

程序指令日志清晰地展示了流程:

在 Ethereum 上如何验证签名?

不同于 Solana,Wormhole 在 Ethereum 上通过调用 verifyVM 函数(vm 是 VAA 字节数组)在单个交易中验证所有签名:

它通过检查签名长度来确保法定人数:

它调用 verifySignatures(类似于 Solana,也以消息 hashguardianSet 作为输入):

verifySignatures 逐个验证输入签名,使用 ecrecover(第 93 行):

ecrecover(message, v, r, s) API 计算生成签名所用的密钥(v, r, s)的消息。如果返回的密钥与相应监护人的公钥(guardianSet.keys[sig.guardianIndex])匹配,则验证通过。

如果一个(恶意的)监护人提交相同的签名到 VAA 中怎么办?

通过确保 VAA 中的签名索引必须是递增的,Wormhole 防止了这一攻击面(在 Ethereum 上):

在 Solana 上,Wormhole 对每个签名维护一对(sig_indexsigner_index),并将被验证的签名的密钥与相应监护人的公钥进行匹配(第 209 行):

即使攻击者能够控制一个监护人并在 VAA 中放置 19 个重复的签名,只有一个监护人的 signer_index 会在 signature_set.signature 中设置为真,因此攻击将失败。

Wormhole 还会检查 guardian_set 的有效性和 signature_set 的完整性:

法定人数检查在 PostVAA 指令中执行:

下一篇文章中,我们将继续讨论 Wormhole 中跨链代币铸造/燃烧的安全性。


关于 sec3(原名 Soteria)

sec3 是一家安全研究公司,旨在为数百万用户准备区块链项目。sec3 的 Launch Audit 是一次严格的、以研究人员为主导的代码检查,调查和认证主网级别的智能合约;sec3 的持续审计软件平台 X-ray 与 Github 集成,逐步扫描拉取请求,帮助项目在部署之前加强代码;sec3 的后续部署安全解决方案 WatchTower 确保资金安全。sec3 正在为 Web3 项目构建基于技术的可扩展解决方案,以确保协议在扩展时保持安全。

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

0 条评论

请先 登录 后评论
Sec3dev
Sec3dev
https://www.sec3.dev/