一、背景

区块链技术存在着“不可能三角”,即无法同时达到 可扩展(Scalability) 、去中心化(Decentralization) 、安全(Security) ,三者只能得其二

  • 可扩展性:每秒可以处理大量交易。
  • 去中心化:拥有大量参与区块生产和验证交易的节点。
  • 安全性:获得网络的多数控制权需要非常高昂的成本。

以太坊的底层设计是将安全性与去中心化 放在了不可能三角的首位,这也就造成了性能的先天不足,无法满足大规模的交互。当前以太坊的 TPS 约 25-30 TPS(出块 12 秒 / 块,Gas 上限 60M,2025 年Fusaka 升级后) ,对比传统支付系统:Visa 的峰值 TPS 约为 24,000 笔 / 秒,支付宝的峰值 TPS 约为 100,000 笔 / 秒。以太坊的性能差距达到了千倍级别,根本无法支撑大规模的日常交易。

二、扩容手段

简单说,以太坊扩容就是为了又快又省钱,提升用户体验

非主流扩容手段

以下的扩容手段目前已经不再是主流方案,而且大多也都转型为了 rollup,可以选择性了解

分片(sharding)

Sharding 一词本来源于数据库的术语,表示将大型数据·库分割为很多更小的、更易管理的部分,从而能够实现更加高效的交互。区块链分片是指对区块链网络进行分片,从而增加其扩展性。根据最新的以太坊 2.0 规范,以太坊区块链会被分为 1024 个分片链,这也意味着以太坊的 TPS 将提高 1000 倍以上。但目前 Sharding 方案仍然在跨分片通信、欺诈识别、随机分配与选举安全性等方面存在不足,所以目前以太坊还是以推进 Rollup 为主。

状态通道(state channel)

状态通道是一种智能合约驱动的链下交互协议,允许固定的一组参与方,在不向以太坊主链提交任何交易的情况下,无限次地更新彼此的状态(如余额、合约存储、游戏进度等)。只有在通道创建(初始化)关闭(终结) 时,才会与主链进行交互,最终的状态由链上智能合约进行结算。
简单的操作流程示例:

  1. 固定范围内的用户(比如 A 和 B)确定通道的有效期、锁定的资产数量、争议解决的超时时间。
  2. 部署通道智能合约,锁定资产,并生成初始化的状态S0。
  3. 开始进行链下交易,交易之后的每一个状态都包含前一个状态的哈希值,而且需要双方签名确认,形成一个链式结构,状态哈希的数据可以认为是带序列号的,所以通道合约是可以识别顺序的。
  4. 将链下的最终有效状态提交到主链,由智能合约进行结算,解锁并分配锁定的资产。

问题:如何保证安全性呢?
首先,每次交易过后生成新的状态哈希,都是需要参与方进行签名的,所有人都认可的。其次,合约收到了终结的状态哈希之后是存在一定的挑战期限的,其他人仍然可以提交比该状态哈希更靠后的结果,最终通道合约会以最新的状态哈希结算,所如果有人提前了中间的状态哈希想要回滚交易,其他人也是可以进行纠正并成方

侧链(side chain)

独立于以太坊主链的区块链,通过双向锚定桥与以太坊互操作,具备自有共识机制和节点网络,以牺牲部分安全性为代价,实现高 TPS 和低 Gas 成本。
简单来说,就是为了体验更快更好的交易体验,用户先把 ETH 转成侧链的币种(镜像币)进行铸造,然后在侧链上交易,满足侧链的验证规则即可,后面也可以再把自己的 ETH 给赎回,比如:Polygon PoS,以太坊生态最大的侧链;Binance Smart Chain(BSC);Avalanche C-Chain
严格意义上,我认为这一类不属于 Layer2 ,本质上和以太坊主链是平行关系,之间具有交互关系而已。而大部分依托于 ETH 侧链也都在像 Rollup 转型,比如后续推出的 Polygon zkEVM
此外,详细的交易数据都在侧链上面,主链上是没有的详情的

