把以太也变成一个合约:EIP-101 的货币抽象实验 图 1
把以太也变成一个合约:EIP-101 的货币抽象实验 · 图 1

以太坊的账户余额写在协议最底层,这个不言自明的事实,在 2015 年 11 月 15 日被一份提案正面挑战过。EIP-101 由 Vitalik Buterin 起草,题目叫 Serenity 货币与密码抽象,状态 Stagnant。它的核心动作只有一句话:以太不再作为账户对象的一个字段存在,全部以太的持有权移交零号地址上一个预置的合约。账户从此只有代码和存储两个字段。这句话的每一层后果,今天读来都比它的年纪前卫。

当余额只是别人合约里的记账

改完之后,世界变成这样:查询余额的命令被重新映射成调用零号合约;转账变成’给对方在合约账本里改一行字’;而交易本身被砍到只剩四个字段——收件地址、起始燃料、数据、代码。签名验证、防重放计数、以太本身,统统不在底层规范里出现。那普通用户怎么花钱?提案给出一个’默认账户代码’:一段小程序,收到交易后解开签名、核对计数、转发真正的调用,最后按消耗付燃料。它相当于把今天钱包固件里的逻辑,原样摊开放进链上代码。

签名可以换,计数可以换

把验证逻辑挪进账户代码的回报是密码学上的自由:提案明说,用户完全可以改用 ed25519、Lamport 签名或环签名来保护自己的账户——‘我们可以合理地说以太坊是量子安全的,因为你有权用 Lamport 签名给自己看门’。防重放计数同理:想要并行发交易的人可以自己实现分叉计数,甚至改用 UTXO 式的方案。多签账户也不再需要合约套合约的两层结构,一层代码直接写完规则。

价值转移变成三步支票

msg.value 这个’随调用附带多少以太’的操作码被取消了,附钱转账改写成三步编曲:调用前先在零号合约开一张指定金额的支票,被调用方在入口兑现支票、把金额读进约定的内存位置,调用结束后外层再打电话作废这张没被兑现的支票。设计目的是堵住重入攻击的老路——第二次进场时支票早已作废,钱不会重复到账。以今天的后见之明看,这段设计比 ERC-223 等回调防御提案早了两年。

零号地址后来住进了谁

提案给零号地址安排的职能——持有全部以太——最终没有实现:今天的零号地址仍是空地址,以太还留在账户字段里。但这份提案圈定过的问题域一个个成了主线:2018 年起一波账户抽象提案、2023 年落地的 ERC-4337 智能账户,走的都是’把验证逻辑变成可替换程序’这条 EIP-101 画下的线,区别只是不动底层、在协议之上一层盖楼。这几乎是以太坊改进史最常见的节奏:最激进的蓝图先停摆,它圈出的需求由更保守的提案分期兑现。

一笔直觉账

可以这样理解两种世界的差异:现在的以太坊像每个账户自带一只保险箱,钥匙的齿形(签名算法)出厂定死;EIP-101 把全城保险箱搬进市中心一座大楼,你家门口只剩一张写着你程序的门禁卡。好处是全城的锁都能升级——换个算法不用动地基;代价是任何人进门都要多跑一趟市政厅,那次跨合约调用的开销与复杂度,正是这种纯度的账单。协议选择了另一条路:保险箱不动,但允许你在旁边加装一道可定制的岗亭。

快速问答

问:这份提案和 ERC-4337 是什么关系? 答:没有继承关系,是同一问题的两种解法深度。EIP-101 要求改交易格式和账户结构,属于推倒重来级硬分叉;ERC-4337 把验证外包给链下打包合约,底层一行不动。

问:账户只剩代码和存储,那余额为零和新账户怎么区分? 答:在抽象世界里这个区分本身消失了——没余额只是合约账本里那行为零,这正是设计想要的统一性。

风险提示:本文为提案历史分析,不构成任何投资建议;方案细节以 EIP 仓库当期文本为准。