[教程] 创建第一条 Substrate 链

Substrate 入门教程

翻译自官方文档: https://substrate.dev/docs/en/tutorials/create-your-first-substrate-chain/

入门

在本教程中,主要学习编译和启动预先编写好的Substrate链,并使用该链作为一种加密货币,并使用通用的Substrate 前端交互界面与链进行交互。

教程目标是让之前从未接触过Substrate读者,在经过学些之后对Substrate有基本了解。 这里暂时不会去深入介绍如何在Substrate上进行开发,但希望能满足大家对Substrate的好奇心,以便你可以继续这一旅程。

本教程将需要大约1小时来完成。 我们将编译rust代码,你不需要是一名rust的程序员也可以完成此教程。 我们会提供代码并解释如何使用它。

我们仅仅期望:

  • 你熟悉软件开发以及使用终端(terminal)。
  • 你熟悉区块链和智能合约平台。
  • 你愿意了解区块链前沿开发技术。

如果你在本教程中遇到问题,我们会在为你提供帮助!可以来这里提ISSUE

需要做什么

在开始之前,让我们列出在本教程中需要做的事情。 我们会:

  1. 搭建开发环境以便能够在Substrate上进行开发。

  2. 使用模板项目以便运行Substrate。

  3. 使用 Substrate 前端交互界面与我们的区块链进行交互。

  4. 在用户帐户之间转移Token。

好,那就开始吧!

搭建开发环境

通常,应该先了解更多有关Substrate区块链开发框架的背景知识,但是,进行Substrate开发的环境搭建需要一段不小的时间。

为了节约你的时间,我们将先帮助你搭建环境。 在下一节中(此时正在编译中),再来了解有关Substrate和我们正在构建内容的更多背景知识。

环境依赖

要在Substrate上进行开发,需要先安装一些依赖才能建立好开发环境。

环境搭建可能是本教程中最难的部分,请不要因此灰心。

译者注:我之前有过一篇专门的文章介绍在国内环境下安装Substrate开发环境, 可千万查看。

Substrate 开发

如果你使用的是基于Unix的计算机(如Linux,MacOS),我们创建了一个简单脚本来安装所有这些依赖:

curl https://getsubstrate.io -sSf | bash -s -- --fast

如果在运行此脚本之前没有安装Rust,请确保在继续操作之前按脚本输出最后一行给出的命令重启终端。

了解脚本做了什么。

你可以通过在浏览器中访问 https://getsubstrate.io来查看此脚本的源代码。

它会自动安装:

如果你使用的是Windows并且没有Windows Subsystem for Linux, 这个过程会比较困难,但是 这里有充分的说明文档。

编译 Substrate

安装好必备组件后,就可以为我们的项目搭建框架了。 Substrate节点模板(Substrate Node Template)是在Substrate上开发的良好起点。

  1. 克隆 Substrate Node Template (版本 v2.0.0-rc4).

    git clone -b v2.0.0-rc4 --depth 1 https://github.com/substrate-developer-hub/substrate-node-template
  2. 初始化你的WebAssembly构建环境

    # Load settings into the current shell script if you can't use rustup command
    # If you've run this before, you don't need to run it again. But doing so is harmless.
    source ~/.cargo/env
    
    # Update Rust
    rustup update nightly
    rustup update stable
    
    # Add Wasm target
    rustup target add wasm32-unknown-unknown --toolchain nightly
  3. 为你的工作创建一个分支并编译Substrate节点程序

    cd substrate-node-template/
    git checkout -b my-first-substrate-chain
    cargo build --release

根据你的电脑硬件性能,最终编译可能最多需要25分钟。 因此,不要等待,直接进入下一步。

前端依赖

为了与你的节点进行交互,需要运行Substrate Developer Hub 前端模板的本地实例,需要在计算机上安装好Node.js

可以使用节点编译的时间安装这些依赖项。

背景知识

在本节中,我们将了解有关Substrate区块链开发框架的基础知识。

当前正在编译的节点模板( Node Template)正是基于此开发框架构建的。

区块链基础

区块链开发很难。

区块链网络由单独的节点组成,这些节点在点对点(P2P)网络上连接在一起。 节点是区块链网络上相互独立运行的计算机。

为了完成功能,节点需要:

  • 一个数据库
  • P2P 网络
  • 共识引擎
  • 处理交易
  • 状态转换函数
  • 以及其他...

这些技术涉及领域很广,因此通常需要专家团队来开发。 因此,大多数区块链项目都不是从头开始开发的。 相反,这些项目是从现有的区块链代码库中分叉而来。 例如:

  • 莱特币(Litecoin), ZCash, Namecoin, Bitcoin Cash 等等是基于比特币库(Bitcoin)分叉而来;
  • Quorum, POA Network, KodakCoin, Musicoin 等等是基于以太坊库分叉而来。

