区块链的三个核心属性是去中心化、安全性和可扩展性。根据区块链三难困境理论,简单的区块链架构只能实现这三者中的两个。以太坊在设计时,优先考虑了去中心化和安全性,因此在扩展性方面表现不尽人意。目前,以太坊每天处理超过100万笔交易,这种需求可能导致交易费用居高不下,进而加大了对以太坊扩容方案的需求。
以太坊的扩容方案有几种不同类型,各自有其权衡取舍和安全模型,包括:一层的分片技术,二层的状态通道、Plasma、侧链、Rollups 和 Validium 等。由于分片技术发展缓慢且实现复杂,侧链和 Validium 无法从以太坊获取安全性或数据可用性。综合来看,以太坊生态系统现主要支持以 Rollups 为主的 Layer2 扩容策略。
目前Beosin已成为Manta Netowork、StarkNet等ETH Layer2的官方安全合作伙伴。在过往的审计中,已有多条知名公链通过了Beosin的公链安全审计,包括Ronin Network、Manta Network、Merlin Chain、Clover、Self Chain、Crust Network等。Beosin现推出针对ETH Layer2的审计方案,为ETH Layer2生态提供全面可靠的安全审计服务。
ETH Layer2 使用 Rollups 将数百笔交易打包成一笔提交到以太坊主网,从而将以太坊的交易费用分散到所有 Rollup 用户,降低每个用户的费用。Rollups 中的交易数据会提交到一层网络,但执行由 Rollups 独立进行。通过提交交易数据到一层网络,Rollups 能够继承以太坊的安全性,因为一旦数据上传到一层网络后,回滚 Rollups 交易就需要回滚以太坊上的数据。
目前,Rollups 的实现主要有两种方式:
Optimistic Rollups:使用经济激励和博弈论来验证交易,其代表有 Arbitrum、Base、OP、Blast等。
Zero-Knowledge Rollups:使用零知识证明来实现安全和隐私,如 Scroll、Linea、zkSync、StarkNet 等。
Optimistic Rollups
概述
Optimistic Rollups 是一种扩展以太坊的方法,将计算和状态存储移至链下。它们在链下执行交易,但将交易数据作为 calldata 或 blob 发布到主网。
Optimistic Rollups 在以太坊上部署一个智能合约,称为Rollup合约,负责管理Rollup的状态、跟踪用户余额以及处理存款、取款和争议解决。交易由排序器在链下收集和汇总,并将多个交易捆绑成一个 Rollup 区块,该区块包含新帐户状态的摘要和加密证明(Merkle 树根)。然后,排序器通过提供 Merkle 树根和 calldata 将 Rollup 区块提交到主链。
Optimistic Rollups 被认为是“乐观的”,因为它们假设链下交易是有效的,并且不发布推送到链上的交易批次的有效性证明。相反,Optimistic Rollups 依赖于欺诈证明方案来检测交易计算不正确的情况。在以太坊上提交 Rollup 批次后,有一个时间窗口(称为挑战期),在此期间任何人都可以通过计算欺诈证明来挑战 Rollup 交易的结果。欺诈证明包含验证者认为是欺诈的特定交易的详细信息。
如下图所示,目前大部分Optimistic Rollups的挑战期为7天,最短的为1天。
https://l2beat.com/scaling/risk
在挑战期内,任何人都可以通过计算欺诈证明来挑战交易结果。如果交易无效,Rollup区块将被撤销,挑战者获得奖励,排序者受到惩罚。
如果在挑战期过后 Rollup 批次仍未受到挑战(即所有交易均已正确执行),则将其视为有效并在以太坊上接受。其他人可以继续扩建未经确认的 Rollup 区块,但需要注意:交易结果如果基于先前发布的错误执行交易,则将被逆转。
最后,用户必须向 Rollup 合约提交提款请求,以将资金从 Layer 2 提款到 Layer 1。合约将验证用户在 Rollup 上是否有足够的资金,并相应地更新其在主链上的余额。
代表项目
1. Arbitrum
Arbitrum凭借生态建设和空投,迅速成为了ETH Layer2中最为活跃的网络,TVL超过27亿美元。在盛大的空投活动后,Arbitrum团队推出了Arbitrum Orbit计划:鼓励开发者使用Arbitrum相关技术构建Layer3。Beosin已对Arbitrum生态的ArbSwap、Arbipad等项目完成了安全审计,助力Arbitrum生态安全发展。
2. Optimism
虽然Optimism的生态活跃度低于Arbitrum,但Optimism在2023年推出的OP Stack 作为一套完整可行的构建模块化Layer2的方案,已经获得了行业的广泛认可。已有超过25条Layer2的网络使用OP Stack构建,其中不乏Base、Mantle、Manta、OP BNB、Celo等明星项目。Optimism生态的衍生品交易平台DIPX Finance、Starnet等项目已通过Beosin的安全审计。
3. Base
Base是基于OP Stack构建的 Layer2 网络,目前生态活跃度和TVL仅次于Arbitrum。此前,Beosin已详细分析了Base的架构与安全风险,并审计了Base生态的明星项目Surf Protocol和DeFi项目EDA,帮助项目方和用户规避安全风险。
4. Blast
Blast在其“Big Bang”开发者竞赛的结束,其TVL更是不断飙升,一举超过了20亿美元,在Layer2赛道上占据着一席之地。Beosin在Blast主网上线前分析了其网络安全。由于Blast并未实现欺诈证明,资产由多签钱包进行托管,并非Rollup桥,其中心化风险程度较高。Beosin已审计多个Blast生态项目,如Wand Protocol、Zest、Kalax。
架构分析
OP Stack 作为 Optimistic Rollups 比较成熟的框架,它通过提供一整套软件组件、工具和框架,基本上将构建 Optimism Rollups 链的复杂过程分解为一个简化的过程。下面我们以 OP stack 框架为例,进行 Optimism Rollups 的典型架构分析。
执行节点:Op-geth 是以太坊的扩展执行客户端,处理 Layer2 的特定功能,如接收来自 Layer1 的代币存款。这一层定义了负责执行状态变异的所有函数。在这里,状态转换是根据通过引擎 API 从汇总节点(序列和验证器)收到的输入触发的。
Rollup节点:包括排序器和验证器。排序器负责对来自 layer 2 的处理后的交易进行批处理并将其发布到 Layer1 上。排序器定义了 Layer2 链上交易的收集和发布方式。而验证器/验证器则检查批处理交易的有效性,并在检测到任何欺诈时提交证据。
证明方案:Cannon 是 Geth 的升级版,负责在欺诈检测和证明阶段运行EVM。它本质上是一个链上争议引擎,通过 API 与排序器和验证器进行协调,以证明错误的交易。
批量提交:Sequencers 一次性批量处理所有处理后的交易,由验证者进行验证,然后 Sequencers 将批量处理后的交易提交至 Layer1。
Bridge合约:部署在以太坊和 Layer2 上,允许用户在 Layer1 和 Layer2 之间传递消息,转移资产。
在Optimistic Rollup的技术架构下,保证用户资产在 L1 和 L2 之间转移过程中的安全性是至关重要的。下面将详细说明用户如何在两层之间进行资产的存取操作,以及系统如何维护这些交易的完整性和安全性。
资产跨入Rollup:用户将资金存入 Layer1 上 Rollup 的链桥合约中。该链桥合约会将交易中继到 Layer2,在那里铸造等量的资产并发送到用户在 Optimistic Rollup 中选择的地址。
用户生成的交易(如 Layer1 到 Layer2 的存款)通常会排队,直到排序者将它们重新提交到 Rollup 合约。然而,为了保持抗审查能力,如果交易延迟超过允许的最大时间,Optimistic Rollup 允许用户直接向链上 Rollup 合约提交交易。
从Rollup提取资产:由于欺诈证明机制,从 Optimistic Rollup 中取款到以太坊较为复杂。如果用户发起一个 Layer2 到 Layer1 的交易以提取在 Layer1 上托管的资金,他们需要等待挑战期结束,这通常持续约 7 天。
当用户在 Rollup 上发起取款请求后,该交易会被纳入下一批次,同时用户在 Rollup 上的资产被销毁。一旦批次在以太坊上发布,用户可以计算一个 Merkle 证明来验证其退出交易是否包含在区块中。接下来便是等待延迟期结束后完成 Layer1 上的交易,并将资金提取到主网。
为避免在向以太坊取款前等待一周,Optimistic Rollup 的用户可以向流动性提供者 (LP)申请垫付,其承担待处理的取款的所有权,并在 Layer1 上向用户支付资金以换取一定费用。流动性提供者可以在释放资金前通过自行检查链上数据来验证用户取款请求的有效性。这样,他们可以确保交易最终会得到确认,实现去信任的确定性。
审计项
Layer2是一个完整的区块链系统,因此公链的通用审计项也适用于Optimistic Rollup,具体见本文末尾附录。
此外,由于其特殊性,Optimistic Rollup 还需要进行一些额外的审计:
数据可用性证明:确保 Layer2 交易数据在 Layer1 上可用,防止数据丢失。
数据同步机制:检查 Layer1 和 Layer2 之间的数据同步机制是否健全,是否能够处理网络分区等异常情况。
欺诈证明合约:验证欺诈证明(Fraud Proof)合约的实现是否正确。
挑战期机制:检查挑战期的长度是否合理,能否在规定时间内完成欺诈证明。
欺诈证明提交流程:检查提交欺诈证明的流程是否安全。
存款和取款流程:检查从 Layer1 到 Layer2 以及从 Layer2 到 Layer1 的存款和取款流程,确保流程安全。
资产铸造和销毁:检查资产在 Layer2 上的铸造和销毁逻辑,确保与 Layer1 资产的对应关系正确。
流动性提供者机制:如果有流动性提供者(LP)机制,需要检查 LP 的操作流程及其安全性。
Zero-Knowledge Rollups
概述
Zero-Knowledge (ZK) Rollups 是基于零知识证明的 Layer2,它主要在链下进行复杂的计算和证明的生成,链上进行证明的校验并存储部分数据保证数据可用性。
ZK Rollups 是“混合扩容解决方案”,它是独立运行但从以太坊获得安全性的链下协议。具体来说,以太坊网络强制执行 ZK Rollups 上状态更新的有效性,并保证每次更新 Rollup 状态时后台数据的可用性。Rollup 的状态由部署在以太坊网络上的智能合约维护。为了更新这个状态,ZK Rollups 节点必须提交有效性证明以进行验证。有效性证明是一种加密保证,证明提出的状态变化确实是执行给定批次交易的结果。这意味着 ZK Rollups 只需提供有效性证明即可在以太坊上最终确定交易,无需发布所有交易数据。
从 ZK Rollups 转移资金到以太坊时不会出现延迟,因为一旦 ZK Rollups 合约验证了有效性证明,就会执行退出交易。相比之下,从Optimistic Rollups 中提取资金会产生延迟,因为任何人都可以使用欺诈证明来挑战退出交易。
代表项目
1. zkSync
zkSync是由Matter Labs团队于5年前推出的以太坊L2解决方案,采用零知识证明技术来实现高效的交易验证,融资超过了2亿美元。zkSync是使用ZK Rollups的网络中生态发展最活跃的Layer2,同时zkSync也备受争议。Beosin此前对其生态头部DeFi项目SyncSwap进行了审计,涵盖代码质量,合约逻辑和安全,运行模型等。
2. StarkNet
StarkNet利用 ZK-STARK 构建Layer2,提升交易速度与降低交易费用。StarkNet拥有原生的虚拟机(Cairo VM)与开发语言Cairo,帮助开发人员更加安全、方便地编写智能合约。Beosin已成为StarkNet官方安全合作伙伴,完成其生态DeFi项目Option Dance和基础设施明星项目Reddio的安全审计。2024年8月13日,Reddio完成由Paradigm领投的种子轮融资,将致力于构建高性能的并行EVM Layer2网络。
3. Scroll
Scroll 通过零知识证明技术进行扩容,并通过硬件加速零知识证明的生成和验证,致力于实现字节码级别的 EVM 兼容。这意味着开发者可以直接使用 Solidity 和以太坊相关的开发工具来构建智能合约。有关Scroll与zkEVM的分析与审计,可参考《Scroll会带动Layer2新浪潮吗?以及你不得不知晓的zkEVM电路与审计知识》。
架构分析
ZK Rollups的通用框架包括 Rollup 和 Bridge 合约、排序器、聚合器、中继器及生成零知识证明的 Roller 网络。具体架构如下图所示:
Rollup 合约和桥合约:
Rollup 合约负责为 Rollup 交易提供数据可用性,验证 zkEVM 有效性证明,并允许用户在以太坊和 Rollup 之间转移资产。它从排序器接收 Layer 2 状态根和区块,状态根存储在以太坊状态中,二层区块数据作为以太坊的 calldata 保存。
桥合约部署在以太坊和 Layer2 上,允许用户在 Layer1 和 Layer2 之间传递消息,转移资产。
Sequencer:排序器提供 JSON-RPC 接口并接受 Layer2 交易,定期从内存池中检索一批交易执行,生成新的 Layer2 区块和状态根。其实现通常基于 Go-Ethereum (Geth),确保最佳兼容性和最高安全性。
Coordinator:协调者在排序器生成了一个新的区块时会收到通知,并从排序器接收这个区块的执行跟踪(execution trace)。然后将执行跟踪分派给 Roller 网络中随机选择的 Roller,由其生成有效性证明。
Relayer:中继器监视部署在以太坊和 Layer2上的 Rollup 合约和桥合约。主要职责是:1) 通过监控 Rollup 合约追踪 Layer2 区块的数据可用性和有效性证明; 2) 监视以太坊和 Layer2 桥接合约的存取款事件,并将消息中继到另一端。
Roller Network:Roller 网络中的 Roller 充当证明者角色,负责为 ZK Rollup 生成有效性证明。首先从协调者收到区块的执行追踪,转换为电路 witness,然后使用硬件加速为每个 zkevm 生成证明,最后使用聚合证明(proof aggregation)将多个证明聚合为单个证明。
在ZK Rollups 的技术架构下,保证用户资产在 L1 和 L2 之间转移过程中的安全性是至关重要的。下面将详细说明用户如何在两层之间进行资产的存取操作,以及系统如何维护这些交易的完整性和安全性。
资产跨入 Rollup:用户将代币存入部署在一层网络链上的 ZK Rollups 合约,即可进入 Rollup。这笔交易需要等待被项目方提交到 Rollup 合约。
如果待处理的存款队列开始填满,ZK Rollups 运营商将接受这些存款交易并提交到 Rollup 合约。一旦资金存入 Rollup,用户就可以开始进行交易处理。
用户可以通过对其帐户进行哈希处理,将哈希值发送到 Rollup 合约并提供对照当前状态根进行验证的默克尔证明,来验证在 Rollup 上的余额。
从 Rollup 提取资产:用户发起退出交易,将其 Rollup 上的资产发送到指定帐户进行销毁。如果运营商将该交易添加到下一批次中,用户可以向链上合约提交提款请求。提款请求包括:
1. 默克尔证明,证明用户的交易添加到交易批次中的销毁帐户
2. 交易数据
3. 批处理根
4. Layer1 网络地址,用于接收存入资金
Rollup 合约对交易数据进行哈希处理,检查批处理根是否存在,并使用默克尔证明检查交易哈希是否是批处理根的一部分。合约执行退出交易并将资金发送到用户选择的一层网络上的地址。
审计项
Layer 2是一个完整的区块链系统,因此公链的通用审计项也适用于ZK Rollup,具体见本文末尾附录。
此外,由于其特殊性,ZK Rollup 还需要进行一些额外的审计:
证明系统安全性:检查所使用的零知识证明方案(如 Groth16、Plonk、Halo2、zk-STARK等)的安全性和正确性。
电路安全:检查电路设计和实现过程中可能存在的漏洞,主要包括以下:
欠约束电路(Under-constrained Circuits)
过度约束电路(Over-constrained Circuits)
非确定性电路(Nondeterministic Circuits)
算数溢出(Arithmetic Over/Under Flows)
位长不匹配(Mismatching Bit Lengths)
过度优化未约束的公共输入(Unused Public Inputs Optimized Out)
冰冻之心漏洞(Frozen Heart: Forging of Zero Knowledge Proofs)
可信设置泄露(Trusted Setup Leak)
未约束的赋值(Assigned but not Constrained)
不安全组件(Unsafe Component Usage)
可变精度(Variable Precision)
证明生成和验证:审查证明生成和验证的流程,确保其高效且安全。
数据可用性证明:确保 Layer2 交易数据在 Layer1 上可用,防止数据丢失。
数据同步机制:检查 Layer1 和 Layer2 之间的数据同步机制是否健全,是否能够处理网络分区等异常情况。
存款和取款流程:检查从 Layer1 到 Layer2 以及从 Layer2 到 Layer1 的存款和取款流程,确保流程安全。
资产铸造和销毁:检查资产在 Layer2 上的铸造和销毁逻辑,确保与 Layer1 资产的对应关系正确。
外部依赖和已知漏洞扫描:ZK Rollup 通常大量依赖于第三方的密码学和数学仓库或工具,应详尽检查其依赖安全,进行已知漏洞的扫描和确认。
附录
公链 & Layer2 通用审计项:
整数溢出:检查整数上溢和整数下溢
死循环:检查程序的循环判断条件是否合理
无限递归调用:检查程序递归调用的退出条件是否合理
竞争条件:检查在并发状态下,对共享资源的访问操作
异常崩溃:检查能让程序主动退出的异常抛出代码
除0漏洞:检查是否有除以0的情况
类型转换:检查类型转换是否正确,转换过程中是否丢失重要信息
数组越界:检查是否访问超出数组界限的元素
反序列化漏洞:检查反序列化过程中有没有问题
功能实现安全:检查各RPC接口实现是否存在安全隐患,是否与RPC接口功能设计相符
敏感RPC接口权限设置是否合理:检查敏感RPC接口的访问权限设置
加密传输机制:检查是否用加密传输协议,比如TLS等
请求
数据格式解析:检查对请求数据的格式解析过程钱包解锁攻击:节点解锁其钱包的时候,被RPC请求窃取资金
传统Web安全:检查是否存在以下漏洞:跨站点脚本 (XSS) / 模板注入 / 第三方组件漏洞 / HTTP 参数污染 / SQL 注入 / XXE 实体注入 / 反序列化漏洞 / SSRF 漏洞 / 代码注入 / 本地文件包含 / 远程文件包含 / 命令执行注入等传统漏洞
网络节点身份认证和识别机制:检查是否存在节点身份识别机制,节点身份识别机制能否被绕
路由表污染:检查路由表是否能够被随意插入或覆盖数据
节点发现算法:检查节点发现算法是否均衡且不可预测,比如距离算法不平衡等问题
连接数占用审计:检查p2p网络连接节点数的限制和管理是否合理
日蚀攻击:评估日食攻击的成本与危害,必要时提供量化分析
女巫攻击:评估投票共识机制,分析投票资格检查策略
窃听攻击:检查通信协议是否泄露隐私
异形攻击:评估节点是否能识别同类链节点
时间劫持:检查节点的网络时间计算机制
内存耗尽攻击:检查大内存消耗的地方
硬盘耗尽攻击:检查大文件存储的地方
socket压力攻击:检查链接数量的限制策略
内核句柄耗尽攻击:检查内核句柄创建的限制,比如文件句柄等
持续性的内存泄露:检查内存泄露的地方
哈希算法安全性:检查哈希算法的抗碰撞性
数字签名算法安全性:检查签名算法安全性,算法实现的安全性
加密算法安全性:检查加密算法安全性,算法实现的安全性
随机数生成器安全性:检查关键随机数生成算法是否合理
BFT实现安全:评估BFT算法的实现安全性
分叉选择规则:检查分叉选择规则以确保安全性
中心化程度检测:鉴别系统设计中是否存在过度中心化设计
激励机制审计:评估激励机制对安全性的影响
双花攻击:检查共识是否可以防御双花攻击
MEV攻击审计:检查区块打包节点的MEV对链公平的影响
区块同步过程审计:检查同步过程中的安全问题
区块格式解析过程审计:检查格式解析过程中的安全问题,比如解析错误导致奔溃
区块生成过程审计:检查区块生成过程中的安全问题,包括Merkle tree root构建方式是否合理
区块校验过程审计:检查区块签名内容项及验证逻辑是否充分
区块确认逻辑审计:检查区块确认算法及实现是否合理
区块哈希碰撞:检查区块哈希碰撞的构造方式,及碰撞时的处理是否合理
区块处理资源限制:检查孤儿区块池、验证计算、硬盘寻址等资源限制是否合理
交易同步过程审计:检查同步过程中的安全问题
交易哈希碰撞:检查交易哈希碰撞的构造方式,及碰撞时的处理
交易格式解析:检查格式解析过程中的安全问题,比如解析错误导致奔溃
交易合法性校验:检查各类型交易签名内容项及验证逻辑是否充分
交易处理资源限制:检查交易池、验证计算、硬盘寻址等资源限制是否合理
交易延展性攻击:交易是否可以改变内部字段(比如ScriptSig)从而改变交易hash而不影响交易的有效性
交易重放攻击审计:检查系统对交易重放的检测
合约字节码校验:检查虚拟机校验合约的过程的安全问题,比如整数溢出、死循环等
合约字节码执行:检查虚拟机执行字节码的过程的安全问题,比如整数溢出、死循环等
gas模型:检查交易处理/合约执行的各原子操作对应的手续费是否与资源消耗成正比
日志记录的完整性:检查关键信息是否被日志记录
日志记录的安全性:检查处理日志的过程中,是否因处理不当造成安全问题,比如整数溢出等
日志包含隐私信息:检查日志是否包含密钥等隐私信息
日志存储:检查日志是否记录过多内容,导致节点资源消耗
节点代码供应链安全:检查所有第三方库、组件及公链框架对应版本的已知问题
Beosin作为全球最早一批从事形式化验证的区块链安全公司,主打”安全+合规“全生态业务,在全球10多个国家和地区设立了分部,业务涵盖项目上线前的代码安全审计、项目运行时的安全风险监控与阻断、被盗追回、虚拟资产反洗钱(AML)以及符合各地监管要求的合规评估等“一站式”区块链合规产品+安全服务。欢迎有审计需求的项目方与Beosin安全团队联系。