Rust:如何使用Substrate区块链框架

2,041 阅读7分钟

一、前言

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所需的依赖项。其中,cmakepkg-configlibssl-devgitgccbuild-essentialclanglibclang-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 属性来自动实现一些特征,如 EncodeDecodeDefaultPartialEq 和 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 和 valueorigin 参数表示调用该函数的来源,而 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刘金,转载请注明原文链接。感谢!