区块链项目分叉

以这种方式构建区块链存在严重的局限性,因为这些现有平台在设计时并未把修改考虑进去。

Substrate

Substrate是一个用于构建区块链的开源模块化以及可扩展 的框架。

Substrate 是重新设计的一套可灵活构建下一代区块链网络的框架。 它提供了构建自定义区块链节点所需的所有核心组件。

节点模板(Substrate Node Template)

我们以Node Template的形式提供了一个开箱即用的基于Substrate的节点,此时应该正在编译。 无需进行任何更改,你和朋友就可以共享此节点模板创建具有加密货币和所有功能的区块链网络!

我们将教你如何在“开发”模式下使用该节点,该模式使你可以在单个节点上运行网络,并拥有一些预先配置资金的用户帐户。

与节点交互

现在,Substrate模板节点应该已完成编译,让我们向你展示一切是如何工作的。

启动节点

运行以下命令以启动节点:

# purge-chain 用来清除之前 dev 模式运行的老数据(如果有)
# 根据提示输入 y 
./target/release/node-template purge-chain --dev

# 在“开发”模式下启动实际的节点
./target/release/node-template --dev

如果你的节点运行成功,你应该看到类似以下内容的信息:

$ ./target/release/node-template --dev

2020-06-26 10:10:00 Running in --dev mode, RPC CORS has been disabled.
2020-06-26 10:10:00 Substrate Node
2020-06-26 10:10:00 ✌️  version 2.0.0-rc4-a704d36-x86_64-linux-gnu
2020-06-26 10:10:00 ❤️  by Substrate DevHub <https://github.com/substrate-developer-hub>, 2017-2020
2020-06-26 10:10:00 ? Chain specification: Development
2020-06-26 10:10:00 ?  Node name: bright-selection-0878
2020-06-26 10:10:00 ? Role: AUTHORITY
2020-06-26 10:10:00 ? Database: RocksDb at /home/dan/.local/share/node-template/chains/dev/db
2020-06-26 10:10:00 ⛓  Native runtime: node-template-1 (node-template-1.tx1.au1)
2020-06-26 10:10:00 ? Initializing Genesis block/state (state: 0xc478…295b, header-hash: 0x15b6…47b5)
2020-06-26 10:10:00 ? Loading GRANDPA authority set from genesis on what appears to be first startup.
2020-06-26 10:10:00 ⏱  Loaded block-time = 6000 milliseconds from genesis on first-launch
2020-06-26 10:10:00 ? Highest known block at #0
2020-06-26 10:10:00 Using default protocol ID "sup" because none is configured in the chain specs
2020-06-26 10:10:00 ?  Local node identity is: 12D3KooWMaPpCv7hp7wArmG6cAuyz8HXqD88zKNvVQ34CoCJsXmX (legacy representation: QmfHEbdmVZHCBwKJFvczRt5owAzEbtF7Ao7oPQLvBq645c)
2020-06-26 10:10:00 〽️ Prometheus server started at 127.0.0.1:9615
2020-06-26 10:10:05 ? Idle (0 peers), best: #0 (0x15b6…47b5), finalized #0 (0x15b6…47b5), ⬇ 0 ⬆ 0
2020-06-26 10:10:06 ? Starting consensus session on top of parent 0x15b647de5cf3ec3b4e15159edf28345346fc29d3c646c509e6b8337b6c9b47b5
2020-06-26 10:10:06 ? Prepared block for proposing at 1 [hash: 0xf9b9cd1226bcbce4ef3f8802f9af1746d0243c471600bf2bec38e1c436ac9cd8; parent_hash: 0x15b6…47b5; extrinsics (1): [0xe7b0…f430]]
2020-06-26 10:10:06 ? Pre-sealed block for proposal at 1. Hash now 0x9a3af41c7e2d693c24245926d85dac96e09a1bef56d2faf254bc06d6b7d1192f, previously 0xf9b9cd1226bcbce4ef3f8802f9af1746d0243c471600bf2bec38e1c436ac9cd8.
2020-06-26 10:10:06 ✨ Imported #1 (0x9a3a…192f)
2020-06-26 10:10:10 ? Idle (0 peers), best: #1 (0x9a3a…192f), finalized #0 (0x15b6…47b5), ⬇ 0 ⬆ 0
2020-06-26 10:10:12 ? Starting consensus session on top of parent 0x9a3af41c7e2d693c24245926d85dac96e09a1bef56d2faf254bc06d6b7d1192f
2020-06-26 10:10:12 ? Prepared block for proposing at 2 [hash: 0xac145cc0decaa0a574fd9e821a4d762e87491cff113659820f51af0f307870df; parent_hash: 0x9a3a…192f; extrinsics (1): [0x297c…9092]]
2020-06-26 10:10:12 ? Pre-sealed block for proposal at 2. Hash now 0x618c767c01a4e2fff92c04f8b581da5652595330a479e927bf1ee68c1295d0d7, previously 0xac145cc0decaa0a574fd9e821a4d762e87491cff113659820f51af0f307870df.
2020-06-26 10:10:12 ✨ Imported #2 (0x618c…d0d7)
2020-06-26 10:10:15 ? Idle (0 peers), best: #2 (0x618c…d0d7), finalized #0 (0x15b6…47b5), ⬇ 0 ⬆ 0
2020-06-26 10:10:18 ? Starting consensus session on top of parent 0x618c767c01a4e2fff92c04f8b581da5652595330a479e927bf1ee68c1295d0d7
2020-06-26 10:10:18 ? Prepared block for proposing at 3 [hash: 0x5b21914d18523cbba295002b913e352ee7abb4e3cf670c202a701b83aa35b435; parent_hash: 0x618c…d0d7; extrinsics (1): [0x4c52…ea51]]
2020-06-26 10:10:18 ? Pre-sealed block for proposal at 3. Hash now 0xf6471c2e33e6d456d1ae2bd3feeb7de813dddecb8927d5b0c753cb38f2225c2d, previously 0x5b21914d18523cbba295002b913e352ee7abb4e3cf670c202a701b83aa35b435.
2020-06-26 10:10:18 ✨ Imported #3 (0xf647…5c2d)
2020-06-26 10:10:20 ? Idle (0 peers), best: #3 (0xf647…5c2d), finalized #1 (0x9a3a…192f), ⬇ 0 ⬆ 0

