LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > 如何用 Substrate 创建一条私有链(下)

如何用 Substrate 创建一条私有链(下)

2020-07-08 DotNews 来源:区块链网络

本文是 Substrate 开发者中心教程《创建一条私有链》的后半部分,由 PolkaWorld 社区翻译。点此查看本文的前半部分。

生成自己的密钥

现在,我们已经了解了基础知识和命令行选项,可以着手生成属于自己的密钥,无需再使用众所周知的 Alice 和 Bob 密钥了。每个想要参与区块链的人都应该生成自己的密钥。这一部分会说明用于生成密钥的几种方式,其中有三个选项,每个参与者只需要选择一个这样的选项。无论选择哪个选项,请确保记录本节中的所有输出,以备日后使用。

选项 1: Subkey

Subkey 是生成密钥的工具,一般会与 Substrate 一起使用。

首先编译并安装该实用程序,这可能需要15分钟左右的时间。

cargoinstall--forcesubkey--githttps://github.com/paritytech/substrate--tagv2.0.0-rc3

我们将需要为每种类型至少生成2个密钥。每个节点都需要有自己的密钥。

生成一个助记词,并查看和sr25519关联的密钥和地址,Aura 将使用该密钥进行区块的生产。

$subkey--sr25519generate

Secretphrase`infantsalmonbuzzpatrolmaplesubjectturtlecutelegendsongvitalleisure`isaccount:
NetworkID/version:substrate
Secretseed:0xa2b0200f9666b743402289ca4f7e79c9a4a52ce129365578521b0b75396bd242
Publickey(hex):0x0a11c9bcc81f8bd314e80bc51cbfacf30eaeb57e863196a79cccdc8bf4750d21
AccountID:0x0a11c9bcc81f8bd314e80bc51cbfacf30eaeb57e863196a79cccdc8bf4750d21
SS58Address:5CHucvTwrPg8L2tjneVoemApqXcUaEdUDsCEPyE7aDwrtR8D

现在查看与相同助记符关联的ed25519密钥和地址。GRANDPA 将使用此密钥进行区块的终结。

$subkey--ed25519inspect"infantsalmonbuzzpatrolmaplesubjectturtlecutelegendsongvitalleisure"

Secretphrase`infantsalmonbuzzpatrolmaplesubjectturtlecutelegendsongvitalleisure`isaccount:
NetworkID/version:substrate
Secretseed:0xa2b0200f9666b743402289ca4f7e79c9a4a52ce129365578521b0b75396bd242
Publickey(hex):0x1a0e2bf1e0195a1f5396c5fd209a620a48fe90f6f336d89c89405a0183a857a3
AccountID:0x1a0e2bf1e0195a1f5396c5fd209a620a48fe90f6f336d89c89405a0183a857a3
SS58Address:5CesK3uTmn4NGfD3oyGBd1jrp4EfRyYdtqL3ERe9SXv8jUHb

选项 2: Polkadot-JS Apps

我们用来查看正在生成的块的相同 UI 也可以用于生成密钥。如果您不想安装 subkey,那么此选项很方便。它可以用于生产密钥,但是在生成此类密钥时不应将系统连接到 Internet 中。

无论选择哪种方法,都不能将生成生产密钥的系统连接到 Internet。这里特别提到它是因为,使用诸如 Polkadot JS Apps 之类的 Web 应用程序时通常需要具有 Internet 连接。

在 "Accounts" 标签上,单击 "Add account"。您无需提供名称,尽管您可能希望在验证之外保存该帐户以用于提交交易。

生成一个sr25519密钥,Aura将使用该密钥进行区块生产。请留意并记录助记词以及通过单击左上角的 identicon 复制 SS58 地址。

生成了一个ed25519密钥后, GRANDPA 将使用该密钥进行区块确认。再次提醒记录好助记词和 SS58 地址。

选项 3: 使用预生成的密钥

如果您想先进行本教程的学习,则可以使用以下预生成的密钥对之一。但是要意识到,这些密钥绝对不应该在实际生产区块中使用,而仅出于学习目的而提供。

Pair 1

Key(密钥)Value(值)Secret phrase(助记词)clip organ olive upper oak void inject side suit toilet stick narrowSecret seed0x4bd2b2c1dad3dbe3fa37dc6ad5a4e32ddd8ad84b938179ac905b0622880e86e7SR25519
Public key(公钥)0x9effc1668ca381c242885516ec9fa2b19c67b6684c02a8a3237b6862e5c8cd7eSS58 Address5FfBQ3kwXrbdyoqLPvcXRp7ikWydXawpNs2Ceu3WwFdhZ8W4ED25519
Public key(公钥)0xb48004c6e1625282313b07d1c9950935e86894a2e4f21fb1ffee9854d180c781SS58 Address5G9NWJ5P9uk7a**4yCKeLZJqXWW6hjuMyRJDmw4ofqxG8Js2

