一、前言
Substrate是一个用于构建区块链的开源的、模块化的和可扩展的区块链开发框架。它由Parity以及个人开发者和许多公司组成的社区共同维护。Substrate可以用作开发公链、联盟链和私有链的基础,它可以在短时间内构建完整、可配置的区块链系统。
选择Substrate作为区块链开发框架,可以让开发者更快速地构建出高性能、安全可靠的区块链应用。本文将介绍如何使用Substrate创建一个简单的示例。
二、准备工作
在开始使用Substrate之前,我们需要安装一些依赖项来建立开发环境。
首先,我们需要安装以下依赖项:
sudo apt update
sudo apt install -y cmake pkg-config libssl-dev git gcc build-essential clang libclang-dev
两行代码是用来在Ubuntu或Debian操作系统上安装Substrate所需的依赖项。
第一行代码sudo apt update
用来更新本地软件包索引,以确保我们能够安装最新版本的依赖项。
第二行代码sudo apt install -y cmake pkg-config libssl-dev git gcc build-essential clang libclang-dev
用来安装Substrate所需的依赖项。其中,cmake
、pkg-config
、libssl-dev
、git
、gcc
、build-essential
、clang
和libclang-dev
都是Substrate所需的依赖项。
接下来,我们需要安装Rust开发环境。我们可以使用rustup来安装Rust:
curl https://sh.rustup.rs -sSf | sh
这行代码是用来安装Rust编程语言的官方安装工具rustup。
curl https://sh.rustup.rs -sSf
用来从Rust官方网站下载rustup安装脚本。
|
符号将curl命令的输出传递给了后面的sh
命令。
sh
命令用来执行从curl命令中获取的脚本,从而安装rustup。
安装完成后,可以使用rustup来安装和管理Rust编程语言及其相关工具。
安装完成后,我们需要配置Rust环境变量:
source $HOME/.cargo/env
这行代码用来配置Rust环境变量。
source
命令用来在当前shell会话中执行指定的脚本文件。
$HOME/.cargo/env
是Rust安装程序创建的脚本文件,它包含了配置Rust环境变量所需的命令。
执行这行代码后,就可以在当前shell会话中使用Rust及其相关工具了。
最后,我们需要获取Substrate的源代码。我们可以从GitHub上克隆Substrate仓库:
git clone https://github.com/paritytech/substrate.git
cd substrate
这两行代码用来从GitHub上克隆Substrate仓库并进入仓库目录。
第一行代码git clone https://github.com/paritytech/substrate.git
使用git clone
命令从GitHub上克隆Substrate仓库到本地计算机。
第二行代码cd substrate
使用cd
命令进入克隆下来的Substrate仓库目录。
执行这两行代码后,就可以在本地计算机上访问Substrate的源代码了
三、创建节点模板
Substrate提供了一个节点模板,可以让开发者快速创建一个基于Substrate的节点。
首先,我们需要编译节点模板:
cd bin/node-template
cargo build --release
这两行代码用来编译Substrate节点模板。
第一行代码cd bin/node-template
使用cd
命令进入Substrate节点模板目录。
第二行代码cargo build --release
使用cargo build
命令编译节点模板。其中,--release
选项表示编译优化后的版本,以提高运行性能。
执行这两行代码后,就可以在target/release
目录下找到编译好的节点模板可执行文件了。
编译完成后,我们可以运行节点模板:
./target/release/node-template --dev --tmp
这行代码用来运行Substrate节点模板。
./target/release/node-template
表示运行编译好的节点模板可执行文件。
--dev
选项表示以开发模式运行节点,这将使用预定义的开发配置并创建一个临时的开发链。
--tmp
选项表示在退出时清除链数据,这样下次运行时将重新创建一个全新的链。
运行节点后,我们可以打开浏览器并访问https://polkadot.js.org/apps/#/explorer
来验证节点是否正常运行。
四、定制运行时模块
Substrate允许开发者定制运行时模块来实现自定义功能。
首先,我们需要了解什么是运行时模块。运行时模块是Substrate中用于定义链上逻辑的代码单元。它们通常包含存储项、事件、可调用函数等内容。
接下来,我们将添加一个自定义运行时模块。首先,在runtime/src/lib.rs
文件中添加以下内容:
#[derive(Encode, Decode, Default, PartialEq, Eq)]
#[cfg_attr(feature = "std", derive(Debug))]
pub struct MyStruct {
pub number: u32,
}
decl_storage! {
trait Store for Module<T: Trait> as TemplateModule {
MyStorageValue get(fn my_storage_value): MyStruct;
}
}
以上定义了一个名为 MyStruct
的结构体,该结构体具有一个名为 number
的公共字段,其类型为 u32
。此外,它还使用了 derive
属性来自动实现一些特征,如 Encode
、Decode
、Default
、PartialEq
和 Eq
。如果启用了 std
功能,则还会自动实现 Debug
特征。
接下来的部分使用了宏 decl_storage!
来定义一个存储项。这个存储项属于一个名为 TemplateModule
的模块,该模块实现了一个名为 Store
的特征。存储项的名称为 MyStorageValue
,可以使用函数 my_storage_value
来获取其值。存储项的类型为 MyStruct
。
然后,在pallets/template/src/lib.rs
文件中添加以下内容:
decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin {
#[weight = 10_000]
fn set_value(origin, value: u32) -> dispatch::DispatchResult {
let _ = ensure_signed(origin)?;
MyStorageValue::put(MyStruct { number: value });
Ok(())
}
}
}
这段代码使用了宏 decl_module!
来定义一个模块。该模块包含一个名为 set_value
的公共函数,该函数接受两个参数:origin
和 value
。origin
参数表示调用该函数的来源,而 value
参数是一个 u32
类型的值。
在函数内部,首先使用 ensure_signed
函数来检查 origin
是否已签名。如果检查通过,则使用 put
函数将 MyStorageValue
的值设置为一个新的 MyStruct
实例,其中 number
字段的值为传入的 value
参数。最后,函数返回 Ok(())
表示成功。
此外,该函数还使用了 weight
属性来指定其权重为 10,000。
最后,重新编译并运行节点:
cargo build --release
./target/release/node-template --dev --tmp
第一个命令 cargo build --release
使用 Rust 的包管理器 Cargo 来构建项目。--release
标志表示构建用于发布的版本,这通常会启用优化并生成更快的二进制文件。
第二个命令 ./target/release/node-template --dev --tmp
运行构建好的二进制文件。./target/release/node-template
是二进制文件的路径。--dev
和 --tmp
是传递给该二进制文件的参数,它们的含义取决于该二进制文件本身。
五、测试链功能
现在,我们已经成功创建了一个简单的基于Substrate的区块链应用。接下来,我们将测试链上功能。
首先,我们需要发送一笔交易来调用刚才添加的set_value
函数。我们可以在PolkadotJS Apps页面中进行操作。在左侧菜单中选择Developer
-> Extrinsics
,然后选择我们刚才添加的set_value
函数,并输入一个值作为参数。然后,点击Submit Transaction
按钮来发送交易。
然后,我们可以验证交易状态,并观察链上状态变化。在左侧菜单中选择Network
-> Explorer
,然后在右侧面板中查看最近的区块信息。如果一切正常,我们应该能够看到刚才发送的交易被打包进了最新的区块。
此外,我们还可以通过查询存储状态来验证链上数据是否发生了变化。在左侧菜单中选择Developer
-> Chain State
,然后选择我们刚才添加的存储项并点击查询按钮。如果一切正常,我们应该能够看到存储状态发生了变化。
六、总结
通过上面的步骤,我们成功地使用Substrate创建了一个简单的示例。Substrate作为一个灵活、模块化和可扩展的区块链开发框架,为开发者提供了快速构建高性能、安全可靠的区块链应用的能力。
在未来,随着区块链技术的不断发展,Substrate将继续为开发者提供更多的便利和支持。我们期待看到更多基于Substrate的优秀区块链应用诞生。from刘金,转载请注明原文链接。感谢!