5月28日 04:06

以太坊Layer 2和Gas优化如何提升性能?

以太坊主网 TPS 大约 15,一笔简单转账在拥堵时 gas 费能到几十美元。性能优化就两条路:Layer 2 把交易搬到链下,单笔成本降 90%+;Gas 优化从合约层面砍掉不必要的链上操作,一笔交易省几千到几万 gas。

Layer 2 扩容方案

核心思路:不让每笔交易都占主网。Rollup 把几百笔交易打包提交一个状态根,主网只验证这根"摘要"。

Optimistic Rollup

假设交易都合法,批量提交后开放 7 天挑战期。有人觉得有假交易就提交欺诈证明,证明成立则回滚。Arbitrum(TVL 超 150 亿美元)和 Optimism 是这个赛道的头部。几乎 100% EVM 兼容,现有合约直接部署,但提币要等挑战期结束。

ZK-Rollup

用零知识证明验证每批交易有效性,提交即终局,没有等待期。计算成本高(生成证明需要专用 prover),EVM 兼容需要额外编译。Vitalik 明确说过"ZK 是长期方向",zkSync 和 StarkNet 是代表项目。

关键转折:EIP-4844

2024 年 Dencun 升级引入 blob 交易——Rollup 数据单独存储、18天自动清理,不再永久占链上空间。L2 提交数据费用降了 90%+,用户交易费从几美元降到几美分。这个升级直接改变了 L2 的经济模型。

Optimistic RollupZK-Rollup
终局时间7天分钟级
EVM兼容~100%需专用编译器
计算成本高(生成证明)
代表项目Arbitrum、OptimismzkSync、StarkNet

迁移现有合约选 Optimistic;对终局速度敏感选 ZK。

Gas 优化技巧

以太坊存储定价是理解 gas 优化的钥匙:SSTORE 从零写非零 20000 gas,非零改非零 2900 gas,非零改零退 4800 gas。SLOAD 一次 2100 gas。优化本质就是少写存储、合并多次写入。

Storage Packing

连续声明的值类型被编译器打包进同一个 32 字节 slot。三个 uint256 占 3 slot,改成 uint128 + uint64 + uint64 只占 1 slot,省 2 次 SSTORE:

solidity
struct Packed { uint128 balance; uint64 nonce; uint64 timestamp; } // 1 slot, 省 2 次 SSTORE

注意:打包的变量要真正一起用。热门路径独读一个字段反而浪费。mapping 无法打包。

calldata 替代 memory

外部函数的数组参数用 calldata 直接读调用数据,memory 要先拷贝一份。一个 100 元素的数组,calldata 能省几百 gas 的拷贝开销。

其他常用技巧

  • immutable / constant:编译时写入字节码,不占 storage
  • 短字符串用 bytes32 代替 string
  • 用事件记历史数据,别往链上存
  • unchecked {} 跳过溢出检查(Solidity 0.8+),省几百 gas

追问

状态通道为什么被 Rollup 干掉了?

状态通道要求双方在线、锁定资金、只能做点对点交互,不支持通用合约逻辑。Rollup 不要求在线也不限制合约,通用场景完胜。闪电网络在 Bitcoin 支付场景还活着,以太坊生态状态通道已经没人用了。

以太坊分片还做吗?

不做了——执行分片被砍了。现在的方向是 PeerDAS 扩展数据可用性层,给 Rollup 提供更多 blob 空间。思路变了:主网只管共识和数据可用性,计算全交给 L2。PeerDAS 目标是 blob 从 6 个扩到 64 个,L2 数据费用还能再降一个量级。

怎么判断一个 L2 值不值得用?

三个维度:安全性(是否继承主网共识、排序器有没有多签后门)、活跃度(TVL、日活地址、交易量)、去中心化(排序器是否中心化、有无抗审查机制)。2026 年 L2 赛道在整合,TVL 不到头部 1% 的小 L2 生存空间越来越小。

EIP-4844 之后 Gas 优化还重要吗?

重要。L2 交易费降了不代表合约开发者可以乱写。同一个 L2 上,未优化的合约比优化过的 gas 消耗高 5-10 倍。用户选 dApp 时直接看 gas 报价,写得烂的合约流失用户。

标签:以太坊