json文件的chain specchainspec JSON是一个大的JSON对象,通过substrate build-spec命令分解。此命令通过提到节点的引入runtime模块并查询必须定义的公开发表配备来工作。这些将是空值或获取默认值。本质上,runtime模块可以依赖“创世纪配备”,换句话说,我们在区块链首次初始化和建构其状态时获取的配备。
这一状态是通过创世纪地块-第一个生产的区块链启动的。chainspec json文件的任务是定义这个初始状态。一旦分解,我们可以在运营节点之前关上此chainspec chain并改动任何我们指出适当的值。
留意:如果我们的链写出了我们仍然必须的状态呢?或许我们早已改版了一个模块,或者任何链配备,并且想体现来自Genesis块的变更?我们可以清理链-移除块历史-有效地重置节点。您的节点为此获取了purge-chain命令,网卓新闻网,一般来说用作研发工作流:# optional --dev flag to specify development chainsubstrate purge-chain --dev除此之外,框架还获取了三个配置文件的chain“spec”(pre-filled configurations),它们根据我们是运营节点展开测试还是生产目的来定义一些基本值。实质上,配置文件情况下获取了三个spec:dev,local和staging:· dev spec是离实际用例更远的规范,主要配备为协助您用于链。我们为您获取了一系列帐户,并为所有实包的runtime模块获取了配备。
· local spec类似于dev规范,在private network substrate教程中用于,由parity托管地。假设您期望在本地测试多用户场景,它不会为多个帐户获取“权限”。· staging是一个更加激进的规范,定义了受限数量的帐户,并省略了特定于模块的配备。
这是您在建构生产链时自由选择的规范。我们可以做到的是用于substrate build-spec命令基于这些获取的选项之一建构新的chain spec,将结果输入到分开的文件。如果我想要拷贝我自己的链的研发chain spec,我可以运营以下命令,在我的主目录中的新my-chianspec.json文件中输入规范:substrate build-spec --chain=dev~/my-chainspec.json在编辑器中关上此文件以查阅能用的配备选项。留意:您有可能期望拉链genesis.system.runtime区块,其中包括一个无法加载的运营时区块。
id字段可以改动为您自己的名称,以及名称字段,这是一个更加更容易解读的chain spec名称。一些值得注意的少见选项还包括:遥测端点(Telemetry endpoints):通过遥测端点为遥测服务获取端点。这将容许您用于已相连的节点填满UI,与Polkadot遥测有所不同。
在您的节点处置原生令牌的情况下,获取初始帐户的余额列表。抵押配备(staking configuration):链反对该功能。配备选项,如初始检验器帐户、检验器和存储变量。最后,根据runtime包括的模块,还不会有各种其他变量。
协助您熟知chain spec文件的建议方法是参照主substrate节点chain spec。substrate build-spec --chain ~/chainspec.json --raw~/mychain.json最后,为了运营我们的区块链,我们获取了这种chain spec的substrate。从这里我们将假设您正在运营自定义编译器的Substrate节点,我们将node_path更换为该节点的运营时。
node_path --chain ~/mychain.json --validator留意:您的链开始分解区块必须检验者标志。接下来让我们想到初始化和编译器自定义Substrate节点。初始化substate节点到目前为止,我们仍然在用于通过加装脚本取得的已编译器substrate节点。
这对于测试研发链是十分友好关系的。但是它容许了我们引进自己的runtime模块和自定义配备。
为此,我们必须iTunessubstrate源代码。我们有两种方法可以开始用于我们自己的自定义substrate链:1、iTunes更容易配备的节点模板(例如,从第一部分原始加装中iTunes的测试网节点模板,或特定可供的Substrate Kitties节点)。
2、用于Substrate Scripts,iTunes官方节点模板,一个非常简单的Substrate节点脚本,其中包括准备好展开runtiem模板。我们可以用于我们之前加装的Substrate Scripts来已完成这项工作。用于以下命令分解新的节点模板:// substrate-node-new node_name authorsubstrate-node-new my-node "Ross Bulat"这有可能必须一些时间,明确各不相同您的系统 - 将提供和编译器近期的Substrate源代码。已完成后,节点的运营时现在可以通过lib.rs文件在runtime/src文件夹中编辑。
其中还包括一个runtime模块的模板,模板为template.rs。接下来我们将查阅一个runtime模块。
建构自定义节点在节点目录中,用于附带的build.sh脚本将节点编译器为wasm,然后用于cargo编译器binary文件:# build wasm./scripts/build.sh# build binarycargo build --release现在将在节点的./target/release/目录中编译器节点。在我们用于substrate调用特定于节点的命令的地方,我们现在可以参照我们新建的binary文件,在我们的自定义链上运营命令。要清理链并新的运营它,我们将用于binary文件:# clear chain state./target/release/node_name purge-chain --dev# run in dev mode./target/release/node_name --dev我们在这里讲解的最后一个主题是runtime模块。
让我们探究它们是什么以及如何将它们包括在Substrate节点中。讲解substrate的runtime模块什么彰显Substrate实用性是一种标准化的模块化结构,容许开发人员将功能放入其runtime,从而创立合乎其拒绝的自定义区块链。
留意:Substrate运营时的另一个术语是状态切换函数或STF。这实质上是继续执行块的函数,造成区块链再次发生状态变更。这些功能包在称作模块,或者更加具体地说,是runtime模块。
预先与Substrate一起包的这些runtime模块系列联合构成了一个模块目录,称作substrate的runtime模块库或SRML。这些模块十分简单。它们为我们希望从其他区块链框架取得的一系列功能加到了功能,并且可以在github上网页。让这些模块随时能用可以防止开发人员新的发明者轮子——在构建了全新功能的地方,它们也可以作为runtime模块研发。
以下是一些能用的模块:assets:为可替代资产获取反对的模块——看看ERC20代币。balance:为管理账户余额获取反对的模块。
Staking:一个模块,获取管理网络维护者所注目资金的功能。您不会注意到,每个模块都被格式化为Rust crate,目的导入到Substrate runtime环境中。
每个SRML模块都会被包一起,并在模块名称前面再加srml_后缀,每个模块都可以在Parity的crate库的左侧菜单中寻找。模块结构阐述每个模块都在自己的src / lib.rs文件中定义合乎特定的结构。我们早已可以看见Substrate模块的高级特性:模块可以定义为一个文件、module-name.rs或更加少见的lib.rs。
模块还可以有其他反对文件,一般来说都坐落于特定目录中。模块必需合乎特定结构,依赖特定substrate API。这最后一点到底意味著什么?嗯,这各不相同你的模块实际做到了什么。
模块为区块链获取了功能 - 我们早已告诉了很多 - 但是这个功能可以以一系列组件的形式经常出现:事件(event):模块可以定义在符合特定条件时要调用的自定义事件 - 当您制作新的不能更换的令牌时,有可能是TokenCreated事件。事件包括在decl_event!marco:decl_event!(pub enum EventTwhereT as system::Trait::AccountId,T as system::Trait::Hash{TokenCreated(AccountId, Hash),});存储(storage):模块可以定义要在链上长久简化的数据结构,如同构、列表等。我们实质上可以存储一系列数据类型,其中大部分都在这里记录。存储项在decl_storage! macro:decl_storage! {trait Store for ModuleT: Trait as NFTStorage {TokenToOwner get(token): map T::Hash = TokenT::Hash, T::Hash;TokenIndex get(get_token_by_index): map u64 = T::Hash;TotalTokens get(total_tokens): u64;... }}Dispatchable函数:可以在runtime通过JSON RPC调用继续执行的公共函数。
所有可调度函数都包括origin参数,其中包括有关函数调用源的信息,例如调用者的公共地址和其他元数据。如果我们查阅Assets模块可调度函数,我们可以看见为我们定义了issue,transfer和destroy。可调度函数通过帐户调用。
我们将更进一步用于特定工具管理帐户。public或private函数:模块可以获取可以从runtime环境中的任何方位调用的公共函数,以及不能在模块构建中调用的私有函数。这些都不是可调度的功能,例如它们无法通过JSON RPC协议从外部采访,也不必须origin参数。
结构(Structs):模块可以定义该模块有可能必须的结构。例如可能会为用作追踪全球货件的链定义ShipmentItem结构:#[derive(Encode, Decode, Default, Clone, PartialEq)]pub struct ShipmentItemHash, Balance {id: Hash,container_id: Hash,price: Balance,weight: u64}请注意,我们可以将其他类型引进结构中,就像我们在上面的示例中用于Hash和Balance一样。标准类型(如hash)在runtime原语库中定义,但类型也一般来说在其他runtime模块中定义,在这些模块中我们引进了倚赖关系的概念。
正如我们早已找到的,模块可以是crates,因此可以作为cargo.toml中的倚赖项。这样可以保证其他人倚赖的模块会遗失。返回即插即用的仿真,模块定义了可在runtime内(继续执行)的可放入(引入)功能,为您的链获取额外的功能。
这个可放入的方面只是意味著将必需的模块声明并导入到Substrate运营时。通过对substrate模块实际是什么的概念性解读,让我们用于substrate-module-new用程序来分解一个非常简单的模块模板。初始化新的模块与substrate-node-new程序一样,我们还iTunes了一个substrate-module-new程序,它可以获取近期的模块模板可供我们用于。
在节点runtime目录中,用于以下命令打算新的模块:substrate-module-new module_name让我们用my-module的名称来运营它。输入将提醒我们将模块加到到runtime / src / lib.rs文件中:cd runtime/srcsubstrate-module-new my-module SRML module created as ./my-module.rs and added to git. Ensure that you include in your ./lib.rs the line: mod my_module;分解的文件my module将与最初包括在目录中的template.rs文件完全相同。但是运营substrate module new是在事件模板中启动新的runtime模块的选用方法同时rs已被编辑。
总结这篇关于substrate的讲解早已讲解了如何加装框架,以及如何用于包括的工具来协助部署自定义节点和模块。我们用于了Polkadot JS程序,理解它如何作为Substrate管理实用程序工作,同时当作链资源管理器和管理器。该应用程序目的获取标准化功能,会假设您的链反对什么 - 应用程序的UI将根据您的chain spec和您在runtime定义的模块改版。
关于chain spec的主题,我们讲解了如何通过substrate建构规范分解规范JSON文件,其内容将根据链的runtime将runtime模块而变化。还有三个预先配备的chain spec,用作填满研发或生产节点的规范。在编译器为完整状态并与运营时一起用于之前,可以编辑chain spec。
本文来源:yabo888vip网页版登录官网-www.xawhjd.cn