零点课堂 | Eth2 验证者如何生成和保护取款密钥(2)
要保护多少个私钥?
还有一个需要回答的问题是:我们一共需要保护多少个私钥?
如果你只创建一个验证者身份,那么答案很简单:一个私钥。如果你要创建多个验证者身份,那么答案会变得复杂起来。我们可以为每个验证者身份创建一个不同的提款私钥,但这不是必须的。那么,每个验证者身份的提款私钥应该是唯一的吗?
使用多个提款私钥的理由主要有两个。第一个原因是,如果不同的验证者身份共享一个密钥,这些验证者身份之间就有了联系:显然,这些账号下的押金同属一个实体。由此,也就很容易计算出使用这个私钥可以访问的资金量,以及该实体持有的以太币总量。不过,使用不同的私钥并不能防止他人从其它渠道获取这些信息,例如,发起这些存款交易的以太坊 1.0 地址同样反映了这些信息。因此,除非我们在使用以太坊 1.0 地址时足够谨慎,否则使用多个提款私钥对安全性的提升不值一提。
第二个原因是,使用同一个私钥会让这个私钥的价值过高,也就更容易遭窃。但是,如果将不同的私钥存放在同一个地方,也会导致相同的问题。也就是说,应该从物理和逻辑上将不同的私钥分开,以减少丢失所带来的影响。
总之,如果你想防止其他人发现多个验证者身份背后的同一个实体(假设你的每笔存款来自不同的以太坊 1.0 地址),并且将你的每个提款私钥分别储存在不同地方,或者采用了不同的密钥保护机制,那么使用多个私钥会带来实质性的好处。由于普通用户一般不会这样操作,本文的余下部分只介绍了单个提款私钥是如何使用的,如有需要,本文内容也将适用于持有多个私钥的情况。
步骤
我们已经了解了基本要求,现在来看看怎么创建并保护取款密钥。创建新密钥的步骤如下:
- 创建提款钱包;
- 创建提款账户;
- 记录取款公钥;
- 删除提款钱包;
- 确认提款钱包可以恢复。
我们来看一下图解:
- 图三:创建并保护取款密钥的步骤 -
这些步骤必须在电脑上完成,要小心防止电脑被入侵。本文篇幅有限,不展开讨论如何防止电脑遭到入侵,但是用户至少要做到的一点是:在执行上述过程时,电脑不能联网。
创建提款钱包
本文截稿时,尚未开发出基于 BLS12-381 曲线的以太坊 2.0 密钥硬件钱包,也就是说,目前还没有可以储存以太坊 2.0 密钥的硬件钱包(编者注:在本译本出版时好像已经有了)。因此,密钥必须在软件中生成。本文以 ethdo 命令行工具为例,你也可以使用其它工具来实现。
ethdo 采用了 钱包 的概念。一个钱包可以包含一个或多个账户,而且可以从逻辑上将不同账户分隔开来(例如,将提款账户和验证账户分开)。一个账户包括私钥、公钥以及其它一些数据(如,一个好记的账户名),这样就不用直接使用公钥登陆了 [3]。如果要为提款账户创建钱包,请运行以下代码:
ethdo wallet create --wallet="Staking wallet" --type=hd --walletpassphrase=secret1
这行代码会创建一个带有 助记词 的钱包。助记词由 24 个单词组成,可用来恢复之前创建的钱包和钱包内的所有账户,应该立即保护好。上述命令会输出助记词,应该离线保存好。如果输入命令后并没有显示助记词,说明钱包无法恢复,那么我们不应使用这个钱包。
保存助记词的方法有很多,如 Blockplate 和 Cryptosteel,但你也可以把它抄下来,放在一个安全(最好防火)的地方。记住,一旦助记词丢失,你就无法提款,因此要采取恰当的措施保存好助记词。
助记词保存好后,我们就可以开始创建提款账户了。
创建提款账户
创建提款账户的命令如下:
ethdo account create --account="Staking wallet/Withdrawal account" --walletpassphrase=secret1 --passphrase=secret2
钱包口令(walletpassphrase)必须与你在上一部分提供的口令保持一致。后面一个口令则仅仅是这个账户的口令,只在删除账户前暂时使用。
记录取款公钥
顾名思义,公钥是 公开 的,无需采取特殊的安全保护措施。运行下列代码查看公钥:
ethdo account info --account="Staking wallet/Withdrawal account"
如果该代码没有输出取款公钥,可能说明账户创建过程出错。仔细查看之前运行的代码是否有错。
请注意,虽然公钥不是私密的,但我们应该采取合理措施保证恶意攻击者无法将你的公钥换成他们的公钥。