钱包、助记词与地址
门罗币钱包实际存储的是什么,以及为什么它有两把私钥
门罗币钱包存储的不是币,而是密钥。一切都始于一个随机数,它被写成一个由 25 个单词组成的助记词。由它派生出两把私钥:花费私钥(可以花钱)和查看私钥(只能看到收款)。再由它们得到你的公开地址。
币并不在钱包里
你的币记录在区块链上——一本由每个节点复制保存的公共账本。钱包只保存一个秘密,它让你能够 (a) 在账本上找到属于你的输出,以及 (b) 花费它们。丢失了这个秘密,你就失去了钱。如果有人得知了这个秘密,他就能把钱花掉。
助记词:25 个单词
创建钱包时,会生成一个 256 位的随机数。这个数不方便抄写,因此钱包把它转换成词表中的 25 个单词:24 个单词承载这个数本身,第 25 个是校验词,用来发现抄写错误。这些单词就是你的钱包。任何程序都能用它们恢复出其余的一切。
有些钱包(例如 Feather)使用较新的 Polyseed 格式——16 个单词,同时编码了钱包的创建日期(这样就不必从头开始扫描区块链)。思路是一样的:这些单词就是你的钱。详见助记词与地址。
为什么要两把私钥?
在比特币中,一把私钥包揽一切。在门罗币中,职责是分开的:
| 密钥 | 能做什么 | 可以交给谁 |
|---|---|---|
| 查看私钥 | 找到收款并看到其金额 | 会计、审计人员、商店服务器上的“观察”钱包 |
| 花费私钥 | 花钱(并间接地看到支出) | 任何人都不行 |
之所以这样拆分,是因为门罗币钱包无法简单地“向区块链查询某个地址的余额”——地址根本不在区块链上。钱包必须扫描每一笔新交易并检查:这是给我的吗?查看私钥就足以完成这项检查。因此,扫描工作可以委托给服务器,而不必赋予它花钱的权利。
只有查看私钥时,钱包能看到收到的款项,却无法可靠地判断哪些已经被花掉:这需要计算 key image,而计算它需要花费私钥。因此,在导入 key image 之前,只读钱包显示的余额会偏高。Carrot(随 FCMP++ 一同到来)为此增加了一把单独的密钥。
主地址与子地址
主地址以 4 开头,长 95 个字符。不过,把它告诉所有人并不理想:拿到同一个地址的人可以判断出两笔付款去了同一个人那里(例如两个平台比对各自的付款地址)。
因此,门罗币钱包可以创建以 8 开头的子地址。你想创建多少就创建多少,它们都属于同一个钱包,而子地址本身不会透露它们之间的任何联系。好习惯是:每个付款人使用一个新的子地址。
钱包的类型
- 全节点 + 钱包(官方 GUI/CLI 搭配你自己的
monerod)——隐私性最高:你自己下载并验证区块链。 - 使用远程节点的钱包(Feather、Cake、Monerujo 等)——钱包从别人的节点下载区块,但自己扫描。节点不会知道你的密钥,但能看到你的 IP 以及你何时发送交易。
- 轻钱包——查看私钥被交给服务器,由服务器替你扫描。很方便,但服务器能看到你所有的收款。
- 硬件钱包(Ledger、Trezor)——花费私钥永远不会离开设备。