问题:拿Polygon Pos 来说,他的出块速度可以达到 2s,TPS 达到7K,为什么以太坊不能像拿Polygon一样实现 2s 的出块速度,实现更高的 TPS?
以太坊的慢是为了平衡去中心化、安全性和系统稳定性,而想要拥有更快的出块速度,会从硬件门槛、共识机制、网络同步三个维度破坏这种平衡的,具体体现在如下几个方面
a. 硬件门槛提升,去中心化程度下降:更快的出块速度需要节点在更短的时间内处理更多的交易、生成更多的区块、验证和同步更多的数据,这会大幅提升节点的硬件要求,造成节点骤降,去中心化程度降低。
b. 共识最终性变弱,安全性降低:更快的出块速度会迫使共识机制降低最终性的要求(比如减少签名验证的节点权重、缩短确认的区块数),这会导致交易的最终性变弱,更容易出现交易回滚、双花攻击等问题,攻击成本会下降非常多。
c. 网络同步压力增大,系统稳定性下降:更快的出块速度会缩短区块之间的时间间隔,节点同步区块的时间会更加紧张,这会大幅增加网络拥堵的概率和分叉的风险,导致系统稳定性下降,影响用户体验。

Plasma

类似于侧链技术,只不过该子链没有自己的共识机制和专属货币,实际的数据还是依托于 L1 主链,只是把大部分交易放到独立的子链(Plasma 链)上处理,只把关键的「状态根哈希」和「资金进出记录」同步到以太坊主链;用户提现时,需要通过挑战期机制证明自己的资产合法,才能从主链取回资金。此外,详细的交易数据都在子链上面,主链上是没有的详情的。由于子链的安全性差,所以需要定时把子链的根哈希同步到主链存储

问题1:为什么需要存在挑战期间?
其实 plasma 可以做到在同步根哈希的时候就完成全部验证,但是只做了弱验证,原因是完全验证需要合约获取子链的完整交易数据,并重新计算根哈希,这会让 Plasma 失去扩容的意义。比如一次同步一个根哈希关联着 100W 笔交易大概 1G 的数据,那么每次同步到合约上面,以太坊主链的交易数据量会暴增,不仅没有扩容,反而会让主链更加拥堵;验证的时间和 Gas 成本会高到无法承受,完全失去了 Layer2 扩容的意义。
这也是 Plasma 方案的 「安全兜底设计」 —— 既然提交时的弱验证无法防止所有作恶,就必须依赖用户的主动挑战,来弥补安全的不足。
问题2:用户如何进行挑战的?
假设合约中保存着的根哈希列表为[R1,R2,R_bad],其中 R_bad 是子链伪造的哈希,那么用户需要提供自己确实在子链上且有余额,提供子链的 R2 Merkle 树的余额子节点+哈希序列,可以一步一步推导到 R2;之后再证明 R_bad 里面没有绑定自己的交易记录,继续提供子链中R_bad Merkle 树的无交易子节点+哈希序列,证明了确实没交易,然后 R_bad 记录了用户的余额是 0,那么就会被推翻了。「有一个前提就是合约是可以分析叶子节点的信息的」

Rollup

Rollup 和 Plasma 都是「主链合约锚定 + L2 映射铸币 / 销毁」的核心骨架,但是在数据同步与安全性上面有这巨大的差异

Rollup(卷叠)技术是目前最主流的 L2 扩容方案。顾名思义,Rollup 就是把一堆交易卷起来(Rollup)汇总成一个交易,所有接收到这个交易的节点只去验证执行结果,而不会验证逻辑。因此 Rollup 交易所需 Gas 费会远小于交易 Gas 费总和,TPS(每秒钟交易次数)也增加了。
Rollup 技术主要分为两类:

  1. Optimistic Rollup
    Optimistic Rollup(乐观的 Rollup 协议)采用欺诈证明方法,即对链上发布的所有 Rollup 区块都保持乐观态度并假设其有效,它仅在欺诈发生的情况下提供证据。乐观 Rollup 的优势在于能使得原生 Layer1 上的 solidity 合约可以无缝移植到 Layer2,从而最大程度提升了技术人员的研发体验,目前主流方案包括 Optimism 和 Arbitrum。
  2. ZK-Rollup
    ZK-Rollup 是基于零知识证明的 Layer2 扩容方案,采用有效性验证方法(VP),默认所有交易都是不诚实的,只有通过有效性验证才会被接受。ZK-Rollup 在链下进行复杂的计算和证明的生成,链上进行证明的校验并存储部分数据保证数据可用性。目前主流的方案包括 zkSync、StarkNet、Scroll、Polygon Hermez 等。