如果finalized:之后的数字在增加,则你的区块链正在产生新的区块并且状态达成了共识!

启动前端

为了与本地节点进行交互,我们将使用Substrate Developer Hub前端模板,这是一套UI组件,这些组件在设计时考虑了常见的交互场景。

要使用前端模板,需要先克隆库代码并按照指引步骤在本地运行

交互

在运行前端模板并将其加载到浏览器中的 http://localhost:8000/后,请花点时间探索下这个前端组件。 在顶部,你将找到许多所连接链的相关信息,以及一个帐户选择列表,在这里可以选择用于执行链上操作的帐户。

链状态及帐户选择列表

这里也列出了可以使用的已知的测试账号,诸如 Alice 和 Bob 账号都是已经带有资金。

账号列表

账户表下方有一个转账组件,你可以使用该组件将资金从一个账户转移到另一个账户。 记下前端模板描述精度的信息框; 你应该至少转移1000000000000以方便观察到余额的变化。

转账

请注意,帐户表是动态的,并且在处理转帐后会立即更新帐户余额。

Runtime元数据(Metadata)

译者注:元数据(Metadata), 是一种描述数据的数据(data about data)。

前端模板提供了许多有用的功能,在连接到本地开发节点时应该探索下所有这些功能。 一种入门好方法是点击模板页面顶部的“Show Metadata(显示元数据)”按钮并查看运行时发布的元数据

元数据 JSON

Pallet Interactor及事件

你可以使用Runtime元数据探索运行时的功能。 前端模板提供了一个有用的Pallet Interactor组件,该组件提供了几种与Substrate Runtime进行交互的机制。

Pallet Interactor & Events

是Runtime 的可调用函数;如果你已经熟悉区块链概念,可以将其视作为交易。 Pallet Interactor 允许你提交 无签名(unsigned)具签名(signed) d的交易并且提供了一个按钮通过超级权限(sudo)来触发交易。

你可以选择Query(查询)来读取Runtime存储中保存的值。 RPC和Constant选项则是与Runtime交互提供的其他机制。

像许多区块链一样,Substrate链使用事件来报告异步操作的结果。 如果你已经使用前端模板执行转账,则应该在Pallet Interactor旁边的“事件(Event)”组件中可以看到Tranfer事件。

接下来

到这里,使用Substrate启动第一个区块链就完成了。

你已经启动了可工作的基于Substrate的区块链,并且用户界面连接到该链了,用户之间进行Token转移。 希望你继续学习Substrate。

下一步,你也许想:

如果你在本教程中遇到任何问题或想提供反馈,请随时提交GitHub issue或在 Riot上联系我们。

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2020-07-16 19:18
  • 阅读 ( 391 )
  • 学分 ( 105 )
  • 分类:Polkadot

0 条评论

请先 登录 后评论
Tiny熊
Tiny熊

布道者

120 篇文章, 32583 学分