分清对象
不再把钱包 App、助记词、私钥、公钥、地址和链上账户混成一件东西。
从0到深入理解以太坊
第四章 · 第二课
Ethereum learning path · 04.02
从一把永不应上链的私钥开始,沿着地址、签名、nonce 与 Gas, 看懂一个账户如何把“我想做什么”变成全网可验证的状态改变。
private_key = 0x••••••••••••••••
* 经典 EOA;Pectra 后可通过 EIP-7702 设置代码委托,后文详解。
Core idea
EOA 不是钱包界面,也不只是一个地址。它是一套授权关系: 谁能为这个地址产生有效签名,谁就能支配这个账户的根权限。 链上保存状态,链外保管秘密,签名把两者连接起来。
01 · Essence
EOA 是 Externally-Owned Account 的缩写,常译作“外部账户”。 “外部”不是指它在以太坊之外不存在,而是指它的根授权来自协议外部保存的私钥; 与之相对,合约账户的行为由链上代码决定。
以太坊协议不认识你的姓名、邮箱、Face ID 或钱包品牌。节点只处理密码学事实: 某个交易签名能否恢复出一个发送者地址;这个地址当前的 nonce 是否匹配;余额是否足以支付 转账金额与 Gas;交易按照协议执行后会得到什么新状态。所谓“你拥有这个账户”, 在最底层就是“你能产生它接受的授权”。
Interactive · trust boundary
私钥永远不应进入交易、区块或网页。钱包只用它在本地生成签名;网络得到的是可以验证的签名,不是秘密本身。
以太坊区块中的顶层 transaction 需要一个发送者。经典路径中, 发送者由 EOA 的交易签名恢复出来,所以 EOA 能成为状态转换的外部入口。 合约账户不能自行在某个时间醒来并凭空发出顶层交易;它只能在一笔已发起交易的执行过程中, 被 EOA 或其他合约调用,再产生内部的消息调用。
一句话模型: EOA 提供“谁授权这次状态改变”,交易提供“这次想做什么”, EVM 与协议规则决定“这件事能否做、做完后的状态是什么”。
不再把钱包 App、助记词、私钥、公钥、地址和链上账户混成一件东西。
知道 nonce、ETH balance、codeHash、storageRoot 各自表达什么。
从构造、签名、广播、入块到执行,解释发送者如何被验证。
理解 EIP-7702 为什么让“EOA 永远没有代码”不再是可靠的绝对判断。
02 · Vocabulary
大多数账户误解,不是密码学太难,而是日常产品把多个层次折叠成了一个“钱包”按钮。 先拆开名词,后面的签名、交易和安全才会自然。
0x 加 40 个十六进制字符。地址可以公开收款。生成一个 EOA 的核心动作只是:在本地安全地产生私钥,再计算公钥和地址。 这个过程不需要向主网登记,不消耗 Gas,也不需要节点批准。地址空间足够巨大, 因此钱包可以先生成地址,别人随后向它转入 ETH。
更精确地说,刚生成的地址只是你掌握了某个潜在账户标识的签名能力。 只有当该地址在世界状态中拥有余额、nonce、代码等非空状态时,节点才需要保存相关状态。 这不影响它先接收转账,也不改变私钥可以为它签名的事实。
钱包卸载不等于账户消失。 链上状态仍由全网保存;真正决定你能否恢复控制的是密钥或恢复材料是否还在。 反过来,截图保留地址却丢掉密钥,也无法支配账户。
03 · Anatomy
从协议视角看,世界状态把一个 20 字节地址映射到一份账户状态。 传统模型中它包含四个核心字段。EOA 与合约账户使用同一账户框架, 差异来自这些字段的值以及谁能触发行为。
Diagram · account state
经典 EOA 每有一笔交易被纳入区块,无论执行成功或回滚,账户 nonce 都会前进。
1 ETH = 1018 wei。它用于转移价值、支付执行费用和满足交易的余额检查。
经典 EOA 没有合约存储;EIP-7702 委托代码可在该账户上下文中使用存储,因此旧的绝对判断需要更新。
经典 EOA 对应空代码哈希;EIP-7702 可让账户保存 23 字节委托指示符,指向另一处实现代码。
直接记录在账户的 balance 字段中。发送 ETH 会改变发送者和接收者的账户余额。
通常记录在各自代币合约的存储映射里。钱包查询合约并汇总展示,因此 EOA 的 ETH balance 字段不包含这些代币。
这一区别能解释一个常见现象:某地址明明有很多稳定币,却可能因为没有原生 ETH 而无法在主网上支付普通交易 Gas。 代币余额属于某个合约的账本记录;协议层默认费用仍以原生 ETH 结算。 费用代付等体验需要额外的账户抽象或赞助机制,而不是把代币自动当作 ETH。
ETH 不像文件那样装在钱包里,也不是某枚硬币放进地址。更准确的表达是: 全网认可的当前状态中,地址对应的 ETH balance 是某个数;代币合约的映射中, 该地址对应的余额或 NFT 所有者记录是某个值。私钥让你能够授权改变这些关系, 并不把资产从链上搬到设备里。
04 · Derivation
私钥、公钥和地址是一条单向推导链。它让任何人都能验证“签名来自这个地址的控制者”, 又不会要求控制者公开私钥。
Diagram · one-way derivation
从 secp256k1 曲线阶允许的范围中,均匀选择一个不可预测的非零整数。
0x8f2a…d91b
使用椭圆曲线标量乘法得到公钥点。正向计算容易,反向求私钥在现实中不可行。
x || y = 64 bytes
对未压缩公钥的 64 字节坐标部分做 Keccak-256,得到 32 字节摘要。
keccak256(pubkey)
取哈希最后 20 字节,并加上 0x 前缀;可再按 ERC-55 混合大小写显示校验。
0x7A3f…91C2
十六进制地址在数值上不区分字母大小写,但 ERC-55 使用大小写模式加入轻量校验信息。
因此 0x5aAeb… 这类混合大小写地址能帮助软件发现一部分手工输入错误。
全小写地址通常仍可被解析,却失去了这层错误检测。无论是否有校验,
大额转账都应核对完整地址或使用可信的名称解析与地址簿。
“地址碰撞极难”不等于“界面不会骗你”。 地址投毒会利用首尾相似的另一个地址污染转账历史;剪贴板恶意软件会替换复制内容。 密码学保护的是签名与地址关系,不会替你判断屏幕上那个接收者是不是你真正想找的人。
05 · Transaction
交易不是“把私钥发给网络”,而是把明确的交易字段编码后取哈希, 再用私钥签名。节点从签名恢复发送者,验证状态条件,然后才决定是否接受与执行。
Diagram · transaction envelope
Interactive · transaction journey
钱包把用户意图翻译成交易字段。此时尚未签名、未广播,也没有任何链上状态改变。
交易被纳入区块后,发送者 nonce 会被消费,执行成本也要支付。
如果合约逻辑 revert 或执行发生异常,调用造成的普通状态修改会回滚,
但为已经完成的计算所付 Gas 不会退回,nonce 也不会回到原值。
这能防止同一已签交易被无限重试,也让节点为实际做过的工作获得费用机制保护。
| 类型 | 主要能力 | 与 EOA 的关系 |
|---|---|---|
| Type 0 | 传统 legacy 格式,使用单一 gasPrice。 | 仍可使用,但缺少现代动态费用字段。 |
| Type 1 | EIP-2930 access list,预声明访问的地址与存储键。 | 由 EOA 签名发起,费用仍采用传统 gasPrice。 |
| Type 2 | EIP-1559 动态费用:maxFee 与 maxPriorityFee。 | 普通钱包交易的主流格式。 |
| Type 3 | EIP-4844 blob-carrying 交易,为 L2 数据提供独立费用市场。 | 通常由 rollup 基础设施账户提交。 |
| Type 4 | EIP-7702 set-code 交易,附带代码委托授权列表。 | 让 EOA 在保留地址的同时获得可编程行为。 |
06 · Nonce
Nonce 是发送者账户的单调计数器。它把来自同一 EOA 的交易排成不可跳过的序列, 同时让一份已经执行过的签名无法在同一条链上再次消费。
假设链上 nonce 是 8,意味着下一笔可执行交易需要 nonce 8。
nonce 9 可以先被某些节点暂存,却要等 8 先落地;nonce 7 已经过期;
两笔 nonce 都为 8 的交易不能都成为该账户的规范历史——最终只能有一个占用这个位置。
Interactive · sequence gate
0x7A3f…91C2
state nonce 8
nonce 8 被纳入后,账户 nonce 变为 9;随后 nonce 9 才具备执行条件。每个位置按顺序前进。
同一 EOA 的交易按 nonce 串行消费,避免余额和合约调用出现无法解释的本地顺序。
旧 nonce 一旦消费,截获的旧签名不能再次在同一账户状态上执行。
钱包可以用同一 nonce 提交替代候选;最终只有一个候选占据该顺序号。
EOA 使用 CREATE 部署合约时,创建者地址与相应 nonce 参与新合约地址的确定。
Nonce 不是全网交易编号,也不是时间戳;每个账户都有自己的序列。
两台钱包或两个自动化程序若同时控制同一私钥,就必须协调 nonce,否则会互相卡住或替换交易。
对跨链重放,现代交易还把 chainId 纳入签名域;nonce 与 chainId 解决的是不同层次的问题。
07 · Fees
EOA 发起交易时,不仅要授权状态改变,还要为网络执行设置资源上限。 交易的“最多愿意付多少”与“最后实际付多少”是两个不同数字。
Interactive · EIP-1559 fee
当前 max fee 足以覆盖 base fee + 优先费;实际单价为 13.5 gwei,未用到的上限不会被无条件扣走。
gasLimit 以 Gas 单位衡量最多允许做多少计算,
maxFeePerGas 以每单位 Gas 的 ETH 价格限制支付意愿。
二者相乘得到最大费用预留。普通 EOA 向普通地址发送不带 data 的 ETH 转账,
基础消耗通常是 21,000 Gas;调用合约则取决于实际执行路径。
如果 Gas limit 太低,执行可能耗尽 Gas 并回滚;如果设得足够高但实际只用了一部分, 未使用部分不会作为执行费被消费。Type 2 交易中,base fee 被协议销毁, 有效优先费交给区块提议相关方;max fee 高于实际有效单价的差额也不是验证者自动收入。
余额检查的实用结论: “账户有足够 ETH 支付最终看起来很低的费用”仍可能不够; 发送时还需满足交易金额与最大费用预留的有效性检查。 钱包通常会自动估算并避免设置矛盾参数。
08 · EIP-7702
经典教材常说“EOA 没有代码,合约账户才有代码”。这曾是好用的入门近似, 但自 2025 年 5 月 Pectra 升级在主网激活 EIP-7702 后,它不再是无条件成立的协议事实。
EIP-7702 引入 Type 4 set-code 交易。EOA 可以签署授权元组,
让协议在其代码字段中写入一个 23 字节的委托指示符:
0xef0100 || implementation_address。
它不是把整份合约复制进 EOA,而是指向一个已经部署的实现地址。
当相关调用以该 EOA 为目标时,客户端加载所指实现的代码,并在该 EOA 的上下文中执行。
Interactive · classic vs delegated
代码为空;由私钥签署普通交易,协议恢复该地址作为发送者。
可实现批处理、赞助、子权限、恢复等能力;安全性完全取决于具体实现与钱包集成。
经典 EOA 的代码为空;私钥直接授权交易。不要把这个经典模型误写成 Pectra 之后永远不变的账户分类规则。
| 维度 | 经典 EOA | EIP-7702 委托 EOA | 独立合约账户 |
|---|---|---|---|
| 根来源 | 私钥签名 | 原私钥授权委托;委托逻辑再定义操作规则 | 部署代码及其存储规则 |
| 地址迁移 | 不适用 | 原地址可保持不变 | 通常有独立合约地址 |
| 代码 | 空代码 | 保存指向实现的委托指示符 | 保存自身部署字节码的哈希 |
| 发起顶层交易 | 可以 | 带有效委托指示符时仍可发起 | 不能凭空发起;由外部交易触发 |
| 可编程能力 | 很有限 | 由委托实现提供批处理、赞助、权限等 | 由合约代码原生定义 |
| 关键风险 | 私钥泄露、盲签 | 私钥风险 + 恶意或有漏洞的委托实现 | 合约漏洞、升级权与签名策略风险 |
经典 EOA 把“谁能授权”固定成单一 secp256k1 私钥签名,把“谁付 Gas”通常固定在交易发送者。 可编程账户希望把这些策略抽象出来:例如一次确认完成 approve + swap, 让赞助者付 Gas,给临时会话密钥限定额度,或用多种凭证恢复账户。 EIP-7702 让已有 EOA 地址可以委托这类逻辑,不必先把全部资产迁移到新合约钱包。
委托目标几乎拥有账户级能力。 不要把 DApp 弹出的“设置委托”当作普通登录签名。 恶意或设计不安全的实现可能近乎完全控制账户资产;安全钱包应对可委托实现进行严格审核, 而不是让任意网页诱导用户粘贴一个地址。
EIP-7702 还打破了若干旧的开发假设:不能再仅用“某地址 code size 是否为零”判断它是不是用户控制账户; EOA 的 nonce 在特殊委托执行中也可能出现比经典模型更复杂的变化。 入门时仍可用经典 EOA 建立主干,但写安全合约或钱包时必须以当前协议规则为准。
09 · Security
密码学能证明“这份数据得到某把私钥授权”,却不能证明“签名者真正理解界面、 目标合约安全、接收地址正确,或这笔操作符合签名者长期利益”。
直接提交链上状态转换,包含目标、value、data、nonce 与费用字段;被纳入后通常消耗 Gas。
检查 chain / to / value / function签名动作本身不上链、通常不花 Gas,但可用于登录、证明所有权,也可能被某系统当成授权凭证。
检查 domain / statement / expiry把结构化字段与域信息呈现给签名者;可用于 permit、订单、投票或委托等,后续可能由他人提交上链。
检查 spender / amount / nonce / deadline允许账户设置代码委托,能力远超普通登录;目标实现、链 ID 和授权 nonce 都是安全关键字段。
只信任钱包审核过的实现私钥与助记词不输入网页、不通过聊天发送;日常小额与长期储备使用不同账户,缩小一次失误的影响面。
硬件钱包能隔离密钥,但若你确认了错误的目标或恶意 calldata,它仍会忠实签名。设备屏幕与可读解码同样重要。
ERC-20 approve 改的是代币合约中的额度;后续 spender 可能无需你再次签名即可在额度内转走代币。
不为未知合约给无限额度;定期检查授权、委托与连接;高价值操作先用小额或模拟确认路径。
ETH 余额存在以太坊世界状态里,钱包只是读取状态并使用密钥授权交易。换手机或换钱包软件不会移动链上 ETH。
地址本来就设计为公开标识。控制权来自私钥或账户认可的授权机制;知道地址只能查询公开状态和向它发送资产。
被纳入区块的普通交易即使执行回滚,发送者 nonce 仍被消费,已经使用的 Gas 仍需支付;只有执行造成的普通状态修改回滚。
它们竞争同一个账户顺序位置。最终规范链只能接受一个;另一笔会因 nonce 已经过期而无效。
即使在经典模型中,这种判断也无法证明背后是人还是自动程序;EIP-7702 又允许 EOA 带委托指示符,因此基于代码长度的账户身份假设更不可靠。
签名本身可能不上链,却可成为 permit、订单、登录或委托的有效授权。风险取决于被签数据将被谁、在何处、以什么规则使用。
委托本身会持续存在,但原 EOA 的有效授权可以替换目标或通过委托到零地址清除指示符。危险在于错误委托可能在你修复前造成损失。
10 · Recap
一条链解释“身份如何出现”,另一条链解释“状态如何改变”。 能把两条链完整说出来,就真正掌握了 EOA。
最终心智模型: 私钥是链外授权根;地址是公开索引;账户是链上状态; 钱包是操作界面;签名是授权证据;nonce 是顺序与重放闸门; Gas 是执行预算;EIP-7702 让 EOA 可委托代码,但没有让私钥风险自动消失。
1. “ETH 在钱包里”最准确的修正是什么?
2. EOA 地址如何得到?
3. 两笔交易使用同一发送者、同一 nonce,会怎样?
4. 一笔普通合约调用进入区块后 revert,哪项仍然发生?
5. 某 EOA 的 ERC-20 余额通常存在哪里?
6. EIP-7702 对 EOA 做了什么?
11 · Sources
本课按 2026 年 7 月的主网语义核对。入门段落保留经典 EOA 心智模型, 同时用 EIP-7702 修正“EOA 一定没有代码”等已经失效的绝对表述。
0xef0100 || address 指示符。Before the next lesson
不要只问“它有没有代码”,而要问: 这个地址的根授权来自哪里,谁能让它发起或响应状态改变,当前是否存在委托或其他可编程规则? 下一课讲合约账户时,我们会把“由代码控制”这半边模型补完整。