磨刀不误砍柴工,准备好了,才能写好 Substrate 应用。

在前一篇,我们对“什么是 Substrate”有了感观上的认识,但这并不足以让你可以轻松地开发出符合自己需要的

开发 Substrate 应用必须掌握的 Rust 语言基础知识(没列出的常规使用可以比照你已经掌握的语言):

  • 宏的使用,但作为新手不要去纠结如何编写宏。
  • 属性(Attribute)的含义和使用。
  • 打印和 format! 的显示规范,尤其比如:{:?}
  • 可变和不可变变量绑定,同时理解 & 以及 & mut,比如:String 和 &str 的区别。
  • 典型集合类型:数组、Vector、Slice、Tuple。
  • 静态结构定义和动态行为的添加:Struct + Traits 组合,同时了解 Trait 的类型约束,以及 + 和 where 的使用。
  • 类型别名 type。
  • 两类特殊的 Enum 类型:Option 和 Result。
  • match 以及如何捕获 match 变量。
  • 函数、闭包、高阶函数
  • Rust 禁止隐式转换,实现类型之间转换的 From 和 Into Trait。
  • 错误处理,以及 ? 的使用。
  • 模块系统和 Crate。

真正让 Rust 大放异彩的实际上是跟内存安全相关的知识点:

  • 理解指针和引用,有 C / C++ 的程序员应该不陌生。
  • 理解 borrow 和 ownership。
  • 变量直接赋值和类型的关系:
    • 原始类型(标量类型、布尔、字符、数组、元组)或实现了 Copy Trait 的类型,赋值就是 copy,不涉及 ownership 转移
    • 否则,ownership 将转移。
  • 理解生命周期,熟悉 ‘static
  • 利用 Drop Trait 释放资源,类似 C++ 的析构函数。
  • 熟悉 Box、Rc、Cell、RefCell、Arc 等智能指针。

下图可以帮助大家理解 borrow 和 ownership,摘自 rust borrow 和 ownership 图解。

开发 Substrate 的准备工作

以上内容就是 Substrate 开发必备的 Rust 知识。当然,在开发过程中,还少不了要了解标准库和其他工具包的使用,但这些跟使用其他语言开发系统差别不大,在此略过不提。

至于其他功能,比如 GUI、网络、微服务、Web 和并发编程,有了以上的基础也能很快上手。

在结束本节之前,推荐几个链接:

  • Rust 学习资源
  • Rust by Example
  • The Cargo Book
  • Awesome Rust

最后,一个特别推荐:24 days of Rust。

开发 Substrate 必备的基本概念

前文说过,Substrate 可被视为

所谓开发 Substrate,其本质就是开发自己的 Runtime,它包含了区块链行为的业务逻辑,定义了用户可以派发的存储项和函数。每个 Runtime 包含了一组特定的 Pallet,每个 Pallet 定义了特定的功能业务逻辑以及所需的存储项。

Substrate 内置了一组预定义的 Pallet,这些 Pallet 及其支持库的全集被称为 FRAME。因此,FRAME 和 Runtime 的关系也就是全集和子集的关系,见下图。

开发 Substrate 的准备工作

当预定义的 Pallet 不足以满足业务需要时,开发者可以选择自行开发 Pallet。因此,整个开发工作也就成了:选择合适的 Pallet + 开发自己的 Pallet。

Pallet 的开发并没有想象中那么神秘,主要把握以下几点就行:

  • 理解 Substrate 的数据类型,主要分为核心类型和 FRAME 类型。
  • 理解 Pallet 的 5 个结构组合:依赖、配置、事件(通知外部)、存储(内部使用的存储项目)、声明(方便外部调用)。
  • 熟悉相应的宏,它们充当了 DSL 的作用。

最后,就是掌握 Runtime 的构建,得到最终可用的 Node。至于如何与 Node 交互,只需查看对应的 client (如 polkadot.js)说明就好了,并不复杂。

Node-Template 基本结构

为了简化开发,Substrate 提供了工程模板:Node-Template。它本身是一个 cargo workspace,由三部分组成:

  • node,定义整个节点的行为、cli、对外提供的服务,它是一个二进制工程,启动文件在此。
  • runtime,自定义 Runtime,指定包含的 pallet,包括你定义的 pallet。它是一个 lib 工程。
  • pallets,包含了 pallet 模板工程,一个 lib 工程。

整个 workspace 的级别依次是: node 包含 runtime 包含 pallet。并且,你可以创建多个 pallet,启用的话,则是将其在 runtime 中引用即可。

使用 pallets/template 开发 pallet 非常直观,基本上就是按照对应位置填写对应的逻辑就行了,关于具体做法,将在后文详述。

总结

希望本文能帮你建立对于 Substrate 开发的整体印象和直观感觉,虽说 Substrate 开发有一定的门槛,但毕竟不是火箭科学,熟悉 Rust 和 Substrate 的基本概念和结构之后,具体的开发跟其他应用系统的开发没有本质区别。

最后,在下一篇文章中,会展示一个实际的例子,同时演示如何与之交互,敬请期待,?。

原文链接

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注