入门

钱包、助记词与地址

门罗币钱包实际存储的是什么,以及为什么它有两把私钥

简而言之

门罗币钱包存储的不是币,而是密钥。一切都始于一个随机数,它被写成一个由 25 个单词组成的助记词。由它派生出两把私钥:花费私钥(可以花钱)和查看私钥(只能看到收款)。再由它们得到你的公开地址。

币并不在钱包里

你的币记录在区块链上——一本由每个节点复制保存的公共账本。钱包只保存一个秘密,它让你能够 (a) 在账本上找到属于你的输出,以及 (b) 花费它们。丢失了这个秘密,你就失去了钱。如果有人得知了这个秘密,他就能把钱花掉。

助记词:25 个单词

创建钱包时,会生成一个 256 位的随机数。这个数不方便抄写,因此钱包把它转换成词表中的 25 个单词:24 个单词承载这个数本身,第 25 个是校验词,用来发现抄写错误。这些单词就是你的钱包。任何程序都能用它们恢复出其余的一切。

有些钱包(例如 Feather)使用较新的 Polyseed 格式——16 个单词,同时编码了钱包的创建日期(这样就不必从头开始扫描区块链)。思路是一样的:这些单词就是你的钱。详见助记词与地址。

助记词 25 个单词 花费私钥 private spend key 哈希 查看私钥 private view key ×G ×G 花费公钥 B 查看公钥 A 地址 4…
一切都来自同一个秘密。箭头只能单向前进。

为什么要两把私钥?

在比特币中,一把私钥包揽一切。在门罗币中,职责是分开的:

密钥能做什么可以交给谁
查看私钥找到收款并看到其金额会计、审计人员、商店服务器上的“观察”钱包
花费私钥花钱(并间接地看到支出)任何人都不行

之所以这样拆分,是因为门罗币钱包无法简单地“向区块链查询某个地址的余额”——地址根本不在区块链上。钱包必须扫描每一笔新交易并检查:这是给我的吗?查看私钥就足以完成这项检查。因此,扫描工作可以委托给服务器,而不必赋予它花钱的权利。

查看私钥并不能看到一切

只有查看私钥时,钱包能看到收到的款项,却无法可靠地判断哪些已经被花掉:这需要计算 key image,而计算它需要花费私钥。因此,在导入 key image 之前,只读钱包显示的余额会偏高。Carrot(随 FCMP++ 一同到来)为此增加了一把单独的密钥。

主地址与子地址

主地址以 4 开头,长 95 个字符。不过,把它告诉所有人并不理想:拿到同一个地址的人可以判断出两笔付款去了同一个人那里(例如两个平台比对各自的付款地址)。

因此,门罗币钱包可以创建以 8 开头的子地址。你想创建多少就创建多少,它们都属于同一个钱包,而子地址本身不会透露它们之间的任何联系。好习惯是:每个付款人使用一个新的子地址。

钱包的类型

  • 全节点 + 钱包(官方 GUI/CLI 搭配你自己的 monerod)——隐私性最高:你自己下载并验证区块链。
  • 使用远程节点的钱包(Feather、Cake、Monerujo 等)——钱包从别人的节点下载区块,但自己扫描。节点不会知道你的密钥,但能看到你的 IP 以及你何时发送交易。
  • 轻钱包——查看私钥被交给服务器,由服务器替你扫描。很方便,但服务器能看到你所有的收款。
  • 硬件钱包(Ledger、Trezor)——花费私钥永远不会离开设备。

具体推荐见钱包页面。想看看内部是如何运作的?打开密钥生成器——它会在你的浏览器中执行上图中的每一个步骤。