1 个不稳定版本

0.0.1 2022 年 3 月 9 日

#32 in #generate-keys

MITGPL-3.0 许可证

25KB
148

子密钥

子密钥是 Substrate 包含的命令行工具。它允许为基于 Substrate 的链(如 Polkadot、Kusama 以及越来越多的并行链和基于 Substrate 的项目)生成和恢复密钥。

subkey 提供了一些子命令来生成密钥、检查密钥、签名消息、验证消息等...

您可以使用 subkey --help 查看完整的命令列表。大多数命令都有额外的帮助信息,例如 subkey generate --help 用于 generate 命令。

安全第一

subkey 不需要互联网连接即可工作。实际上,为了最佳安全,您应该使用 subkey 在未连接到互联网的机器上。

subkey 处理 种子私钥。请确保在安全的环境中使用 subkey(例如,没有人在旁边看着)以及在安全的计算机上(例如,没有人能够检查您的命令历史)。

如果您将 subkey 的输出保存到文件中,请确保应用适当的权限,并在尽可能早的时候删除该文件。

用法

以下指南解释了 subkey 命令的一些用法。有关完整列表和最新文档,请确保检查集成帮助,例如使用 subkey --help

使用 Cargo 安装

您需要安装 Substrate 的构建依赖项才能安装 Subkey。使用以下两个命令分别安装依赖项和 Subkey:

命令

# Use the `--fast` flag to get the dependencies without needing to install the Substrate and Subkey binary
curl https://getsubstrate.io -sSf | bash -s -- --fast
# Install only `subkey`, at a specific version of the subkey crate
cargo install --force subkey --git https://github.com/paritytech/substrate --version <SET VERSION> --locked

在容器中运行

# Use `--pull=always` with the `latest` tag, or specify a version in a tag
docker run -it --pull=always docker.io/parity/subkey:latest <command to subkey>

生成随机账户

生成新密钥的操作就像运行

subkey generate

输出看起来类似于

Secret phrase `hotel forest jar hover kite book view eight stuff angle legend defense` is account:
  Secret seed:      0xa05c75731970cc7868a2fb7cb577353cd5b31f62dccced92c441acd8fee0c92d
  Public key (hex): 0xfec70cfbf1977c6965b5af10a4534a6a35d548eb14580594d0bc543286892515
  Account ID:       0xfec70cfbf1977c6965b5af10a4534a6a35d548eb14580594d0bc543286892515
  SS58 Address:     5Hpm9fq3W3dQgwWpAwDS2ZHKAdnk86QRCu7iX4GnmDxycrte

☠️ 不要重复使用此页面的任何种子和密钥 ☠️。

您可以在 SECURITY.mdPolkadot Wiki 中了解更多关于安全和风险的信息。


上面的输出显示了秘密短语(也称为记忆短语)和秘密种子(也称为私钥)。这两个秘密信息你必须妥善保管,并保密。以下所有其他信息都可以从这些秘密中推导出来。

上面的输出还显示了公钥和账户ID。这些信息与你要使用密钥的网络无关。

新账户的SS58地址(或公钥地址)是给定网络(例如Kusama或Polkadot)中账户公钥的表示。

您可以在Substrate文档中了解更多关于SS58格式的信息,并查看SS58注册表中的保留前缀列表。

例如,考虑之前的种子0xa05c75731970cc7868a2fb7cb577353cd5b31f62dccced92c441acd8fee0c92d,SS58地址如下

  • Polkadot: 16m4J167Mptt8UXL8aGSAi7U2FnPpPxZHPrCgMG9KJzVoFqM
  • Kusama: JLNozAv8QeLSbLFwe2UvWeKKE4yvmDbfGxTuiYkF2BUMx4M

JSON输出

subkey也可以生成JSON格式的输出。这对于自动化非常有用。

命令

subkey generate --output-type json

输出

{
  "accountId": "0xfec70cfbf1977c6965b5af10a4534a6a35d548eb14580594d0bc543286892515",
  "publicKey": "0xfec70cfbf1977c6965b5af10a4534a6a35d548eb14580594d0bc543286892515",
  "secretPhrase": "hotel forest jar hover kite book view eight stuff angle legend defense",
  "secretSeed": "0xa05c75731970cc7868a2fb7cb577353cd5b31f62dccced92c441acd8fee0c92d",
  "ss58Address": "5Hpm9fq3W3dQgwWpAwDS2ZHKAdnk86QRCu7iX4GnmDxycrte"
}

例如,如果你想获取secretSeed,你可以使用

命令

subkey generate --output-type json | jq -r .secretSeed

输出

0xa05c75731970cc7868a2fb7cb577353cd5b31f62dccced92c441acd8fee0c92d

额外用户定义的密码

subkey支持额外的用户定义秘密,该秘密将被附加到种子上。让我们看看以下示例

subkey generate --password extra_secret

输出

Secret phrase `soup lyrics media market way crouch elevator put moon useful question wide` is account:
  Secret seed:      0xe7cfd179d6537a676cb94bac3b5c5c9cb1550e846ac4541040d077dfbac2e7fd
  Public key (hex): 0xf6a233c3e1de1a2ae0486100b460b3ce3d7231ddfe9dadabbd35ab968c70905d
  Account ID:       0xf6a233c3e1de1a2ae0486100b460b3ce3d7231ddfe9dadabbd35ab968c70905d
  SS58 Address:     5He5pZpc7AJ8evPuab37vJF6KkFDqq9uDq2WXh877Qw6iaVC