Pair 2

Key(密钥)Value(值)Secret phrase(助记词)paper next author index wedding frost voice mention fetch waste march tiltSecret seed0x4846fedafeed0cf307da3e2b5dfa61415009b239119242006fc8c0972dde64b0SR25519
Public key(公钥)0x74cca68a32156615a5923c67024db70da5e7ed36e70c8cd5bcf3556df152bb6dSS58 Address5EhrCtDaQRYjVbLi7BafbGpFqcMhjZJdu8eW8gy6VRXh6HDpED25519
Public key(公钥)0x0fe9065f6450c5501df3efa6b13958949cb4b81a2147d68c14ad25366be1ccb4SS58 Address5CRZoFgJs4zLzCCAGoCUUs2MRmuD5BKAh17pWtb62LMoCi9h

创建自定义链规范

既然每个参与者都有自己的密钥对,那么您就可以开始创建自定义链规范了。我们将使用此自定义链规范替代之前使用的内置local规范。

在此示例中,我们将创建一个网络,里面包含两个节点,但该过程可以直接推广到更多节点。

创建链规范

上一节内容中,我们使用了--chain local,它是预定义的“链规范”,其中将 Alice 和 Bob 指定为验证人以及其他一些有用的默认值。

与其完全从头开始编写链式规范,不如对我们以前使用的规范进行一些修改。首先,我们需要将链规范导出到名为customSpec.json的文件中。请记住,可以通过运行node-template --help获得有关所有这些命令的更多详细信息。

#Exportthelocalchainspectojson
$./target/release/node-templatebuild-spec--disable-default-bootnode--chainlocal>customSpec.json
2020-05-2813:29:05Buildingchainspec

我们刚刚创建的文件包含几个字段,您可以通过探索它们学习很多东西。到目前为止,最大的字段是单个二进制blob,它是运行时的Wasm二进制文件。这是您先前运行cargo build命令时所构建内容的一部分。

我们感兴趣的文件部分是用于创建块的 Aura 授权,由下面的**"aura"** 字段指示;用于确定块的 GRANDPA 授权,由 **"grandpa"**字段指示。该部分如下:

{
//--snip--
"genesis":{
"runtime":{
"system":{
"changesTrieConfig":null
//--snip--
},
"aura":{
"authorities":[
"5FfBQ3kwXrbdyoqLPvcXRp7ikWydXawpNs2Ceu3WwFdhZ8W4",
"5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty"
]
},
"grandpa":{
"authorities":[
["5G9NWJ5P9uk7a**4yCKeLZJqXWW6hjuMyRJDmw4ofqxG8Js2",1],
["5GoNkf6WdbxCFnPdAnYYQyCjAKPJgLNxXwPjwTh6DGg6gN3E",1]
]
}
//--snip--
}
}
}

这些指令是为节点模板编写的。他们将与其他基于 Substrate 节点一起工作,而无需进行任何修改。在包括 session pallet 的 Substrate 节点中。您应该将 Aura 和 Grandpa 配置保留为空,而应将此信息插入会话配置中。从所需节点导出的链规范中已说明了所有这些。

由于 Grandpa 协议支持加权投票,因此 Grandpa 数据的格式更加复杂。在这种情况下,我们为每个验证人赋予了1权重。

我们要做的就是将列出的授权地址(当前为 Alice 和 Bob)更改为在上一步中生成的我们自己的地址。sr25519地址位于aura部分,而ed25519地址位于Grandpa部分。您可以根据需要添加任意数量的验证人。有关其他上下文,请阅读有关Substrate中的密钥[1]的信息

验证人不应共享相同的密钥,即使出于学习目的也是如此。如果两个验证人使用相同的密钥,则它们将在运行过程中产生冲突的块。

准备好链规范后,将其转换为“初始(raw)”链规格。初始链规范包含所有相同的信息,但它包含已编码的存储密钥,该节点将使用该存储密钥来引用其本地存储中的数据。分发初始规范可确保每个节点将数据存储在相应的存储密钥上。

$./target/release/node-templatebuild-spec--chain=customSpec.json--raw--disable-default-bootnode>customSpecRaw.json
2020-05-2813:31:37Buildingchainspec

Copy

最后,与网络中的所有其他验证人共享customSpecRaw.json文件。

