账户、密钥与地址
Web3 里没有"注册账号"这回事。你的身份不是数据库里的一行,而是一对数学上关联的密钥——一个你死守的私钥,和一个由它单向推导出的公开地址。这一章我们把 私钥 → 公钥 → 地址 的每一步真正算一遍,你会亲眼看到那个 0x 地址是怎么被"生"出来的。
身份就是一对钥匙
在 Web2 里,"你是谁"由服务器说了算——它查数据库,确认密码,发给你一个 session。服务器随时能封你、改你、代表你。Web3 反过来:你手里攥着一个 256 位的随机数(私钥),整个宇宙的安全都压在"只有你知道它"这一件事上。从它可以单向算出公钥,再算出地址。别人只能看到地址,却永远无法逆推回你的私钥。
这套结构你在 APK 签名里见过:你有一个 keystore 私钥,用它给 APK 签名,任何人用你的公钥/证书都能验证"这确实是你发的",但谁都造不出你的私钥来冒签。以太坊账户就是把这套非对称密码学,从"给安装包签名"搬到了"给每一笔转账签名"。你熟悉的 Android Keystore,后面第 23 章还会回来专门讲怎么用它保管链上私钥。
第一步:私钥 → 公钥(椭圆曲线)
以太坊用的曲线叫 secp256k1(比特币同款)。你不需要精通椭圆曲线数学,只要抓住一个直觉:曲线上有个固定的"基点" G,把它自加 k 次(k 就是你的私钥)得到的那个点,就是你的公钥。
公钥 P = k · G // k=私钥(标量), G=曲线基点, P=曲线上的点(x,y)
这个运算的精妙在于它是单向的:知道 k 算 P 很快(反复倍点),但知道 P 反推 k 需要解"椭圆曲线离散对数",以现有算力等于不可能。安全感就来自这里。公钥 P 是曲线上一个点,有 x、y 两个坐标,拼起来是 64 字节。
第二步:公钥 → 地址(keccak + 取尾)
地址不是公钥本身,而是公钥的哈希的一部分:
// 1. 公钥去掉前缀,取 64 字节的 (x||y) // 2. keccak256 哈希,得到 32 字节 // 3. 取最后 20 字节,就是地址 address = keccak256(pubkey_xy)[12:] // 后 20 字节
最后再套一层 EIP-55 校验和大小写:根据地址自身哈希,把某些十六进制字母改成大写。这不是美观,而是一个防手滑校验——钱包据此能检测出你是否抄错了一位。
0x…001 对应的地址是一个著名测试向量,可自行对照。永远不要在网页里输入你保管着真实资产的私钥。包括这个 Demo——它虽然不联网,但养成习惯至关重要:真私钥只该出现在硬件钱包、官方钱包 App、或你完全掌控的离线环境里。上面 Demo 请只用示例值或随机值把玩。私钥泄露 = 资产瞬间清零,且不可逆。
两种账户:EOA 与合约账户
以太坊上有两类账户,长得都是 0x 开头的 20 字节地址,但本质不同:
| EOA(外部账户) | 合约账户 | |
|---|---|---|
| 由什么控制 | 一把私钥(人或钱包) | 一段代码(部署时写死的逻辑) |
| 地址怎么来 | 私钥 → 公钥 → 哈希 | 由部署者地址 + nonce 推导 |
| 能主动发起交易吗 | 能(只有 EOA 能"点火") | 不能,只能被调用后再触发内部调用 |
| 有代码吗 | 没有 | 有,存的是 EVM 字节码 |
| 类比 | 你的钱包地址 | 一个部署好的后端服务 |
关键规则:链上任何活动都必须由某个 EOA 用私钥签名发起。合约再强大,自己也"动不了",它像一个待调用的函数库,只有被 EOA(或被别的合约在同一笔交易里)调用时才会执行。这个"必须有人点火"的模型,后面第 26 章讲的"账户抽象"正是想打破它。
合约地址在部署之前就能算出来(取决于部署者地址和 nonce),甚至用 CREATE2 可以让地址完全由你指定的盐值决定。这被大量用于"预先把钱打到一个还没部署的合约地址,之后再部署"的高级玩法。
助记词是私钥的人类外壳
你大概没见过有人真的手抄 64 位十六进制私钥。日常用的是那 12 / 24 个英文单词的助记词(BIP-39)。它其实是私钥的一种可读、可校验的编码,再通过 BIP-32/44 的分层派生,一套助记词可以生成无数个账户(以太坊、比特币各一串)。这块是第 23 章的主题,这里先建立印象:
随机熵 → 助记词(12/24 词) → 种子 → 主私钥
└→ 派生路径 m/44'/60'/0'/0/0 → 账户 0
└→ 派生路径 m/44'/60'/0'/0/1 → 账户 1 …
路径里的 60' 就是以太坊的币种编号。你在 MetaMask 里点"添加账户",背后就是把路径末位加 1 再派生一个。
私钥 → 公钥(k·G)→ keccak256 取后 20 字节 → EIP-55 地址,这条单向链是整个以太坊身份体系的地基。记住三件事:①只有 EOA 能发起交易;②地址是公钥的哈希、不是公钥本身;③助记词是私钥的人类外壳,丢了它 = 丢了钱,泄露它 = 被偷钱。下一章,我们跟着一笔由这把私钥签出的交易,走完它从签名到确认的完整旅程。
本章小结
- Web3 身份 = 一对密钥。私钥是 256 位随机数,公钥由
k·G单向推出,地址是公钥的 keccak 哈希后 20 字节。 - EIP-55 大小写是防抄错的校验和;不联网也算得出地址,你在上面的 Demo 亲眼见到了。
- EOA 由私钥控制、能发起交易;合约账户由代码控制、只能被调用。链上一切都由 EOA 点火。
- 助记词(BIP-39)+ 分层派生(BIP-44)是私钥的人类友好外壳,一套词生成整棵账户树。