01 · Orientation
先把四个对象分开
私钥、公钥、地址和账户彼此相关,却处在不同位置、承担不同职责。
第五章开场 · 经典执行层 EOA 的密码学根
上一章把以太坊账户解释成“世界状态中由地址索引的一条记录”。现在要追问: 一个经典外部账户为什么能够证明某次操作获得了授权?答案不是把秘密交给网络, 而是让秘密只在本地参与计算,向网络公开可以验证、却不能反推出秘密的结果。
私钥是秘密整数;公钥是由它计算出的椭圆曲线点;地址是公钥摘要的 20 字节后缀; 账户则是以该地址为索引的链上状态。[1]
私钥只应存在于硬件钱包、安全芯片或受保护的软件签名环境。它不进入交易,也不进入区块。
公钥和地址都可以从私钥确定性算出。公钥还能在给定交易签名与签名哈希时被恢复。
地址定位 nonce、ETH 余额、代码哈希与存储根;账户字段里没有私钥,也没有公钥字段。
四个名词,四种职责
产生授权
一个满足 secp256k1 范围约束的秘密标量。谁拿到它,谁就能为该经典 EOA 产生有效签名。
验证授权
曲线点 Q = d · G。它可以公开;由 Q 反求 d 是椭圆曲线离散对数问题。
定位状态
公钥 Keccak-256 摘要的最右 20 字节。它是公开标识,不是秘密,也不是公钥本身。
保存当前事实
链上记录余额、nonce 等状态。钱包读取它并帮助签名,但钱包应用本身不等于账户。
把地址想成保险箱、私钥想成金属钥匙虽然直观,却会误导:ETH 并不装在地址里, 私钥也不会“打开一个盒子”。更准确地说,地址定位公开账本记录,私钥产生协议认可的授权。
这一课聚焦经典执行层 EOA。合约账户也有 20 字节地址,却通常不是由某把私钥的公钥推导出来; 权益证明验证者又使用另一套 BLS 密钥。看到相同的“key”或“address”字样时,必须先问它属于哪一层。
02 · Private key
私钥不是密码,而是一个数
它通常显示成 64 个十六进制字符;真正的协议条件是落在曲线阶规定的范围内。
在 secp256k1 中,私钥 d 是一个按大端解释的非零整数。
它不是你自己想出来的口令,也不是钱包服务器分配的用户名。安全钱包会使用经过审计的密码学安全随机源
生成高熵种子或私钥,再按标准派生与范围检查规则得到不可预测的有效标量。
HD 钱包的子私钥通常由种子确定性派生,并非每把子钥都现场重新抽样。
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 n 是生成点 G 的阶。0 无效,n 以及更大的数也无效;因此有效私钥数量是 n − 1, 不是把所有 2²⁵⁶ 个位串都不加检查地接受。[2]
0x 只是常见前缀。
这是稍后实验使用的真实有效值,但全世界都知道它,安全性为零。前导零不能在定长编码里随意丢失。
随机性比“看起来复杂”更重要
一串很长的字符可能仍然很容易猜。例如把姓名、生日或一句话直接哈希成私钥, 会形成所谓 brainwallet:攻击者可以批量尝试常见语料,根本不需要遍历整个密钥空间。 正确做法是使用经过审计的钱包或硬件签名器:它们从 CSPRNG 或 TRNG 获得高熵根材料, 并按标准算法派生、检查或拒绝无效标量;不要自己设计随机或派生算法。
绝不要把真实私钥粘贴进任何教程、网页、聊天、表单或截图。 本页只提供 1 到 8 的公开测试值,不提供私钥文本输入框,也绝不能用这些值接收真实资产。
| 对象 | 本质 | 是否可公开 | 改变后影响 |
|---|---|---|---|
| 私钥 | 签名用的秘密标量 | 绝对不可公开 | 经典 EOA 没有“原地改私钥”;迁移意味着换地址并转移控制关系 |
| 钱包密码 | 解锁本地加密文件或应用 | 不可公开 | 可更换;通常不改变底层私钥和地址 |
| 助记词 / 种子 | 派生许多私钥的根材料 | 绝对不可公开 | 同一根材料与派生路径可恢复同一组密钥;第五章第三课详讲 |
| 地址 | 20 字节公开标识 | 可以公开 | 公开不等于授权,但会暴露可查询的链上活动 |
私钥空间接近 2²⁵⁶,但针对椭圆曲线离散对数的最佳通用攻击具有平方根量级, 因而 secp256k1 通常被描述为约 128 位经典安全强度。无论哪种说法, 对正确生成的私钥,现实威胁几乎总是泄露、钓鱼、恶意签名或备份失败,而不是穷举数学空间。
03 · Public key
公钥是曲线上的一个点
“私钥乘以生成点”不是普通整数乘法,而是在有限域椭圆曲线群中反复做点运算。
secp256k1 定义了一条有限域上的曲线、一枚固定生成点 G、一个素数模数
p 与生成点阶 n。给定私钥 d,公钥就是
G 被群运算“累加” d 次得到的点 Q。
Q = d · G “mod p”把坐标限制在有限域里,所以真实曲线不是纸面上连续的弧线,而是一组离散点。 下方只是群运算的概念路径,不按几何位置或距离绘制。
点、坐标与编码不是同一件事
抽象公钥是点 Q = (x, y);为了存储或传输,必须把坐标编码成字节。
secp256k1 的每个坐标固定为 32 字节。SEC 1 的未压缩编码会在前面加一字节
04,形成 65 字节;压缩编码则保留 x 并用前缀记录 y 的奇偶性,形成 33 字节。[4]
但以太坊经典 EOA 地址公式使用的是不带 04 前缀的 64 字节 x ∥ y。[2]
Q = (x, y)
数学对象
04 ∥ x[32 B] ∥ y[32 B]
65 bytes
x[32 B] ∥ y[32 B]
64 bytes
02/03 ∥ x[32 B]
33 bytes
确定性、可重复且高效。同一私钥与同一曲线参数总得到同一公钥。
没有已知的现实可行捷径。这里的安全依赖计算困难,不是“反向在数学上没有答案”。
以太坊普通交易内容是公开的。经典 EOA 的公钥主要进入签名验证与发送者恢复;
数字签名提供授权与完整性,不会把转账金额、接收方或 calldata 自动变成密文。
下一课会完整拆解 r、s、yParity 与签名哈希。
04 · Address
地址是公钥摘要的右侧 20 字节
先哈希原始 64 字节坐标,再丢掉摘要左侧 12 字节;最后的 0x 只是十六进制显示前缀。
得到公钥点后,以太坊不会直接把 64 字节坐标当成账户标识。
Yellow Paper 定义:对 x ∥ y 做 Keccak-256,得到 32 字节摘要,
再取最右侧 160 位,也就是最后 20 字节。[2]
Q = d · G, Q = (x, y) Keccak-256 的输入是 64 字节原始坐标,不是它们的 ASCII 十六进制文本, 也不包含 SEC 1 未压缩前缀 04。这里的 Keccak-256 也不是 NIST 最终标准的 SHA3-256。
20 字节值与 42 字符字符串
协议层地址本体是 20 字节。每个字节写成两个十六进制字符,得到 40 个字符;
人们再加上 0x 表明“后面是十六进制”,于是常见字符串长度是 42。
0x 不属于那 20 字节。ERC-55 还可以按哈希规则混合大小写,
给显示字符串增加轻量校验,但底层 20 字节不变。
来自公钥
d → Q → Keccak → 20 B。经典 EOA 的控制者能用对应私钥产生签名。
通常来自创建过程
CREATE 地址由创建者与 nonce 推导;CREATE2 则改用 keccak256(0xff ∥ deployer ∥ salt ∥ keccak256(init_code)) 的最后 20 字节,nonce 不进入 CREATE2 的地址公式。外观同为 20 字节,却不意味着背后有对应私钥。
地址推导不包含 chain ID,所以同一私钥在采用相同地址规则的 EVM 链上会得到同一地址。 各链状态彼此独立。受 EIP-155 保护的 legacy 交易以及现代 typed transactions 会把 chain ID 纳入签名域以限制重放;历史的未保护 legacy 签名不包含 chain ID。[6]
地址只有 160 位,而公钥信息更长,所以理论上不止一个公钥可能映射到同一地址。 这不是数据库里预先“注册唯一用户名”的机制。不过对正确随机生成的密钥, 找到某个既定地址的可控预像在现实中不可行;实际用户更应防范复制错误、地址投毒和界面欺骗。
05 · Derivation lab
亲手走完一条真实推导链
选择一个公开、故意不安全的小私钥;页面会用真实 secp256k1 与 Keccak-256 计算结果。
抽象公式只有经过测试向量才真正落地。下面不是“形似密码学”的随机动画:
点坐标、摘要和 ERC-55 地址均由页面内的确定性实现实时计算,并以私钥
d = 1 的公开向量做自动校验。
Interactive · 01
地址推导显微镜
只能选择 1–8。它们全部是公开测试值,任何人都能立刻转走其中的资产。
- Private key · 32 B
- 0000000000000000000000000000000000000000000000000000000000000001
- Public x · 32 B
- 79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
- Public y · 32 B
- 483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
- Keccak-256 · 32 B
- c0a6c424ac7157ae408398df7e5f4552091a69125d5dfcb7b8c2659029395bdf
- Raw address · 20 B
- 0x7e5f4552091a69125d5dfcb7b8c2659029395bdf
- ERC-55 display
- 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf
阶段 01:d 以 32 字节大端形式表示;左侧补零不会改变整数值。
安全提示:这里没有文本输入框。不要把真实私钥改写进开发者工具或页面代码。
以 d = 1 为例,究竟发生了什么?
-
01
范围检查:1 满足
1 ≤ d < n,所以是有效标量;但它可被任何人猜中,因此绝不安全。 -
02
标量乘法:
1 · G = G,所以输出坐标恰好就是标准规定的生成点坐标。 -
03
序列化与哈希:把 x、y 各补齐 32 字节后直接连接;不带
04,对 64 个原始字节做 Keccak-256。 -
04
截取与显示:摘要
c0a6…5bdf的最后 40 个 hex 字符成为原始地址,再按 ERC-55 计算大小写。
把 x ∥ y 当 ASCII 字符串哈希、把 04 前缀也放进哈希、
用 SHA3-256 代替 Keccak-256、或取摘要左侧 20 字节,都会得到看似合理却完全错误的地址。
密码学工程要求精确到“哪一组字节、哪一种 padding、哪一端被截取”。
06 · One-way relations
哪些能推,哪些不能反推?
“单向”不是一句魔法咒语:曲线运算、哈希与截取分别制造不同的可见性边界。
掌握密码学关系最实用的方法,是逐条判断已知输入能否得到输出。 正向推导用于生成和验证;反向困难保护控制权;签名恢复则提供一条常被忽略的旁路: 给定正确的签名载荷与可恢复签名,节点可以恢复公钥,再核对发送者地址。[3]
确定性曲线标量乘法;钱包每次都会得到同一 Q。
需要解决 secp256k1 上的离散对数;没有已知现实可行算法。
公开、快速且无需联网;任何人都能检查公钥对应哪个地址。
哈希与截取丢失信息;一个从未签名的 EOA 可能没有公开可恢复的公钥。
以太坊交易验证会利用可恢复 ECDSA 推导发送者,而不是信任任意填写的 from。
既要穿过哈希预像边界,又要拥有能产生匹配地址的有效私钥。
网络看得见什么?
接收方、金额、calldata、费用参数、nonce 和签名都会传播;普通交易不是密文。
节点对规定载荷取签名哈希,用签名恢复公钥,再哈希得到发送者地址。
签名器不会输出私钥;签名操作会输出签名或已签名载荷,并可公开公钥或地址。任何要求“上传私钥验证所有权”的服务都越过了安全边界。
公钥暴露并不是经典系统中的漏洞:协议本来就依赖它可被验证。真正的安全假设是, 在当前经典计算模型和正确参数下,从公钥恢复私钥不可行。这里不要把“不可行”写成“数学上绝对不可能”; 密码学结论始终依赖算法、计算资源与实现没有侧信道泄露。
找到任意一对相同地址属于碰撞问题,生日界约为 2⁸⁰; 针对某个既定地址寻找可控预像则是约 2¹⁶⁰ 级别的哈希目标。 而直接从已知公钥求私钥的通用曲线攻击约为 2¹²⁸ 级别。三者目标不同,不能只用“256 位”一概而论。
五个必须拆掉的误区
- 01
“地址就是公钥。”错。地址只有公钥 Keccak 摘要的最后 20 字节。
- 02
“私钥存在链上。”错。链上保存状态、交易与签名等公开数据,私钥应始终在链外。
- 03
“知道地址就能花钱。”错。知道索引只能查询和收款,不能产生授权。
- 04
“签名会加密交易。”错。签名证明授权与完整性,普通交易内容仍然公开。
- 05
“所有 0x 地址背后都有私钥。”错。合约地址、预编译地址或无人掌握预像的 20 字节值都可能存在。
07 · ERC-55 checksum
大小写为什么能发现部分抄错?
ERC-55 不创造新地址,只为同一个 20 字节值设计一种带轻量校验的十六进制显示。
十六进制数字 0–9 没有大小写,但字母 a–f 有。
ERC-55 利用这一点,把地址自身的小写 ASCII 文本再做一次 Keccak-256;
对每个字母位置,如果对应哈希半字节不小于 8,就把字母大写。[5]
h = Keccak-256(UTF-8 / ASCII bytes of lower)
letter[i] is uppercase iff hex(h)[i] ≥ 8 这是第二次、用途不同的 Keccak:地址生成时哈希 64 字节原始公钥坐标; ERC-55 则哈希 40 个小写十六进制字符的文本字节。数字位置没有大小写可用。
Interactive · 02
地址大小写检查器
这里只处理公开地址。切换示例,观察“底层值相同”和“校验通过”并不是同一句话。
0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359
校验通过:输入与 ERC-55 编码完全一致。
把任意地址强制转换成全小写或全大写,通常会丢失 ERC-55 校验模式;但少数地址的规范 ERC-55 输出恰好全小写或全大写。是否通过校验不能只看“有没有混合大小写”,必须按规则重算并逐字符比较。 不同大小写的地址文本如果忽略大小写,底层 20 字节可以相同;校验失败应被视为 “请停止并重新核对”,而不是替你自动猜测正确收款人。
ERC-55 只能发现一部分输入错误,不能证明“这个地址确实属于 Bob”。 地址投毒会发送首尾相似的攻击者地址,诱导你从历史记录复制;恶意网页还可能在确认前替换剪贴板。 大额操作应核对完整地址、可信地址簿、域名解析结果与硬件设备上的最终显示,并先做小额测试。
08 · Wallet boundaries
钱包保管什么,链上保存什么?
正确的恢复与防护策略,建立在“秘密材料、加密容器、公开标识、链上状态”四层分离之上。
“币在钱包里”是一句方便但不精确的话。钱包或硬件设备管理密钥与授权流程, 资产归属则表现为以太坊状态中的余额、合约映射或 NFT 所有者字段。 同一个地址可以被多个只读界面观察,也可以由多台持有同一秘密的设备控制。
| 对象 | 典型位置 | 网络是否需要 | 核心风险 |
|---|---|---|---|
| 私钥 | 硬件签名器、安全芯片、加密 keystore 或受保护内存 | 不需要,也绝不应收到 | 复制、恶意软件、侧信道、错误备份 |
| 钱包密码 | 用户记忆与本地密钥派生流程 | 不需要 | 弱口令、钓鱼;它只保护容器,不改变链上控制根 |
| 公钥 / 签名 | 可由签名恢复;签名随交易公开 | 验证授权需要 | 实现错误、ECDSA 签名随机数 k 重用(不是账户 nonce)、签错消息;风险不来自公钥或签名“被看见”本身 |
| 地址 | 钱包界面、交易、合约存储、区块浏览器 | 作为状态索引与消息目标 | 隐私关联、复制错误、地址投毒 |
| ETH / Token 状态 | 以太坊账户状态或代币合约存储 | 由全节点共同验证 | 错误授权、合约风险、链或网络选择错误 |
四种故障,四种不同后果
地址公开
不会直接失去控制权,但交易关系、余额与交互历史可能被关联。警惕针对性钓鱼。
钱包密码忘记
若仍有私钥、助记词或其他恢复机制,可以在新工具中恢复;只有加密文件而无密码则可能无法解密。
控制材料丢失
经典单私钥 EOA 本身没有重置或恢复入口;若控制私钥及其种子、备份全部丢失,链不会替你恢复。社交恢复等功能属于智能账户或额外控制层。
控制材料泄露
攻击者拥有同等签名能力。应尽快把资产迁往新控制根,并撤销旧地址的代币授权与应用权限。若泄露的是助记词或设备根材料,应迁移其全部派生账户;撤销授权不能让旧地址重新安全。
同一地址在主网有一套独立 nonce、余额、合约与历史。
字符串可以相同,但测试网维护另一套状态;测试 ETH 不是主网 ETH。
受保护的 legacy 与现代 typed 交易把链身份纳入签名域;历史未保护 legacy 签名例外。chain ID 不参与地址推导。
一套务实的密钥卫生
- 01
让成熟工具生成密钥。不使用脑钱包、不手抛硬币、不从短口令直接哈希。
- 02
把长期大额与日常交互分层。硬件签名器保管高价值控制根,热钱包只承担可承受损失。
- 03
离线备份根材料。明确备份的是私钥、keystore 还是助记词;定期用无资产环境演练恢复。
- 04
在可信显示上核对签名意图。设备安全不能弥补用户批准恶意 calldata 或无限代币授权。
- 05
不在多个地方复制秘密。每增加一个云盘、剪贴板、相册或聊天副本,攻击面就扩大一次。
权益证明验证者的签名密钥使用 BLS,与执行层 EOA 的 secp256k1 私钥不同; 提款凭证或提款密钥又是另一套控制关系。智能账户还可以使用多签、社交恢复或 passkey 等自定义验证规则。 它们都不改变本课这条经典推导链的正确性, 只是说明“所有账户都等于一把 EOA 私钥”已经不是完整的现代账户模型。
09 · Recap
把整课压缩成一条单向链
从秘密标量到公开状态索引,每一步都要说清输入、输出、编码和安全边界。
- 01
私钥是范围内的秘密整数。32 字节是编码长度,安全依赖均匀且不可预测的生成。
- 02
公钥是曲线点。
Q = d · G正向很快,反向求 d 在现实中不可行。 - 03
地址公式使用 64 字节 x ∥ y。不要带 04 前缀,不要哈希 ASCII hex。
- 04
Ethereum 使用 Keccak-256。它与最终 NIST SHA3-256 的 padding 不同,不能互换。
- 05
地址是摘要最右 20 字节。
0x只是显示前缀;40 个 hex 字符表示 20 字节。 - 06
ERC-55 只编码大小写。它检测部分抄错,不改变底层地址,也不验证现实身份。
- 07
链上没有私钥字段。节点从签名恢复并核对发送者;私钥永远不应广播。
- 08
钱包是授权工具,不是资产容器。资产状态在链上,钱包管理密钥、权限与交互。
现在检查你的理解
1. 哪项最准确地描述以太坊经典 EOA 私钥?
2. 经典 EOA 地址计算时,Keccak-256 的直接输入是什么?
3. 从 32 字节 Keccak 摘要得到地址时保留哪一段?
4. 网络怎样验证经典 EOA 的交易,而不接触私钥?
5. ERC-55 能做什么?
6. 同一私钥在主网与采用同一规则的测试网上通常会怎样?
10 · Sources
术语与一手资料
地址推导按 Yellow Paper 与当前执行规范交叉核对;显示校验按 ERC-55 原始规范实现。
核心术语
私钥 PRIVATE KEY
满足 1 ≤ d < n 的秘密标量,用于生成经典 EOA 的 secp256k1 签名。它不是地址、钱包密码或链上字段。
公钥 PUBLIC KEY
曲线点 Q = d · G。以太坊地址公式把其 x、y 坐标各编码为 32 字节并连接。
secp256k1 ELLIPTIC CURVE
执行层经典 EOA 的 ECDSA 曲线参数集合,定义有限域、曲线方程、生成点 G 与阶 n。
标量乘法 SCALAR MULTIPLICATION
在椭圆曲线群中计算 d · G 的运算。正向高效,反向对应离散对数难题。
Keccak-256 HASH
以太坊使用的 256 位 Keccak 摘要函数。它与 NIST 最终 SHA3-256 的 padding 不同。
地址 ADDRESS
20 字节公开值,用作执行层状态索引与消息目标。经典 EOA 地址来自公钥摘要,合约地址通常来自创建规则。
ERC-55 CHECKSUM ENCODING
利用地址字母大小写携带轻量校验信息的显示编码;不改变底层 20 字节值。
keystore SECRET STORAGE
用密码派生密钥加密私钥的 JSON 容器。更换密码可以重加密容器,但不会自动改变私钥和地址。
官方一手资料
-
01
ethereum.org — Ethereum accounts EOA、私钥与公钥关系、20 字节地址、账户字段以及“账户不等于钱包”的基础说明。
-
02
Ethereum Yellow Paper 附录 F 的 secp256k1 私钥范围、64 字节公钥、签名约束与地址推导公式。
-
03
Ethereum Execution Specs — recover_sender 当前执行规范中从交易签名恢复公钥、Keccak 哈希并截取地址的可执行实现。
-
04
SECG SEC 2 v2 — secp256k1 domain parameters secp256k1 的有限域、曲线系数、生成点坐标与阶。
-
05
ERC-55 — Mixed-case checksum address encoding 大小写算法、官方测试向量、平均校验位与 0.0247% 随机错误通过概率。
-
06
EIP-155 — Simple replay attack protection 为受保护的 legacy 交易把 chain ID 纳入签名域;现代 typed transactions 也包含 chain ID。历史未保护 legacy 签名不含 chain ID,且 chain ID 不进入地址推导。
-
07
EIP-1014 — Skinny CREATE2 CREATE2 合约地址使用 0xff、部署者、salt 与 init-code hash 的正式公式。
-
08
ethereum.org — Web3 Secret Storage keystore JSON、密码派生密钥、加密私钥与完整性校验的标准结构。
-
09
ethereum.org — Keys in proof-of-stake Ethereum 验证者签名密钥与提款凭证;说明 BLS 验证者密钥不同于执行层 EOA 密钥。
-
10
ethereum.org — The use of SHA3 / Keccak 解释 Ethereum 使用的 Keccak 与最终 NIST SHA-3 标准之间的命名及 padding 差异。
你现在已经知道地址从哪里来。下一课会把“私钥能够授权”拆成完整数字签名:
交易的哪些字节先被编码和哈希,r、s、yParity 怎样生成,
节点又怎样恢复发送者并拒绝伪造与重放。