每个人都应该创建链规范,并与其他验证人共享生成的customSpecRaw.json文件。

因为Rust-> Wasm 优化的构建不是“可复制的”,所以每个人都会得到一个略有不同的Wasm blob,如果每个参与者自己生成文件而不共享,将破坏共识。

创建您的专用网络

创建自定义链规范并共享给所有参与者后,您就可以启动自己的自定义链了。在本节中,不再需要使用单个物理计算机或单个二进制文件。

第一个参与者启动一个 Bootnode

您已经完成了所有必要的准备工作,现在可以启动链了。此过程与您早先与(Alice)和(Bob)建立链接的过程非常相似。从无记录基本路径开始很重要,因此,如果您打算使用以前使用的相同路径,请从该目录中删除所有内容。

第一个参与者可以使用以下命令启动其节点:

./target/release/node-template\
--base-path/tmp/node01\
--chain=./customSpecRaw.json\
--port30333\
--ws-port9944\
--rpc-port9933\
--telemetry-url'ws://telemetry.polkadot.io:10240'\
--validator\
--rpc-methods=Unsafe\
--nameMyNode01

以下是一些和创建 Alice 有差异的内容:

我已经省略了--alice标记。取而代之的是,我们很快将通过RPC将自己的自定义密钥插入密钥库。--chain标记已更改为使用我们的自定义链规范。我添加了可选的--name标志。可以使用它在 telemetry UI 中为节点提供易于理解的名称。添加了可选的--rpc-methods=Unsafe标记, 顾名思义,在生产环境中使用此标志并不安全,但可以使本教程重点关注当前的主题。在生产中,您应该使用JSON-RPC proxy[2]。

您应该能看到控制台输出如下:

2020-06-1013:25:16SubstrateNode
2020-06-1013:25:16??version2.0.0-rc3-f5acce1-x86_64-linux-gnu
2020-06-1013:25:16??bySubstrateDevHub<https://github.com/substrate-developer-hub>,2017-2020
2020-06-1013:25:16????Chainspecification:LocalTestnet
2020-06-1013:25:16????Nodename:MyNode01
2020-06-1013:25:16????Role:AUTHORITY
2020-06-1013:25:16????Database:RocksDbat/tmp/node01/chains/local_testnet/db
2020-06-1013:25:16?Nativeruntime:node-template-1(node-template-1.tx1.au1)
2020-06-1013:25:16????InitializingGenesisblock/state(state:0xecc5…18c6,header-hash:0x1af8…2b26)
2020-06-1013:25:16????LoadingGRANDPAauthoritysetfromgenesisonwhatappearstobefirststartup.
2020-06-1013:25:16?Loadedblock-time=6000millisecondsfromgenesisonfirst-launch
2020-06-1013:25:16????Highestknownblockat#0
2020-06-1013:25:16UsingdefaultprotocolID"sup"becausenoneisconfiguredinthechainspecs
2020-06-1013:25:16????Localnodeidentityis:12D3KooWKDc78RJSWnMAo4dkVdfyFqvrvEZZSVddP16fsHhSy6sw(legacyrepresentation:QmPGVPfrg3gsUgoFgxpNNwjBputPKpukcWizQwedeBbKUr)
2020-06-1013:25:16??Prometheusserverstartedat127.0.0.1:9615
2020-06-1013:25:21????Idle(0peers),best:#0(0x1af8…2b26),finalized#0(0x1af8…2b26),?0?0
2020-06-1013:25:26????Idle(0peers),best:#0(0x1af8…2b26),finalized#0(0x1af8…2b26),?0?0
2020-06-1013:25:31????Idle(0peers),best:#0(0x1af8…2b26),finalized#0(0x1af8…2b26),?0?0

将密钥添加到密钥库

节点运行后,您可能会发现没有任何块产生。此时,您需要将密钥添加到密钥库中。请注意,您需要为网络中的每个节点完成这些步骤。

选项 1: 使用 Polkadot-JS Apps UI

您可以使用 Apps UI 将密钥插入密钥库。导航到 “工具箱” 选项卡和 “ RPC调用” 子选项卡。选择“author”和“ insertKey”。可以这样填写字段:


keytype:aura
suri:<yourmnemonicphrase>(eg.cliporganoliveupperoakvoidinjectsidesuittoiletsticknarrow)
publicKey:<yourrawsr25519key>(eg.0x9effc1668ca381c242885516ec9fa2b19c67b6684c02a8a3237b6862e5c8cd7e)

