以太坊的技术架构到底有多脏?

💡 原文中文,约10500字,阅读约需25分钟。
📝

内容提要

文章指出,以太坊技术架构的“脏”源于历史债务而非代码水平。2016年DAO事件后,go-ethereum仍硬编码退款合约与地址列表;客户端需按区块高度兼容Homestead至Cancun等历代规则。EOA权限不足,于是叠加ERC-4337、EIP-7702、EIP-8141;L1扩容困难又引入Blob。每个决定当时合理,累积后却成为难以重构的遗留系统。

🔎

延伸解读

历史债务的工程根源

文章指出,以太坊的“脏”并非代码水平差,而是历史债务的累积。2016年DAO事件后,go-ethereum源码中仍硬编码退款合约和地址列表,成为共识规则的一部分。每个历史决策在当时合理,但无法删除,导致客户端必须兼容从Homestead到Cancun的所有规则。这种沉积使系统越来越像遗留系统,只能不断打补丁。

账户抽象的补丁式演进

以太坊早期EOA权限模型过于简单,无法满足现代钱包需求。于是通过ERC-4337引入UserOperation、Bundler等外部层,又用EIP-7702让EOA委托代码,再到EIP-8141提出Frame Transaction。每一步都是对旧设计的修补,而非替换。这种叠加导致交易模型越来越复杂,但兼容性要求使旧机制无法移除。

扩容路线与协议负担

L1扩容困难促使以太坊转向Rollup-centric路线,并引入EIP-4844的Blob为Rollup提供廉价数据可用性。这使L1协议增加了Blob交易、Blob Gas等新结构,相当于为L2需求修改自身。文章认为,这虽然解决了扩容问题,却让L1承担了更多复杂性,且Rollup生态的碎片化也削弱了原有的可组合性。

兼容性代价与系统风险

文章通过SELFDESTRUCT语义修改、Gas成本多次重定价等例子,说明以太坊为兼容历史而保留甚至改变操作码行为。这种“不能删、只能改”的模式是遗留系统的典型症状。最终,系统复杂度来自无数局部合理决策的叠加,导致无人能完整理解,必须依赖顶级工程师维护。

❓

Q&A

为什么说以太坊的技术架构“脏”?

这里的“脏”不是指代码水平差,而是指以太坊积累了太多只有结合历史背景才能解释的特殊规则、例外、兼容层和协议补丁。这些历史债务源于一次次安全事故、Gas模型修改、账户抽象、共识切换和Layer 2扩容,最终全部沉积在同一套协议里,使系统像遗留系统一样难以重构。

以太坊客户端里为什么还保留着2016年DAO事件的代码?

因为2016年The DAO被攻击后,以太坊通过硬分叉将相关账户的ETH转入退款合约。为了不破坏历史共识,所有从创世块同步的客户端都必须理解并执行这一状态转换。因此,go-ethereum源码中至今仍硬编码着DAORefundContract和DAODrainList,包含具体退款地址列表,无法删除。

以太坊客户端如何兼容从Homestead到Cancun的历代规则?

以太坊客户端必须根据区块高度和时间戳判断当前处理的是哪个历史时期,并选择对应的状态转换规则。例如,第100万块按当时的EVM执行,London后BASEFEE规则改变,Merge前后共识结构不同,Shanghai和Cancun又引入新规则。客户端通过ChainConfig中的各种Block/Time字段和IsHomestead、IsByzantium等判断函数来实现这种按历史时期分段的协议执行。

ERC-4337、EIP-7702和EIP-8141分别解决了什么问题?

ERC-4337通过UserOperation、Bundler、EntryPoint等在不修改共识层的情况下实现账户抽象,但引入了第二套交易系统。EIP-7702允许EOA设置delegation indicator,将代码行为委托给其他地址,以兼容现有EOA资产。EIP-8141提出Frame Transaction,将交易拆分为验证、付款、执行等frame,进一步实现原生账户抽象。三者都是为弥补EOA权限模型不足而叠加的补丁。

EIP-4844引入Blob对以太坊架构有什么影响?

EIP-4844为Rollup提供廉价的数据可用性,给协议增加了Blob交易、Blob Gas、Blob Base Fee、KZG承诺等全新数据结构。这使得以太坊L1不再仅是执行智能合约的区块链,还兼任Rollup数据发布层。从L1简洁性角度看,这是为了L2需求而修改L1,导致架构更复杂。

以太坊的Difficulty Bomb为什么最终变成了历史债务?

Difficulty Bomb最初设计用来迫使网络从PoW转向PoS,通过指数级提高挖矿难度来推动升级。但PoS未能按计划完成,导致多次延期,多个升级(如Byzantium、Constantinople、Muir Glacier、London、Arrow Glacier、Gray Glacier)都包含Difficulty Bomb delay。原本推动迁移的机制反而成了需要反复维护的历史债务。

以太坊的SELFDESTRUCT操作码为什么被修改而不是删除?

早期SELFDESTRUCT可以删除合约代码、清理storage并发送ETH,但后来发现这会带来复杂性并阻碍Verkle Tree等未来状态结构。由于历史合约可能依赖它,不能直接删除opcode。于是EIP-6780保留了SELFDESTRUCT的名称和操作码,但改变了语义:除非在同一笔交易中创建并销毁,否则不再真正销毁账户的代码和storage。

以太坊的Gas成本模型为什么需要反复调整?

因为早期Gas定价不合理,可能被利用进行DoS攻击,所以以太坊多次重新定价,如EIP-150、EIP-1884、EIP-2929。Berlin之后还引入cold access、warm access和access list,使得执行opcode的Gas成本不仅取决于opcode本身,还取决于交易此前访问过什么。这是系统在遭遇攻击和性能瓶颈后不断校准成本模型留下的疤痕。

为什么说以太坊的Rollup-centric路线导致了可组合性下降?

以太坊最初的可组合性是指所有合约在同一个状态机内,一个交易内可以互相调用。但Rollup-centric路线将生态切分为L1和多个Rollup,每个Rollup有自己的sequencer、bridge、状态、提现规则、fee、explorer、RPC和故障模式。这相当于把统一系统拆开,再花时间研究如何拼回来,导致原本的composability被削弱。

以太坊的技术架构最终变成了什么样子?

以太坊变成了一个几乎任何东西都不能删、任何历史都不能忘、任何错误都只能继续向前兼容的巨大状态机。每一代工程师都觉得自己只加了一个合理的功能,但累积起来却使协议变成了一座技术考古遗址。2026年的最新客户端里,仍然可以找到2016年DAO黑客事件留下的地址。

🏷️

标签

➡️

继续阅读