
上一篇文章使用Substrate Developer Hub提供的节点模板(substrate-node-template)启动了一条区块链,并使用前端模板(substrate-front-end-template)与区块链进行交互,初步体验了Substrate区块链的运行模式。这篇文章会关注Substrate区块链构建过程中的细节,提取其用到的技术并进行分析。
Rust编程语言
Substrate区块链框架整合使用了三大块技术:
Libp2pWebAssemblyRust
Rust这门编程语言贯穿了Substrate框架的底层和业务逻辑,要熟练使用Substrate,就要先学会Rust编程语言。

Rust语言有如下特点:
Rust是静态类型编译型语言;Rust使用实现(implementation)、特征(trait)和结构化类型(structured type),而不是类(class);Rust使用所有权/借用机制、生命周期、类型系统来实现内存安全,而不是自动垃圾收集器(GC);Rust基本理念是“零开销抽象”,在一次直接的对象或函数调用中不会产生多次地址分派,理论上Rust的运行速度与C/C++同级;Rust是一门混合范式编程语言,可以使用函数式编程,也可以使用面向对象编程;Rust是一门内存和线程安全的编程语言,不会出现传统意义上的空指针、悬挂指针、数组越界、共享全局变量、小概率多线程竞争等问题;Rust的运行时很小,启动速度很快,不占用大量无用内存,使得Rust编写的程序可以在嵌入式等硬件受限的设备上运行;
Rust是相当全能的一门编程语言,其内存和线程安全、高并发的特性天然契合区块链的需求,可以说是目前最适合作为区块链底层和应用开发的编程语言。
Cargo
Cargo是Rust的包管理器,相当于nodejs的npm或yarn,但cargo具有更多功能,还充当rust的代码组织管理工具,cargo提供了从项目的建立、构建到测试、运行直至部署的一系列工具,为rust项目的管理提供尽可能完整的手段。
上一篇文章中的substrate-node-template就是一个rust项目,使用 cargo build –release 命令构建,substrate-node-template构建前的项目结构如下:

构建后的项目结构如下:

可以看到,多了一个target目录,这个目录存放编译好的二进制应用程序,然后直接启动程序运行
./target/release/node-template –dev
Rust在Ubuntu系统的安装目录是~/.cargo,应用程序在 ~/.cargo/bin目录

最主要的应用程序是rustc和cargo,下面从最基本的Hello World介绍rustc和cargo的运行机制。
rustc版本的Hello World
rustc即rust编译器,用于把.rs源文件编译为机器可执行的目标文件。
新建hello.rs文件,编写如下代码
fn main() { println!(\”Hello World!\”);}
运行命令编译成可执行文件hello,并执行
rustc hello.rs./hello
控制台输出如下

cargo版本的Hello World
rustc可以胜任简单的rust编译工作,但当项目逐渐巨大时,就需要cargo来进行管理。
使用cargo创建rust项目的命令如下:
cargo new hello
使用cargo new命令创建了一个hello项目,项目结构如下:

由两个文件组成:
src/main.rs存放源代码,和上面的hello.rs内容相同;Cargo.toml存放项目信息[package]和依赖库[dependencies]等,相当于cargo构建项目的指南;
运行命令
cd hellocargo run
控制台输出如下

cargo run命令执行编译和运行两个步骤,如果只编译可以执行
cargo build
仅作语法检查可以执行
cargo check
编译后的hello项目会多出一个文件夹target,和一个文件Cargo.lock。
target目录存放编译好的应用程序;Cargo.lock包含依赖项的确切信息,由Cargo自动生成,无需手动编辑,而Cargo.toml需要手动配置依赖;
cargo build/run命令默认会运行debug版本,带上–release参数后
cargo build –releasecargo run –release
会运行release版本。
两种版本生成的应用程序存放的路径不同:
默认debug版本:target/debug/hellorelease版本:target/release/hello
使用Cargo添加依赖库
Rust的外部依赖库都托管在crates.io上,每个依赖库又称为一个“crate”。
下面为hello项目添加一个外部依赖rand,它是一个随机数生成库。
添加rand只需要在Cargo.toml文件的[dependencies]下加入一行代码
[dependencies]rand = \”0.7.3\”
再次运行cargo build,会下载rand及其依赖的其他库如libc、getrandom等

使用如下命令可以更新所有依赖库
cargo update
添加-p选项可以更新指定依赖库
cargo update -p rand