如果您是通过 Apps UI 生成密钥的,则您将不知道原始的公钥。在这种情况下,您可以改用您的SS58地址 (5FfBQ3kwXrbdyoqLPvcXRp7ikWydXawpNs2Ceu3WwFdhZ8W4) 。

你已经成功插入aura密钥,可以通过重复这个步骤插入grandpa密钥 (ed25519密钥)


keytype:gran
suri:<yourmnemonicphrase>(eg.cliporganoliveupperoakvoidinjectsidesuittoiletsticknarrow)
publicKey:<yourrawed25519key>(eg.0xb48004c6e1625282313b07d1c9950935e86894a2e4f21fb1ffee9854d180c781)

如果您是通过 Apps UI 生成密钥的,则您将不知道原始的公钥。在这种情况下,您可以改用您的SS58地址 (5G9NWJ5P9uk7a**4yCKeLZJqXWW6hjuMyRJDmw4ofqxG8Js2) 。

如果要对网络中的第二节点执行以下步骤,则必须在插入密钥之前将 UI 连接到第二个节点。

选项 2: 使用curl

您还可以通过在命令行中使用`curl`[3]将密钥插入密钥库。在创建环境中,这种方法可能更可取。您可能正在使用基于云的虚拟专用服务器的位置。

因为安全创建环境中最重要的问题,所以采取一切可能的预防措施很重要。在这种情况下,这意味着要注意不要遗留任何私钥痕迹,例如终端的历史记录。创建一个文件,用于定义“ curl”请求的主体:

{
"jsonrpc":"2.0",
"id":1,
"method":"author_insertKey",
"params":[
"<aura/gran>",
"<mnemonicphrase>",
"<publickey>"
]
}

#SubmitanewkeyviaRPC,connecttowhereyour`rpc-port`islistening
$curlhttp://localhost:9933-H"Content-Type:application/json;charset=utf-8"-d"@/path/to/file"

如果正确输入命令和参数,则节点将返回 JSON 响应,如下:

{"jsonrpc":"2.0","result":null,"id":1}

完成后,请确保删除包含密钥的文件。

后续参与者的加入

随后的验证人现在可以加入网络。可以参照 Bob 之前的操作指定--bootnodes参数来完成。

./target/release/node-template\
--base-path/tmp/node02\
--chain./customSpecRaw.json\
--port30334\
--ws-port9945\
--rpc-port9934\
--telemetry-url'ws://telemetry.polkadot.io:10240'\
--validator\
--rpc-methods=Unsafe\
--nameMyNode02\
--bootnodes/ip4/<IPAddress>/tcp/<Port>/p2p/<PeerID>

类似之前的操作,我们指定另一个base-path,给它另一个name,并且还将这个节点指定为validator。一旦第二个节点启动,您应该看到它们的创建:

2020-06-1013:27:45SubstrateNode
2020-06-1013:27:45??version2.0.0-rc3-f5acce1-x86_64-linux-gnu
2020-06-1013:27:45??bySubstrateDevHub<https://github.com/substrate-developer-hub>,2017-2020
2020-06-1013:27:45????Chainspecification:LocalTestnet
2020-06-1013:27:45????Nodename:MyNode02
2020-06-1013:27:45????Role:AUTHORITY
2020-06-1013:27:45????Database:RocksDbat/tmp/node02/chains/local_testnet/db
2020-06-1013:27:45?Nativeruntime:node-template-1(node-template-1.tx1.au1)
2020-06-1013:27:45????InitializingGenesisblock/state(state:0xecc5…18c6,header-hash:0x1af8…2b26)
2020-06-1013:27:45????LoadingGRANDPAauthoritysetfromgenesisonwhatappearstobefirststartup.
2020-06-1013:27:45?Loadedblock-time=6000millisecondsfromgenesisonfirst-launch
2020-06-1013:27:45????Highestknownblockat#0
2020-06-1013:27:45UsingdefaultprotocolID"sup"becausenoneisconfiguredinthechainspecs
2020-06-1013:27:45????Localnodeidentityis:12D3KooWPe2TanAA62uDo8wnBfBhKBewneUyc2j2j8KFkurrLxq7(legacyrepresentation:QmULySEqL3r4q7d5MDvHWX77YWQnRGQMyuNbiJrpoBeDQu)
2020-06-1013:27:46????Discoverednewexternaladdressforournode:/ip4/192.168.0.120/tcp/30334/p2p/12D3KooWPe2TanAA62uDo8wnBfBhKBewneUyc2j2j8KFkurrLxq7
2020-06-1013:27:50????Idle(0peers),best:#0(0x1af8…2b26),finalized#0(0x1af8…2b26),?0.6kiB/s?0.7kiB/s
2020-06-1013:27:55????Idle(1peers),best:#0(0x1af8…2b26),finalized#0(0x1af8…2b26),?0.2kiB/s?0.2kiB/s
2020-06-1013:28:00?Imported#1(0x605b…a82b)
2020-06-1013:28:00????Idle(1peers),best:#1(0x605b…a82b),finalized#0(0x1af8…2b26),?0.2kiB/s?0.2kiB/s