使用inspect命令(更多详细信息请见下文),我们发现仅知道秘密种子已不足以恢复账户

subkey inspect "soup lyrics media market way crouch elevator put moon useful question wide"

它恢复了账户5Fe4sqj2K4fRuzEGvToi4KATqZfiDU7TqynjXG6PZE2dxwyh而不是我们预期的5He5pZpc7AJ8evPuab37vJF6KkFDqq9uDq2WXh877Qw6iaVC。现在需要额外的用户定义密码(在我们的示例中为extra_secret)才能完全恢复账户。让我们检查之前的助记符,这次传递所需的密码,如下所示

subkey inspect --password extra_secret "soup lyrics media market way crouch elevator put moon useful question wide"

这次,我们正确地恢复了5He5pZpc7AJ8evPuab37vJF6KkFDqq9uDq2WXh877Qw6iaVC

检查密钥

如果你有一些关于密钥的数据,subkey inspect将帮助你发现更多关于它的信息。

如果你想要验证某些秘密,例如,你可以使用

subkey inspect < mnemonic | seed >

如果你只有公共数据,你可以看到部分信息

subkey inspect --public < pubkey | address >

注意:虽然你可以从助记符中恢复秘密种子,但反过来则不行。

注意:出于明显的原因,无法从传递公共数据(如pubkeyaddress)作为输入来恢复秘密。

命令

subkey inspect 0xa05c75731970cc7868a2fb7cb577353cd5b31f62dccced92c441acd8fee0c92d

输出

Secret Key URI `0xa05c75731970cc7868a2fb7cb577353cd5b31f62dccced92c441acd8fee0c92d` is account:
  Secret seed:      0xa05c75731970cc7868a2fb7cb577353cd5b31f62dccced92c441acd8fee0c92d
  Public key (hex): 0xfec70cfbf1977c6965b5af10a4534a6a35d548eb14580594d0bc543286892515
  Account ID:       0xfec70cfbf1977c6965b5af10a4534a6a35d548eb14580594d0bc543286892515
  SS58 Address:     5Hpm9fq3W3dQgwWpAwDS2ZHKAdnk86QRCu7iX4GnmDxycrte

签名

subkey允许使用秘密密钥对随机消息进行签名。然后,任何人都可以使用你的公钥验证签名。

echo -n <msg> | subkey sign --suri <seed|mnemonic>

示例

MESSAGE=hello
SURI=0xa05c75731970cc7868a2fb7cb577353cd5b31f62dccced92c441acd8fee0c92d
echo -n $MESSAGE | subkey sign --suri $SURI

输出

9201af3788ad4f986b800853c79da47155f2e08fde2070d866be4c27ab060466fea0623dc2b51f4392f4c61f25381a62848dd66c5d8217fae3858e469ebd668c

注意sign命令的每次运行都会产生不同的输出。虽然每个签名都不同,但它们都是有效的。

验证签名

给定一个消息、一个签名和一个地址,subkey可以验证消息是否由给定地址的秘密密钥持有者(或持有者之一)进行数字签名。

echo -n <msg> | subkey verify <sig> <address>

示例

MESSAGE=hello
URI=0xfec70cfbf1977c6965b5af10a4534a6a35d548eb14580594d0bc543286892515
SIGNATURE=9201af3788ad4f986b800853c79da47155f2e08fde2070d866be4c27ab060466fea0623dc2b51f4392f4c61f25381a62848dd66c5d8217fae3858e469ebd668c
echo -n $MESSAGE | subkey verify $SIGNATURE $URI

输出

Signature verifies correctly.

失败的样子

Error: SignatureInvalid

使用虚荣生成器

您可以使用包含的虚荣生成器来找到一个种子,该种子提供的地址包含所需的模式。请注意,根据您的硬件,这可能需要一段时间。

命令

subkey vanity --network polkadot --pattern bob

输出

Generating key containing pattern 'bob'
best: 190 == top: 189
Secret Key URI `0x8c9a73097f235b84021a446bc2826a00c690ea0be3e0d81a84931cb4146d6691` is account:
  Secret seed:      0x8c9a73097f235b84021a446bc2826a00c690ea0be3e0d81a84931cb4146d6691
  Public key (hex): 0x1a8b32e95c1f571118ea0b84801264c3c70f823e320d099e5de31b9b1f18f843
  Account ID:       0x1a8b32e95c1f571118ea0b84801264c3c70f823e320d099e5de31b9b1f18f843
  SS58 Address:     1bobYxBPjZWRPbVo35aSwci1u5Zmq8P6J2jpa4kkudBZMqE

Bob 现在得到了一个以他的名字开头的漂亮地址:1bobYxBPjZWRPbVo35aSwci1u5Zmq8P6J2jpa4kkudBZMqE。

注意:虽然名字短(3个字符)的 Bob 很快就得到了结果,但对于名字长得多的 Alice 来说,这需要更长的时间,因此生成包含链 alice 的随机地址的机会将小得多。

许可证

许可证:GPL-3.0-or-later WITH Classpath-exception-2.0

依赖关系

~11MB
~208K SLoC