subkey
Please read Substrate to Polkadot SDK page first.
subkey 程序是一个密钥生成和管理实用程序,包含在 Substrate 存储库中。
您可以使用 subkey 程序执行以下任务:
- 生成和检查密码安全的公钥和私钥对。
- 从秘密短语和原始种子恢复密钥。
- 对消息进行签名和验证签名。
- 对编码的交易进行签名和验证签名。
- 推导出分层确定性子密钥对。
签名方案
subkey 程序目前支持以下签名方案:
- sr25519: Ristretto 群上的 Schorr 签名。
- ed25519: Curve25519 上的 SHA-512(SHA-2)。
- secp256k1: secp256k1 上的 ECDSA 签名。
在基于 Substrate 的网络中,sr25519 编码的密钥用于生成 SS58 地址作为与区块链交互的公钥。
安装
您可以使用 cargo 下载、安装和编译 subkey,而无需克隆完整的 Substrate 存储库。
但是,您必须在将 subkey 作为独立二进制文件安装之前将 Substrate 构建依赖项添加到您的环境中。
为了确保依赖项可用,您可以从 Substrate 存储库的克隆中构建 subkey 二进制文件。
要安装和编译 subkey 程序:
- 如果需要,请打开一个终端 shell。
- 如果需要,请验证您是否已安装 Rust 编译器和工具链。
-
如果需要,请通过运行以下命令克隆 Polkadot SDK 存储库:
git clone https://github.com/paritytech/polkadot-sdk.git -
通过运行以下命令更改到 Substrate 存储库的根目录:
cd polkadot-sdk -
通过运行以下命令使用
nightly工具链编译subkey程序:cargo +nightly build --package subkey --release由于涉及的软件包数量众多,编译程序可能需要几分钟。
-
通过运行以下命令更改回 Polkadot SDK 存储库的根目录:
cd .. -
验证
subkey程序是否已准备好使用,并通过运行以下命令查看可用选项的信息:./target/release/subkey --help
分层确定性密钥
subkey 程序支持分层确定性密钥。
分层确定性 (HD) 密钥使您能够使用父种子在分层树结构中推导出子密钥对。
在此分层结构中,从父级推导出的每个子级都有自己的密钥对。
推导出的密钥也可以用于推导出其他子密钥对,类似于文件系统如何在分层目录结构中具有嵌套目录。
有关如何推导出分层确定性密钥的背景信息,请参阅分层确定性钱包的 BIP32 规范。
有关使用 subkey 命令推导出分层确定性密钥的信息,请参阅 使用推导出的密钥。
基本命令用法
运行 subkey 命令的基本语法是:
subkey [子命令] [标志]根据您指定的子命令,可能适用或需要其他参数、选项和标志。
要查看特定 subkey 子命令的用法信息,请指定子命令和 --help 标志。
例如,要查看 subkey inspect 的用法信息,您可以运行以下命令:
subkey inspect --help标志
您可以在 subkey 命令中使用以下可选标志。
| 标志 | 描述 |
|---|---|
| -h, --help | 显示用法信息。 |
| -V, --version | 显示版本信息。 |
子命令
您可以在 subkey 命令中使用以下子命令。
有关参考信息和说明使用 subkey 子命令的示例,请选择相应的命令。
| 命令 | 描述 |
|---|---|
generate | 生成一个随机的帐户密钥。 |
generate-node-key | 生成一个随机的节点 libp2p 密钥。您可以将密钥保存到文件或将其显示为标准输出 (stdout)。 |
help | 显示 subkey 或指定子命令的用法信息。 |
inspect | 显示您指定的秘密 URI 的公钥和 SS58 地址。 |
inspect-node-key | 显示与您指定的文件名中的秘密节点密钥相对应的对等点 ID。 |
sign | 使用您指定的密钥对消息进行签名。 |
vanity | 生成一个提供虚荣地址的种子。 |
verify | 验证消息的签名对于您指定的公钥或密钥是否有效。 |
输出
根据您指定的子命令,subkey 程序的输出将显示以下部分或全部信息:
| 此字段 | 包含 |
|---|---|
| 秘密短语 | 一系列英文单词,以人类友好的方式对密钥进行编码。这组单词(也称为助记词或种子短语)可用于在提供正确的一组单词并按正确顺序提供时恢复密钥。 |
| 秘密种子 | 恢复密钥对所需的最小信息。秘密种子有时也称为私钥或原始种子。所有其他信息都是从此值计算出来的。 |
| 公钥(十六进制) | 以十六进制格式表示的密码密钥对的公钥部分。 |
| 公钥(SS58) | 以 SS58 编码表示的密码密钥对的公钥部分。 |
| 帐户 ID | 以十六进制格式表示的公钥的别名。 |
| SS58 地址 | 基于公钥的 SS58 编码的公共地址。 |
示例
要显示 subkey 程序的版本信息,请运行以下命令:
subkey --version要显示 subkey verify 命令的用法信息,请运行以下命令:
subkey verify --helpsubkey generate
使用 subkey generate 命令生成公钥和私钥以及帐户地址。
您可以使用命令行选项使用不同的签名方案生成密钥,或者使用更多或更少的单词生成助记词。
基本用法
subkey generate [标志] [选项]标志
您可以在 subkey generate 命令中使用以下可选标志。
| 标志 | 描述 |
|---|---|
-h, --help | 显示用法信息。 |
--password-interactive | 允许您在终端中以交互方式输入访问密钥库的密码。 |
-V, --version | 显示版本信息。 |
选项
您可以在 subkey generate 命令中使用以下命令行选项。
| 选项 | 描述 |
|---|---|
--keystore-path <path> | 指定自定义密钥库路径。 |
--keystore-uri <keystore-uri> | 指定要连接到的自定义 URI 以获取密钥库服务 |
-n, --network <network> | 指定要使用的网络地址格式。例如,kusama 或 polkadot。有关支持的网络的完整列表,请参阅在线用法信息。 |
--output-type <format> | 指定要使用的输出格式。有效值为 Json 和 Text。默认输出格式为 Text。 |
--password <password> | 指定密钥库使用的密码。此选项使您能够将额外的密钥附加到种子。 |
--password-filename <path> | 指定包含密钥库使用的密码的文件的名称。 |
--scheme <scheme> | 指定要生成的密钥的密码方案。有效值为 Ecdsa、Ed25519、Sr25519。默认方案为 Sr25519。 |
-w, --words <words> | 指定要生成的密钥的秘密短语中的单词数。有效值为 12、15、18、21、24。默认情况下,秘密短语包含 12 个单词。 |
示例
要生成一个使用 sr25519 签名方案的新密钥对,请运行以下命令:
subkey generate该命令将显示类似以下内容的输出,其中包含一个 12 个单词的秘密短语:
Secret phrase: bread tongue spell stadium clean grief coin rent spend total practice document
Secret seed: 0xd5836897dc77e6c87e5cc268abaaa9c661bcf19aea9f0f50a1e149d21ce31eb7
Public key (hex): 0xb6a8b4b6bf796991065035093d3265e314c3fe89e75ccb623985e57b0c2e0c30
Account ID: 0xb6a8b4b6bf796991065035093d3265e314c3fe89e75ccb623985e57b0c2e0c30
Public key (SS58): 5GCCgshTQCfGkXy6kAkFDW1TZXAdsbCNZJ9Uz2c7ViBnwcVg
SS58 Address: 5GCCgshTQCfGkXy6kAkFDW1TZXAdsbCNZJ9Uz2c7ViBnwcVgsubkey 程序根据其使用网络所需的格式对与公钥/私钥对关联的地址进行不同的编码。
如果您想在 Kusama 和 Polkadot 网络上使用 相同的私钥,则可以使用 --network 选项为 Kusama 和 Polkadot 网络生成单独的地址格式。
公钥是相同的,但地址格式是特定于网络的。
要为特定网络生成密钥对,请运行类似以下命令:
subkey generate --network picasso该命令将显示与输出相同的字段,但使用您指定的网络的地址格式。
要生成一个使用 ed25519 签名方案和 24 个单词的秘密短语的更安全的密钥对,用于 moonriver 网络,您将运行以下命令:
subkey generate --scheme ed25519 --words 24 --network moonriver该命令将显示与输出相同的字段,但使用 Ed25519 签名方案、24 个单词的秘密短语和 moonriver 网络的地址格式。
Secret phrase: cloth elevator sadness twice arctic adjust axis vendor grant angle face section key safe under fee fine garage pupil hotel museum valve popular motor
Secret seed: 0x5fa5923c1d6753fa30f268ffd363efb730ca0db906f55bc17efe65cd24f92097
Public key (hex): 0x3f1da4d35489e3d84739de1490f51b567ad2a62793cca1357e624fbfa534fc85
Account ID: 0x3f1da4d35489e3d84739de1490f51b567ad2a62793cca1357e624fbfa534fc85
Public key (SS58): VkFLVqcighJnssSbL4LDSGy5ShJQZvYhm7G8K8W1ZXt96Z5VG
SS58 Address: VkFLVqcighJnssSbL4LDSGy5ShJQZvYhm7G8K8W1ZXt96Z5VG要生成一个受密码保护的密钥,请使用 --password <password> 选项运行 subkey generate 命令。
例如:
subkey generate --password "pencil laptop kitchen cutter"在您生成需要密码的密钥后,您可以通过在命令行中包含 --password 选项和密码字符串,或者在秘密短语末尾添加三个斜杠 (///) 来检索它。
请记住,务必保护密码、秘密短语和秘密种子,并在安全的位置备份它们。
subkey generate-node-key
使用 subkey generate-node-key 命令为 Substrate 节点之间的对等 (libp2p) 通信生成随机的公钥和私钥。
公钥是对等点标识符,用于在链规范文件中或作为命令行参数来标识参与区块链网络的节点。
在大多数情况下,您将使用命令行选项运行此命令,以将私钥保存到文件。
基本用法
subkey generate-node-key [标志] [选项]标志
您可以在 subkey generate-node-key 命令中使用以下可选标志。
| 标志 | 描述 |
|---|---|
-h, --help | 显示用法信息。 |
-V, --version | 显示版本信息。 |
选项
您可以在 subkey generate-node-key 命令中使用以下命令行选项。
| 选项 | 描述 |
|---|---|
--file <file-name> | 指定要用于保存为本地节点生成的密钥的文件位置。如果您未指定此选项,则生成的密钥将显示为标准输出 (stdout)。 |
示例
要为对等通信生成一个随机密钥对并将私钥保存到文件,请运行类似以下命令:
subkey generate-node-key --file ../generated-node-key此命令将在终端中显示节点密钥的对等点标识符,并将私钥保存到 generated-node-key 文件中。
在此示例中,保存的密钥位于父目录中,而不是当前工作目录中。
12D3KooWHALHfL7dDBiGTt4JTEAvCbDWts8zHwvcPvJXDF9fxue7subkey help
使用 subkey help 命令显示 subkey 或指定子命令的用法消息。
基本用法
subkey help [子命令]示例
要显示 verify 子命令的用法信息,请运行以下命令:
subkey help verifysubkey inspect
使用 subkey inspect 命令重新计算指定密钥或助记词的公钥和公共地址。
基本用法
subkey inspect [标志] [选项] uri标志
您可以在 subkey inspect 命令中使用以下可选标志。
| 标志 | 描述 |
|---|---|
-h, --help | 显示用法信息。 |
--password-interactive | 允许您在终端中以交互方式输入访问密钥库的密码。 |
--public | 指示您指定要检查的 uri 是一个十六进制编码的公钥。 |
-V, --version | 显示版本信息。 |
选项
您可以在 subkey inspect 命令中使用以下命令行选项。
| 选项 | 描述 |
|---|---|
--keystore-path <path> | 指定自定义密钥库路径。 |
--keystore-uri <keystore-uri> | 指定要连接到的自定义 URI 以获取密钥库服务。 |
-n, --network <network> | 指定要使用的网络地址格式。例如,kusama 或 polkadot。有关支持的网络的完整列表,请参阅在线用法信息。 |
--output-type <format> | 指定要使用的输出格式。有效值为 Json 和 Text。默认输出格式为 Text。 |
--password <password> | 指定密钥库使用的密码。此选项使您能够将额外的密钥附加到种子。 |
--password-filename <path> | 指定包含密钥库使用的密码的文件的名称。 |
--scheme <scheme> | 指定要检查的密钥的密码方案。有效值为 Ecdsa、Ed25519、Sr25519。默认方案为 Sr25519。 |
参数
您必须在 subkey inspect 命令中指定以下必需参数。
| 参数 | 描述 |
|---|---|
uri | 指定要检查的密钥 URI。您可以使用其秘密短语、秘密种子(带有派生路径和密码)、SS58 地址、公钥或十六进制编码的公钥来指定密钥。如果您使用十六进制编码的公钥指定 uri,则还必须在命令行中包含 --public 标志。如果您为 uri 指定了一个文件名,则该文件的内容将用作 URI。 |
示例
要检查从助记词推导出的公钥,您可以运行类似以下命令:
subkey inspect "caution juice atom organ advance problem want pledge someone senior holiday very"该命令将显示类似以下内容的输出:
Secret phrase `caution juice atom organ advance problem want pledge someone senior holiday very` is account:
Secret seed: 0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849
Public key (hex): 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746
Public key (SS58): 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR
Account ID: 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746
SS58 Address: 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR要检查从秘密种子推导出的公钥,您可以运行类似以下命令:
subkey inspect 0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849如果您将秘密短语或秘密种子存储在文本文件中(例如,my-secret-key),则可以在命令行上指定文件名以传递文件的内容并显示与该秘密短语或秘密种子关联的公钥。
例如,您可以运行类似以下命令:
subkey inspect my-secret-key要使用十六进制编码的公钥检查公钥,您可以运行类似以下命令:
subkey inspect --public 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746在这种情况下,该命令仅显示类似以下内容的公共信息:
Network ID/version: substrate
Public key (hex): 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746
Account ID: 0xd6a3105d6768e956e9e5d41050ac29843f98561410d3a47f9dd5b3b227ab8746
Public key (SS58): 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyR
SS58 Address: 5Gv8YYFu8H1btvmrJy9FjjAWfb99wrhV3uhPFoNEr918utyRsubkey 程序根据其使用网络所需的格式对与公钥/私钥对关联的地址进行不同的编码。
如果您在 Kusama 和 Polkadot 网络上使用 相同的私钥,则可以使用 --network 选项检查特定网络使用的地址。
公钥是相同的,但地址格式是特定于网络的。
要检查特定网络的密钥对,请运行类似以下命令:
subkey inspect --network kusama "caution juice atom organ advance problem want pledge someone senior holiday very"在命令输出中,秘密短语、秘密种子和公钥是相同的,但 Kusama 网络的地址是:
SS58 Address: HRkCrbmke2XeabJ5fxJdgXWpBRPkXWfWHY8eTeCKwDdf4k6要检查同一私钥在 Polkadot 网络上的地址,您将运行类似以下命令:
subkey inspect --network polkadot "caution juice atom organ advance problem want pledge someone senior holiday very"在命令输出中,秘密短语、秘密种子和公钥与 Kusama 网络相同,但 Polkadot 网络的地址是:
SS58 Address: 15rRgsWxz4H5LTnNGcCFsszfXD8oeAFd8QRsR6MbQE2f6XFF要通过指定 --password 选项和密码来检查受密码保护的密钥,您可以运行类似以下命令:
subkey inspect "caution juice atom organ advance problem want pledge someone senior holiday very" --password "pencil laptop kitchen cutter"如果您在命令行中指定了 --password 选项和密码,则命令输出 不会 显示使用的密码。
Secret phrase `caution juice atom organ advance problem want pledge someone senior holiday very` is account:
Secret seed: 0xdfc5d5d5235a37fdc907ee1cb720299f96aeb02f9c7c2fcad7ee8c7bfbd2a4db
Public key (hex): 0xdef8f78b123475265815b65a7c55e105e1ab185f4969954f68d92b7bb67a1045
Public key (SS58): 5H74SqH1iQCWh5Gumyghh1WJMcmM6TdBHYSK7mKVJbv9NuSK
Account ID: 0xdef8f78b123475265815b65a7c55e105e1ab185f4969954f68d92b7bb67a1045
SS58 Address: 5H74SqH1iQCWh5Gumyghh1WJMcmM6TdBHYSK7mKVJbv9NuSK您也可以通过在秘密短语中添加 /// 和密码来检查受密码保护的密钥。
例如,您可以运行类似以下命令:
subkey inspect "caution juice atom organ advance problem want pledge someone senior holiday very///pencil laptop kitchen cutter"在这种情况下,命令输出将显示使用的密码。 例如:
Secret Key URI `caution juice atom organ advance problem want pledge someone senior holiday very///pencil laptop kitchen cutter` is account:
Secret seed: 0xdfc5d5d5235a37fdc907ee1cb720299f96aeb02f9c7c2fcad7ee8c7bfbd2a4db
Public key (hex): 0xdef8f78b123475265815b65a7c55e105e1ab185f4969954f68d92b7bb67a1045
Public key (SS58): 5H74SqH1iQCWh5Gumyghh1WJMcmM6TdBHYSK7mKVJbv9NuSK
Account ID: 0xdef8f78b123475265815b65a7c55e105e1ab185f4969954f68d92b7bb67a1045
SS58 Address: 5H74SqH1iQCWh5Gumyghh1WJMcmM6TdBHYSK7mKVJbv9NuSKsubkey inspect-node-key
使用 subkey inspect-node-key 命令显示与指定文件名中的节点密钥相对应的节点的对等点标识符。
在使用此命令之前,您应该已经使用过 subkey generate-node-key 命令并将密钥保存到文件。
基本用法
subkey inspect-node-key [标志] [选项] --file <file-name>标志
您可以在 subkey inspect-node-key 命令中使用以下可选标志。
| 标志 | 描述 |
|---|---|
-h, --help | 显示用法信息。 |
-V, --version | 显示版本信息。 |
选项
您可以在 subkey inspect-node-key 命令中使用以下命令行选项。
| 选项 | 描述 |
|---|---|
-n, --network <network> | 指定要使用的网络地址格式。例如,kusama 或 polkadot。有关支持的网络的完整列表,请参阅在线用法信息。 |
参数
您必须在 subkey inspect-node-key 命令中指定以下必需参数。
| 参数 | 描述 |
|---|---|
--file <file-name> | 指定包含为与节点的对等通信生成的密钥的文件。 |
subkey sign
使用 subkey sign 命令通过将消息作为标准输入 (stdin) 传递来对消息进行签名。
您可以使用您的秘密种子或秘密短语对消息进行签名。
基本用法
subkey sign [标志] [选项]标志
您可以在 subkey sign 命令中使用以下可选标志。
| 标志 | 描述 |
|---|---|
-h, --help | 显示用法信息。 |
--hex | 指示您作为标准输入指定的 message 是一个十六进制编码的消息。 |
--password-interactive | 允许您在终端中以交互方式输入访问密钥库的密码。 |
-V, --version | 显示版本信息。 |
选项
您可以在 subkey sign 命令中使用以下命令行选项。
| 选项 | 描述 |
|---|---|
--keystore-path <path> | 指定自定义密钥库路径。 |
--keystore-uri <keystore-uri> | 指定要连接到的自定义 URI 以获取密钥库服务。 |
--message <network> | 指定要签名的消息字符串。 |
--password <password> | 指定密钥库使用的密码。此选项使您能够将额外的密钥附加到种子。 |
--password-filename <path> | 指定包含密钥库使用的密码的文件的名称。 |
--scheme <scheme> | 指定密钥的密码签名方案。有效值为 Ecdsa、Ed25519、Sr25519。默认方案为 Sr25519。 |
--suri <secret-seed> | 指定要用于对消息进行签名的密钥 URI。您可以使用其秘密短语、秘密种子(带有派生路径和密码)来指定密钥。如果您为 --suri 选项指定了一个文件名,则该文件的内容将用作 URI。如果您省略此选项,则会提示您输入 URI。 |
示例
以下示例使用 echo 命令将测试消息作为输入传递到 subkey sign 命令。
要在终端中对文本消息进行签名,您可以运行类似以下命令:
echo "test message" | subkey sign --suri 0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849命令输出将显示消息的签名。 例如:
f052504de653a5617c46eeb1daa73e2dbbf625b6bf8f16d9d8de6767bc40d91dfbd38c13207f8a03594221c9f68c00a158eb3120311b80ab2da563b82a995b86要对十六进制编码的消息进行签名,请运行类似以下命令:
subkey sign --hex --message 68656c6c6f2c20776f726c64 --suri 0xc8fa03532fb22ee1f7f6908b9c02b4e72483f0dbd66e4cd456b8f34c6230b849命令输出将显示消息的签名。 例如:
9ae07defc0ddb752651836c25ac643fbdf9d45ba180ec6d09e4423ff6446487a52b609d69c06bd1c3ec09b3d06a43f019bacba12dc5a5697291c5e9faab13288subkey vanity
使用 subkey vanity 命令创建一个包含指定字符串模式的地址。
此命令不会为自定义地址生成秘密短语。
基本用法
subkey vanity [标志] [选项] --pattern <pattern>标志
您可以在 subkey vanity 命令中使用以下可选标志。
| 标志 | 描述 |
|---|---|
-h, --help | 显示用法信息。 |
-V, --version | 显示版本信息。 |
选项
您可以在 subkey vanity 命令中使用以下命令行选项。
| 选项 | 描述 |
|---|---|
-n, --network <network> | 指定要使用的网络地址格式。例如,kusama 或 polkadot。有关支持的网络的完整列表,请参阅在线用法信息。 |
--output-type <format> | 指定要使用的输出格式。有效值为 Json 和 Text。默认输出格式为 Text。 |
--scheme <scheme> | 指定密钥的密码签名方案。有效值为 Ecdsa、Ed25519、Sr25519。默认方案为 Sr25519。 |
参数
您必须在 subkey vanity 命令中指定以下必需参数。
| 参数 | 描述 |
|---|---|
--pattern <pattern> | 指定要包含在生成的地址中的字符串。 |
示例
根据您指定的模式,subkey vanity 命令可能需要一些时间来搜索密钥库并生成包含自定义字符串的地址。
通常,您应该为 --pattern 使用尽可能少的字符,并使用 --network 选项指定要使用自定义地址的网络。
要生成一个包含特定字符串的地址,您可以运行类似以下命令:
subkey vanity --network kusama --pattern DUNE该命令将显示类似以下内容的输出:
Generating key containing pattern 'DUNE'
100000 keys searched; best is 187/237 complete
200000 keys searched; best is 189/237 complete
300000 keys searched; best is 221/237 complete
400000 keys searched; best is 221/237 complete
500000 keys searched; best is 221/237 complete
600000 keys searched; best is 221/237 complete
best: 237 == top: 237
Secret Key URI `0x82737756075d15409053afd19a6b29ae2abeed96a3487