以太坊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 Rollup | ZK-Rollup | |
|---|---|---|
| 终局时间 | 7天 | 分钟级 |
| EVM兼容 | ~100% | 需专用编译器 |
| 计算成本 | 低 | 高(生成证明) |
| 代表项目 | Arbitrum、Optimism | zkSync、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:
soliditystruct 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 报价,写得烂的合约流失用户。