从中长期来看,随着 ZK-SNARK 技术的改进,ZK rollups 将在所有用例中胜出。 — Vitalik Buterin

Optimistic Rollup是可以 100% 兼容以太坊原生 EVM 的,由于 zkEVM 并没有统一的设计标准,所以每个项目方基于不同角度在兼容 EVM 和支持 ZK 之间权衡设计出各自方案,目前基本分为两种思路:

  1. 编程语言层面支持,自定义 EVM 操作码,把 ZK-friendly 的操作抽出来重新设计新的、架构不同的虚拟机,通过编译器将 Soilidity 编译成新的虚拟机操作码(性能更好,定制的 Solidity编译器和EVM 虚拟机)
  2. 字节码层面支持,支持原生 EVM 操作码(兼容性更好,还用原生的Solidity 编译器和EVM虚拟机)

问题:为什么一定要把合约也部署在 Layer2 上面?
前面的举例都是说用户和用户之间的交易放在 Layer2 上面是如何节省 Gas 和增大 TPS 的,其实合约也是一样的。合约部署在 Layer2 上后,合约的所有执行逻辑、用户的所有合约交互,都在 Layer2 链下批量完成,Layer2 只需要把「批量交易的压缩数据 + ZK 证明」提交到主网存证 / 验证即可,所以 Layer2 的优点合约都会继承。
这也是为什么一定要考虑EVM 兼容性,否则主网上的大量存量合约迁移 Layer2 成本会非常高

三、拓展

EIP-4844

该提案可以说是针对 rollup 的二次提升,提出了一种临时存储的数据结构Blob
主要有以下优势:

  • 降低Rollup 数据上链成本,进一步提升 TPS
    • 升级前 Rollup 依赖 Calldata 存储批量交易数据,Calldata 写入执行层状态,永久存储成本高(约 16 gas / 字节),导致 L2 交易费难进一步下降,而在区块上单开的区域中 Blob 存储成本仅为 Calldata 的 1/10–1/100,而且不和主网共享区块 Gas 上限
  • 降低主网存储与带宽压力
    • 原生资产交易与 Rollup 数据共用 Calldata,导致主网拥堵时 L2 数据发布成本飙升。Blob 由共识层临时存储,不占用执行层状态空间,而且会定时清理,避免节点负担过重

唯一不足:Blob 生命周期 18 天,需额外工具(如 Archival 节点、DA 层备份)保证长期数据可追溯。

zkSync Era 抽象账户(Account Abstraction, AA)

打破了以太坊 EOA 与合约账户的二元隔离,让账户既能像 EOA 一样发起交易,又能像合约一样嵌入自定义逻辑

主要解决以下 3 个痛点:

  1. EOA 账户必须持有 ETH 才能交易,哪怕你有 100 万 USDC 也没用,一分钱都转不出去
    • 抽象账户可以支持用任意 ERC20 代币支付 Gas 费(USDC/USDT/DAI 等),协议层直接写死的功能,不需要任何第三方插件(用的是zk 官方的paymaster合约组件)、不需要任何手续费,没有 ETH,照样能花所有币。
  2. EOA 账户只有一个私钥管全部资产,要么丢私钥 = 丢所有钱,要么被盗 = 被洗劫一空,没有任何风控兜底
    • 抽象账户可以支持自定义交易限额、多签验证,这些规则是写在账户的底层逻辑里的,不是第三方插件,不是可有可无的功能,而是可以自由设置的「安全防线」。比如给自己的抽象账户设置一天只能交易1 个 ETH,或者需要3个人中的 2 个人的签名才能发起交易等等
  3. EOA 账户一笔操作只能做一件事,多笔交易要重复签名、重复付 Gas,又费钱又费时间,效率极低
    • 抽象账户支持批量交易(Batch Transaction),协议层允许把多笔操作打包成一笔交易,只需要签一次名、只需要付一次 Gas 费、只需要等待一次确认,所有操作一次性完成。本身 zksync 天然支持交易批量打包的,只不过把功能提升到了用户端

参考:
zkSync基础