DTeam 技术日志

Doer、Delivery、Dream

开发 Substrate 的准备工作

胡键 Posted at — Jun 14, 2020 阅读

前一篇,我们对“什么是 Substrate”有了感观上的认识,但这并不足以让你可以轻松地开发出符合自己需要的区块链。开发 Substrate 区块链应用也并非一个低门槛的工作,缺乏必备的知识将让人一头雾水摸不着头脑。

鉴于此,本文将作为一篇“过渡文章”,谈谈开发前的准备工作。至于实际的开发示例,将放在本系列的第三篇。

总的来讲,本文的内容将分为三部分:

需要了解的 Rust 知识

开发 Substrate 应用, Rust 是开发人员必须迈过的第一道坎。然而,Rust 的学习曲线陡峭,入门并不简单,这里我稍稍整理了一下知识脉络,希望能减少大家的障碍。

对于 IDE,我建议大家不要把时间浪费在这个上面去做各种比较,先选择一个还不错的直接开始上手编写代码。我们的目标是尽快掌握 Rust 开发,不是去做工具的评测。本文推荐:vscode + rust 插件。如果你喜欢 IntelliJ IDEA,它同样也有 rust 插件。

同时,熟悉 Cargo,最好在写完 Rust 版 “Hello World!”后就尝试用 Cargo 去编译和构建。 必须要掌握的命令:

对于每一个 Rust 工程,典型的过程如下:

典型的 cargo 工程的目录组织如下图(摘自这里),并且也请重点理解一下 cargo workspace 的概念。

cargo-project

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

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

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

borrow and ownership

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

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

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

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

开发 Substrate 必备的基本概念

前文说过,Substrate 可被视为区块链世界的 Spring Boot。既然如此,其文档就有必要至少通读一遍。话虽如此,但读文档并不是一件让人心情特别愉悦的事情,这里我列出主要纲要,希望能帮助各位快速建立全局概念,以便在读文档时可以更有针对性。

Substrate 的主要概念:

offchain worker

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

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

FRAME and Runtime

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

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

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

Node-Template 基本结构

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

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

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

总结

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

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


相关文章