最后几行显示您的节点已与另一个节点 (1 peers)建立了点对点连接,并且产生了一个块 (best: #1 (0x605b…a82b)).

现在,您可以参照第一个节点上的操作,按照以下过程(在上一节中的操作)将密钥添加到其密钥库中。

如果要通过 UI 插入密钥,则必须在插入第二个节点的密钥之前将 UI 连接到第二个节点的 WebSocket 端点。

提醒:所有验证人必须使用相同的链规范才能进行点对点连接。您应该看到相同的初始区块和状态根哈希。

您会注意到,即使在添加了第二个节点的密钥之后,也没有发生块最终确定(finalized #0 (0x1af8…2b26))。插入 Grandpa 密钥后,Substrate 节点需要重新启动。这时可以停止节点,然后使用以前使用的相同命令重新启动它们。现在应该就可以完成块了。

2020-06-1013:30:08SubstrateNode
2020-06-1013:30:08??version2.0.0-rc3-f5acce1-x86_64-linux-gnu
2020-06-1013:30:08??bySubstrateDevHub<https://github.com/substrate-developer-hub>,2017-2020
2020-06-1013:30:08????Chainspecification:LocalTestnet
2020-06-1013:30:08????Nodename:MyNode02
2020-06-1013:30:08????Role:AUTHORITY
2020-06-1013:30:08????Database:RocksDbat/tmp/node02/chains/local_testnet/db
2020-06-1013:30:08?Nativeruntime:node-template-1(node-template-1.tx1.au1)
2020-06-1013:30:08????Highestknownblockat#15
2020-06-1013:30:08UsingdefaultprotocolID"sup"becausenoneisconfiguredinthechainspecs
2020-06-1013:30:08????Localnodeidentityis:12D3KooWPe2TanAA62uDo8wnBfBhKBewneUyc2j2j8KFkurrLxq7(legacyrepresentation:QmULySEqL3r4q7d5MDvHWX77YWQnRGQMyuNbiJrpoBeDQu)
2020-06-1013:30:08????Discoverednewexternaladdressforournode:/ip4/127.0.0.1/tcp/30334/p2p/12D3KooWPe2TanAA62uDo8wnBfBhKBewneUyc2j2j8KFkurrLxq7
2020-06-1013:30:12?Imported#16(0x1da4…8673)
2020-06-1013:30:13????Idle(1peers),best:#16(0x1da4…8673),finalized#13(0x69da…d2cc),?1.9kiB/s?2.0kiB/s

成功启动

恭喜你!您已经启动了自己的区块链!

在本教程中,您学习了如何生成自己的密钥对,创建使用这些密钥对的自定义链规范,并根据您的自定义链规范启动专用网络。

了解更多

我们在链规范中遇到的 Wasm blob 对于启用无叉升级是必要的。你还可以了解更多有关executor[4]如何使用链上 Wasm 的内容。

Dan Forbes最新更新于 6/12/2020

原文:https://substrate.dev/docs/en/tutorials/start-a-private-network/keygen

翻译:PolkaWorld

参考资料

[1]

Substrate中的密钥 :https://substrate.dev/docs/en/knowledgebase/advanced/cryptography#public-key-cryptography

[2]

JSON-RPC proxy:https://substrate.dev/docs/en/knowledgebase/getting-started/glossary#json-rpc-proxy-crate

[3]

curl:https://curl.haxx.se/

[4]

executor:https://substrate.dev/docs/en/knowledgebase/advanced/executor


欢迎学习 Substrate:

https://substrate.dev/

关注 Substrate 进展:

https://github.com/paritytech/substrate

关注 Polkadot 进展:

https://github.com/paritytech/polkadot


更多内容:


波卡周报 | 两周后移除 sudo,预计 8 月中旬开启 DOT 转账功能

一些使用 Polkadot 的实用信息

如何计算波卡的 Staking 收益?


扫码关注PolkaWorld公众号,回复 “1” 加入波卡群


关注 PolkaWorld

发现Web 3.0 时代新机遇

—-

编译者/作者:DotNews

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...