以太坊第一次硬分叉改了什么:EIP-2 与家园升级的四条规则 图 1
以太坊第一次硬分叉改了什么:EIP-2 与家园升级的四条规则 · 图 1

以太坊的协议史是从一次自己动手改规则开始的。2016 年,主网在区块 1,150,000 处执行了第一次计划内硬分叉,代号家园(Homestead),EIP-2 就是这次升级的行为说明书,2015 年 11 月 15 日由 Vitalik Buterin 起草,状态 Final。它一共写了四处改动,每一处都对应上线第一年暴露出来的一个具体麻烦。这一篇按提案原文逐条拆开讲。

第一条:用交易直接建合约,价格从二万一千涨到五万三

以太坊里创建合约有两条路:发一笔 to 字段为空的创建交易,或者让已有合约执行 CREATE 指令。家园之前,前者只扣二万一千 Gas(和一笔普通转账同价),后者要三万二。价格差让所有人都倾向用裸交易建合约,协议认为这形成了错误激励,于是把创建交易的起始扣费提到五万三千(外加交易数据的字节费),CREATE 指令保持不变。提案的动机章节还展示了一个更尴尬的玩法:借助当时的自毁退款,一笔以太转账可以只花一万一千多 Gas 就绕道完成,理由是’这不算严重问题,但 arguably 是个 bug’。涨价就是把这类省费绕路折回正常成本。

第二条:s 值偏大的签名从此无效

椭圆曲线签名有个数学特性:任何一份签名,把 s 换成曲线阶数减去 s、同时翻转恢复位,验签照样通过。同一笔交易于是有两个都合法、哈希却不同的编码——这就是交易可塑性:你在交易所或者合约里登记的那串交易哈希,可以在别人的签名环节后变成另一串。EIP-2 直接一刀切:s 值大于 secp256k1 群阶数一半的签名,从家园块起视为无效。有个刻意的例外:签名恢复预编译不作此限制,仍接受高 s 值签名,提案说明这是为了兼容拿它验比特币旧签名的场景。

第三条:创建失败就失败,不再留一个空壳

家园之前,如果创建交易的 Gas 不够支付最后的代码入库费,结果是交易花光了钱、链上却留下一个没有代码的空合约。家园之后这种情况直接按燃料耗尽处理:交易失败,什么都不创建。这条规则和后来 2016 年底 EIP-161 大规模清理空账户是同一根问题线上的两道工序——一个管住新壳的诞生,一个负责清掉旧壳。

第四条:难度公式换算法

旧公式每块只能按正负一的步进调整难度,区块来得太快时降不下来。新公式把调整项改成与时间差成比例的连续值:系数从正一往下,按每慢十秒扣一档,最深到负九十九——也就是说,快时上坡每块最多提前值的两千零四十八分之一,慢时下坡最深可砍到两千零四十八分之九十九。难度追赶出块速度的下坡路,从这次换式起才存在。

一次升级打包多份提案的起点

以太坊改进史最常见的一种提案叫元提案:自己不改任何规则,只登记一次升级装了哪些别的提案。家园这轮的清单在 EIP-606 名下,把这几处改动钉在同一高度。对今天的使用者,EIP-2 留下的最直接的遗产是第二、三条:所有主流钱包和节点从此拒绝高 s 签名,你的交易哈希在广播前后保持稳定;而’创建失败留下空地址’这类玄学现象,从协议层被终结。

快速问答

问:家园升级会让我手里的币出问题吗? 答:不会。四处改动都是规则收紧,不涉及账户余额或地址变更;不升级的节点会在那条高度之后掉队,这也是硬分叉的标准代价。

问:签名可塑性后来彻底解决了吗? 答:交易层的可变性被这条规则压住了,但任何依赖’签名编码唯一’的系统仍应做二次校验,密码学上的对称性并没有消失,只是协议不再接受对称的另一半。

风险提示:本文为协议历史科普,不构成任何投资建议;具体激活高度与规则细节以 EIP 仓库当期文本为准。