比特币世界问“你是什么”,回答指向你手里有没有未花掉的输出;以太坊世界问同一个问题,答案是“你是哪种账户”。以太坊状态表中每个条目都是账户对象,而账户只有两种类型:外部账户与合约账户。理解这条两分法,是理解以太坊所有账户类提案的底座。
账户对象的四个字段
无论哪种账户,状态里都存着同样四个字段:余额、随机数、代码散列、存储根。区别在于字段的用法。外部账户的代码散列恒定为空值的散列(在启用 EIP-7702 委托后另述),存储根指向一棵空树;合约账户则相反,代码散列指向它真正的字节码,存储根指向一棵可能有内容的存储树。两者的随机数含义也不同:外部账户的记录它发出的交易笔数,合约账户记录它创建过多少个新合约。同一个字段名、两套语义,这是新手读节点返回数据时最容易踩的坑。
谁能发起执行
外部账户是执行世界的“起点”:只有外部账户发起的交易承担 Gas 的原始义务,签名由私钥产出,节点用恢复算法反推出地址,确认发送者身份。合约账户不能主动做任何事——没有私钥,不能自己“想起来”要转一笔账,它只能被交易调用而运行,运行中产生的内部调用则像嵌套函数一样记在同一笔交易的执行轨迹里。这个性质常被误解为“合约里的资金会被自动管理”,实际上所有自动效果都来自某次外部交易触发的那条调用链。
地址从哪来
外部账户的地址来自公钥的哈希截断,先有密钥,地址即确定,链上是否出现过这个地址是另一回事——从未收发过的地址在状态表里根本不存在条目,直到第一次被触碰才补登。合约账户的地址由创建者的地址和创建时的随机数推导(用 CREATE 时),或由创建者、盐值和初始化代码哈希推导(用 CREATE2 时),所以合约地址在部署前就能算出来,这构成了各类“工厂”与预设地址模式的基础。
两分法松动的迹象
账户抽象方向多年来的目标,是让用户账户不必非得是最原始的外部账户形态。ERC-4337 走的是链下运营者加入口合约的路,不改动账户类型本身;2025 年 5 月的 Pectra 升级则带来 EIP-7702:外部账户可以在代码散列位上写一个“委托标记”,指向某段已有合约代码,让自己的地址在调用时表现出合约行为,但仍保留私钥签名这条主路径。这没有创造第三种账户,而是给外部账户加了一个可选的挂件:标记可以撤销,撤掉之后账户回到最朴素的形态。已有文章专讲 7702 的委托与撤销核验,本文只强调它在类型学上的位置。
与比特币模型的对照
比特币里没有这组两分法:它的状态由一笔笔未花费输出构成,谁掌握能解锁某输出的条件,谁就拥有那笔钱,账户只是钱包软件造出来的视图。以太坊把状态压回“账户”这个会计单位,于是才产生“什么是账户、账户能干什么”的类型学问题。读跨链材料时,用比特币的眼睛看以太坊账户,最容易误判“谁在控制资金”。
快速问答
问:合约账户会被“冻结”吗?答:协议层不存在冻结账户这个操作,可暂停的只是某份合约代码内部自设的开关。问:地址先有还是账户先有?答:地址作为数学对象先存在,账户作为状态条目在第一次被写入时才出现。问:怎么看一个地址是哪类账户?答:看它的代码字段是否为空(或为委托标记),区块浏览器直接展示代码标签即可判断。
风险提示:本文为账户模型科普,不构成投资建议。涉及委托、授权类操作时,理解“谁签名、谁执行”的区别是自我保护的第一课。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。