赞
踩
在添加可信节点中,您看到了如何使用一组已知的验证器节点构建一个简单的网络。该教程演示了一个简化版的许可网络(permissioned network)。在一个被许可的网络中,只有被授权的节点(authorized nodes)被允许执行特定的网络活动。例如,您可以授予一些节点验证块的权限,授予其他节点传播交易的权限。
具有被授予特定权限的节点的区块链不同于公共(public )或无授权(permissionless )的区块链。在无授权的区块链中,任何人都可以通过在合适的硬件上运行节点软件来加入网络。一般来说,无授权区块链提供了更大的网络去中心化。但是,在某些用例中,创建一个受许可的区块链可能是合适的。例如,一个被许可的区块链将适用于以下类型的项目:
本教程演示如何使用节点授权 pallet构建带有Substrate的受许可网络。
节点授权 pallet
是一个预先构建的 FRAME
托盘,使您能够管理网络的一组可配置的节点。每个节点由一个peer identifier (PeerId
)标识。每个对等标识符由声明该节点的一个且只有能一个帐户所有者(AccountId
)拥有。
有两种方式可以授权一个节点加入网络:
Sudo
pallet 的根帐户才能执行此操作。如下图所示,本教程演示了两种授权方法,其中Alice和Bob的对等标识符定义在链规范中,其他节点使用节点授权pallet(node authorization pallet
)添加。
请注意,任何用户都可以声称自己是PeerId
的所有者。为了防止错误声明,应该在启动节点之前声明节点标识符。启动节点后,它的PeerID
对网络可见,任何人都可以随后声明它。
作为节点的所有者,您可以为节点添加和删除连接。例如,您可以操作预定义节点与您的节点之间的连接,或者您的节点与其他非预定义节点之间的连接。不能更改预定义节点的连接。他们总是被允许相互联系。
节点授权(node-authorization
)pallet 使用脱链工作器(offchain worker )来配置其节点连接。请确保在启动节点时启用脱链工作器,因为对于非权威节点,默认情况下它是禁用的。
通过完成本教程,您将实现以下目标:
参考前面文章
在使用新托盘之前,必须将有关它的一些信息添加到编译器用于构建运行时二进制文件的配置文件中。
对于Rust程序,您使用Cargo.toml
文件定义配置设置和依赖项,这些设置和依赖项决定在生成的二进制文件中编译什么。因为Substrate运行时既编译为包含标准库函数的原生Rust二进制文件,也编译为不包含标准库的WebAssembly (Wasm)二进制文件,即Cargo.toml
文件控制两个重要的信息:
std
)特性集,您可以将运行时编译为包含函数、类型和原语,否则在构建WebAssembly
二进制时就会丢失这些原语。有关在Cargo.toml
文件中添加依赖项的一般信息,请参阅Cargo文档中的依赖项。有关启用和管理依赖包中的特性的信息,请参阅Cargo文档中的特性。
将节点授权(node-authorization
)托盘添加到Substrate
运行时:
runtime/Cargo.toml
配置文件。[dependencies]
部分,并添加pallet-node-authorization
crate ,使其对节点模板运行时可用。[dependencies]
pallet-node-authorization = { default-features = false, version = "4.0.0-dev", git = "https://github.com/paritytech/substrate.git", branch = "polkadot-v0.9.28" }
这一行将pallet-node-authorization
crate 作为依赖项导入,并为板条箱指定以下配置细节:
pallet-node-authorization
crate 的存储库位置。请注意,您应该对所有托盘使用相同的分支和版本信息,以确保它们彼此兼容。使用来自不同分支的托盘可能会导致编译器错误。这个示例演示了向Cargo.toml
文件添加托盘,如果其他托盘使用branch = "polkadot-v0.9.28"
。
将pallet-node-authorization/std
特性添加到要在编译运行时启用的features
列表中。
[features]
default = ['std']
std = [
...
"pallet-node-authorization/std", # add this line
...
]
此部分指定此运行时要编译的默认特性集是std
特性集。当使用std
特性集编译运行时,将启用作为依赖项列出的所有托盘中的std
特性。有关如何使用标准库将运行时编译为原生Rust二进制文件,以及如何使用no_std
属性将运行时编译为WebAssembly二进制文件的更多详细信息,请参见构建过程。
如果您忘记更新Cargo.toml
文件中的features
部分,您可能会看到在编译运行时二进制文件时cannot find function
错误。
通过运行以下命令检查新的依赖项是否正确解析:
cargo check -p node-template-runtime --release
为了在本教程中模拟治理,您可以配置托盘以使用可以使用Sudo
托盘调用的EnsureRoot
特权函数。默认情况下,节点模板中包含Sudo
托盘,并允许您通过根级管理帐户(root-level administrative account
)进行调用。在生产环境中,您将使用更实际的基于治理的检查。
要在运行时启用EnsureRoot
规则:
runtime/src/lib.rs
文件。use frame_system::EnsureRoot;
Config
trait每个托盘都有一个Rust trait,称为Config
。Config
trait 用于标识托盘所需的参数和类型。
添加托盘所需的大多数特定于托盘的代码都是使用Config
trait实现的。您可以通过参考其Rust文档或该托盘的源代码来查看需要为任何托盘实现的内容。例如,要了解在节点授权托盘中需要为Config
trait 实现什么,可以参考Rust文档中的pallet_node_authorization::Config。
要在运行时中实现node-authorization
托盘:
runtime/src/lib.rs
文件。parameter_types
部分:parameter_types! {
pub const MaxWellKnownNodes: u32 = 8;
pub const MaxPeerIdLength: u32 = 128;
}
Config
trait添加impl
部分:impl pallet_node_authorization::Config for Runtime {
type RuntimeEvent = RuntimeEvent;
type MaxWellKnownNodes = MaxWellKnownNodes;
type MaxPeerIdLength = MaxPeerIdLength;
type AddOrigin = EnsureRoot<AccountId>;
type RemoveOrigin = EnsureRoot<AccountId>;
type SwapOrigin = EnsureRoot<AccountId>;
type ResetOrigin = EnsureRoot<AccountId>;
type WeightInfo = ();
}
construct_runtime
宏:construct_runtime!(
pub enum Runtime where
Block = Block,
NodeBlock = opaque::Block,
UncheckedExtrinsic = UncheckedExtrinsic
{
/*** Add This Line ***/
NodeAuthorization: pallet_node_authorization::{Pallet, Call, Storage, Event<T>, Config<T>},
}
);
cargo check -p node-template-runtime --release
在启动网络以使用节点授权之前,需要进行一些额外的配置来处理对等标识符和帐户标识符。例如,PeerId
以bs58
格式编码,因此您需要在node/Cargo.toml
中为bs58库添加一个新的依赖项。对PeerId
进行解码,得到PeerId
的bytes。为了简单起见,授权的节点与预定义的帐户相关联。
为授权节点配置genesis存储:
node/Cargo.toml
[dependencies]
部分并将bs58
库添加到节点模板中。[dependencies]
bs58 = { version = "0.4.0" }
node/src/chain_spec.rs
use sp_core::OpaquePeerId; // A struct wraps Vec<u8> to represent the node `PeerId`.
use node_template_runtime::NodeAuthorizationConfig; // The genesis config that serves the pallet.
testnet_genesis
函数。GenesisConfig
声明中,添加以下代码块: node_authorization: NodeAuthorizationConfig {
nodes: vec![
(
OpaquePeerId(bs58::decode("12D3KooWBmAwcd4PJNJvfV89HwE48nwkRmAgo8Vy3uQEyNNHBox2").into_vec().unwrap()),
endowed_accounts[0].clone()
),
(
OpaquePeerId(bs58::decode("12D3KooWQYV9dGMFoRzNStwpXztXaBUjtPqi6aU76ZgUriHhKust").into_vec().unwrap()),
endowed_accounts[1].clone()
),
],
},
在这段代码中,NodeAuthorizationConfig
包含一个nodes
属性,它是一个包含两个元素的元组的向量。元组的第一个元素是OpaquePeerId
。bs58::decode
操作将人类可读的PeerId
(例如,12d3koowbmawcd4pjnjvfv89hwe48nwkrmago8vy3uqeynnhbox2
)转换为字节。元组的第二个元素是AccountId
,表示该节点的所有者。本例使用预定义的Alice和Bob,在这里被标识为赋值帐户[0]和[1]。
cargo build --release
如果没有语法错误,就可以继续了。如果有错误,请按照编译输出中的说明修复它们,然后重新运行cargo构建命令。
您已经在genesis存储中配置了与Alice和Bob帐户关联的节点。您可以使用 subkey程序检查与预定义帐户相关联的密钥,并生成和检查您自己的密钥。但是,如果您运行subkey generate-node-key
命令,您的节点密钥和对等标识符将随机生成,并且不会与教程中使用的密钥匹配。因为本教程使用预定义帐户和众所周知的节点密钥,所以您可以为每个帐户使用以下密钥。
Alice
Key type | Key value |
---|---|
Node key | c12b6d18942f5ee8528c8e2baf4e147b5c5c18710926ea492d09cbd9f6c9f82a |
Peer identifier generated from the node key | 12D3KooWBmAwcd4PJNJvfV89HwE48nwkRmAgo8Vy3uQEyNNHBox2 |
Peer identifier decoded to hex | 0x0024080112201ce5f00ef6e89374afb625f1ae4c1546d31234e87e3c3f51a62b91dd6bfa57df |
Bob
Key type | Key value |
---|---|
Node key | 6ce3be907dbcabf20a9a5a60a712b4256a54196000a8ed4050d352bc113f8c58 |
Peer identifier generated from the node key | 12D3KooWQYV9dGMFoRzNStwpXztXaBUjtPqi6aU76ZgUriHhKust |
Peer identifier decoded to hex | 0x002408011220dacde7714d8551f674b8bb4b54239383c76a2b286fa436e93b2b7eb226bf4de7 |
另外两个开发帐户—charlie和dave—没有在genesis配置中定义的众所周知的节点键或对等标识符。为了便于演示,您可以对这些帐户使用以下密钥。
Charlie
Key type | Key value |
---|---|
Node key | a99331ff4f0e0a0434a6263da0a5823ea3afcfffe590c9f3014e6cf620f2b19a |
Peer identifier generated from the node key | 12D3KooWPHWFrfaJzxPnqnAYAoRUyAHHKqACmEycGTVmeVhQYuZN |
Peer identifier decoded to hex | 0x002408011220c81bc1d7057a1511eb9496f056f6f53cdfe0e14c8bd5ffca47c70a8d76c1326d |
Dave
Key type | Key value |
---|---|
Node key | a99331ff4f0e0a0434a6263da0a5823ea3afcfffe590c9f3014e6cf620f2b19a |
Peer identifier generated from the node key | 12D3KooWPHWFrfaJzxPnqnAYAoRUyAHHKqACmEycGTVmeVhQYuZN |
Peer identifier decoded to hex | 0x002408011220c81bc1d7057a1511eb9496f056f6f53cdfe0e14c8bd5ffca47c70a8d76c1326d |
对于本教程,您可以将 node key 复制到文件中,然后使用subkey inspect-node-key
来验证Charlie
和Dave
的对等标识符。例如,将Charlie的节点密钥保存到名为charlie-node-key
的文件中,然后执行如下命令验证peer 标识符
./subkey inspect-node-key --file charlie-node-key
查看Charlie节点的对等体标识符。
12D3KooWJvyP3VJYymTqG7eH4PM5rN4T2agk5cdNCfNymAqwqcvZ
如果您为自己的帐户生成节点密钥,请将节点的对等标识符保存到一个文件中,以便在需要时将其传递给subkey inspect-node-key
或其他命令。
现在可以使用预定义帐户的节点密钥和对等标识符启动受许可的网络,并授权其他节点加入。
在本教程中,您将启动四个节点。其中三个节点与预定义的帐户相关联,所有这三个节点都被允许创建和验证块。第四个节点是 sub-node
,它只被授权在节点所有者批准的情况下从选定的节点读取数据。
因为您已经配置了genesis存储为Alice和Bob使用众所周知的节点键,您可以使用-name alice --validator
命令的快捷方式--alice
来启动第一个节点。
启动第一个节点:
./target/release/node-template \
--chain=local \
--base-path /tmp/validator1 \
--alice \
--node-key=c12b6d18942f5ee8528c8e2baf4e147b5c5c18710926ea492d09cbd9f6c9f82a \
--port 30333 \
--ws-port 9944 \
--unsafe-ws-external \
--unsafe-rpc-external
[root@localhost substrate-node-template]# ./target/release/node-template --chain=local --base-path /tmp/validator1 --alice --node-key=c12b6d18942f5ee8528c8e2baf4e147b5c5c18710926ea492d09cbd9f6c9f82a --port 30333 --ws-port 9944 --unsafe-ws-external
2023-03-02 17:40:31 Low open file descriptor limit configured for the process. Current value: 4096, recommended value: 10000.
2023-03-02 17:40:31 Substrate Node
2023-03-02 17:40:31 ✌️ version 4.0.0-dev-d79d8cef20b
2023-03-02 17:40:31 ❤️ by Substrate DevHub <https://github.com/substrate-developer-hub>, 2017-2023
2023-03-02 17:40:31 声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/226010
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。