使用 Substrate 搭建一条能跨链的区块链

SubstratePolkadot 项目推出的区块链构建框架。通过使用 Substrate,使普通的软件开发人员可以在短时间内建立一条属于自己的完整区块链,开发者只需要关注自己的业务逻辑,从底层复杂的技术中解放出来。

为什么使用区块链

比特币网络作为最早的区块链网络,已经存在了十年时间。在今天,区块链技术还没有像互联网那样深刻地改变着我们每个人的生活,但是它的优势已经在一些行业和领域展现出来,比如国际支付、金融衍生品交易、预测市场、去中心化自治组织等。

区块链或者更准确的说是去中心账本,相对于传统互联网行业有其天生的优势,比如:

  • 永不离线 – 安全的公有链又全球数以万计的计算机节点共同维护,理论上讲只要还有一个节点可供访问,数据就不会丢失。
  • 开源审查 – 绝大部分区块链应用的代码都是开源的,供全世界的开发人员审查,除了能够提升代码质量,开源运动更为深远的意义在于通过分享促进着人类社会的进步。
  • 数据加密 – 密码学技术是去中心账本的基石,保证数据不被篡改,让数据更加安全。
  • 保护隐私 – 每一个用户都是链上的一个账户,而账户的所有信息完全由掌握账户所对应私钥的用户控制着,除非用户自己公开或者交易数据,否则数据不会泄露。
  • 分享权益 – 用户可以通过参与到区块链的安全运转机制中,获取到原本只有中心化的企业才能拿到的权益。

随着区块链技术的不断演进,交易成本、确认时间、能源消耗、安全性、互通性都得到了极大地提升,传统互联网企业在相同的产业领域将面临着具有以上所说优势的区块链企业的挑战。

现在处在优势地位的传统互联网” 独角兽”,如果依靠区块链技术成功转型,能够确保在未来不会被轻易淘汰;

处于劣势地位的小企业或者小团队,通过在链上实现业务,可以达到” 四两拨千斤” 的竞争优势。

然而区块链的开发依赖多学科的知识技能,比如密码学、高效点对点网络、软件工程、经济学模型等等,小团队甚至是大企业都很难具备这样的人才资源,对于” 上链” 大多数人都是心有余而力不足。Substrate 的出现就是为了解决这个问题。

什么是 Substrate

Substrate 是由德国 Parity 公司推出的一个区块链构建框架。它实现了区块链开发领域中所遇到的大部分通用功能,比如点对点网络连接,可配置的共识算法,常用加密算法,数据库存储,交易管理等。通过使用 Substrate,使普通的软件开发人员可以在短时间内建立一条属于自己的完整区块链,开发者只需要关注自己的业务逻辑,从底层复杂的技术中解放出来。

使用 Substrate 构建的区块链,有一个额外的好处,就是可以轻易地连接到 Parity 的 Polkadot 公链网络,这一网络具有很多优势,比如跨链交易共享安全等。

Substrate 是由 Rust 语言开发,而 Rust 最为一门高级静态编程语言,具有诸多优势,如内存安全、类型检查、支持编译为 WASM、函数式友好、社区资料完善等优点。通过借助 Rust 的优良特性,也使得 Substrate 的性能优良、可读性高。

你也可以参考 Substrate 官方参考文档来了解更多。

下面,进入今天我们的主要任务,使用 Substrate 来构建一条本地的测试区块链网络。

搭建区块链

通过这一节,你会学到:

  • 如何创建和编译节点程序
  • 如何启动节点程序及各项参数配置
  • 不同的节点网络有什么区别
  • 如何修改 chainspec 文件

准备环境

  • Mac OS 或者 Linux 计算机
  • Git

创建和编译节点程序

方式一

  1. 安装依赖工具,如 Rust 环境、openssl、cmake、 llvm 库:
1
curl https://getsubstrate.io -sSf | bash

如果感兴趣上面脚本的具体执行内容,可以参考这里。由于国内网络原因,以上脚本可能会下载失败或者过慢,参考下面的方法配置国内的 Rust 仓库镜像进行下载。

1
2
3
4
5
6
7
git clone https://github.com/kaichaosun/getsubstrate-cn

cd substrate-cn

cp config ~/.cargo/config

./getsubstrate
  1. 新建节点程序,使用命令行导航至你想要放置节点程序的目录,执行:
1
substrate-node-new substrate-demo-node someone

你也可以替换 substrate-demo-node 为你想要的节点程序名,替换 someone 为你自己的名字。等待命令执行完后,一个属于自己的节点程序就完成了。

注:substrate-node-new 命令会帮你拷贝 substrate 模板节点程序、初始化 WASM 的构建环境、编译 Rust 代码为 WASM 等,具体内容参考链接

如果发生了代码改动,就需要重新编译。

首先,编译 Rust 代码为 WASM:

1
./build.sh

之后,编译生成可执行程序:

1
cargo build --release

可执行程序被放为 target/release/template-node

方式二

另外一种创建节点的方式是通过拷贝 substrate 的 Git 源码,编译 node-template:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git clone https://github.com/paritytech/substrate

git checkout -b v1.0

cd substrate

cd node-template

# 初始化WASM的构建环境
./scripts/init.sh

# 编译Rust代码为WASM
./scripts/build.sh

# 生成可执行程序
cargo build --release

这种方式适合对 substrate 源码有一定了解的人,如果是初学者,建议用上面第一种方式

本地开发网络

首先清空节点数据库:

1
./target/release/template-node purge-chain --dev

然后启动节点程序:

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

--dev 表示我们准备启动一个本地开发链,会自动初始化开发环境所需的数据和配置。

如果出现了类似下图所示地内容,那恭喜你成功创建了一条本地开发链。

dev_node

现在你可以访问 https://substrate-ui.parity.io,选择 Settings,将 remote node 设置为 Local Node (127.0.0.1:9944),如下图所示:

ui_local_node

选择 Explorer,就能够看到最新的区块在不断产生。

下面,我们来发送一笔交易,选择 Extrinsics,submit the following extrinsic 选择为 balances transfer(dest, value)dest: Address 选择为 BOBvalue: Compact<Balance> 设置为你想转账的金额,之后点击 Submit Transaction,几秒钟之后会弹出交易成功的提示,这个时候你可以看到 Alice 的金额减少了,当切换 using the selected account 为 Bob 之后,可以看到他的金额增加。

接下来请你要独立地尝试这个页面上的不同功能,不用担心把辛苦搭建的链玩坏,这也是 Substrate 的一个好处,可以快速清理垃圾数据。

本地多节点测试网络

这里我们使用本地测试网络内置的账户,首先启动 Alice 节点:

1
2
3
4
5
6
7
8
./target/release/template-node \
  --base-path /tmp/alice \
  --chain=local \
  --key //Alice \
  --port 30333 \
  --telemetry-url ws://telemetry.polkadot.io:1024 \
  --validator \
  --name AlicesNode

命令行参数的涵义如下:

  • --base-path /tmp/alice:节点数据所存储的位置
  • --chain=local:指定了节点所处的网络类型,这里 local 表示本地测试网络,dev 表示本地开发,staging表示公开测试网络
  • --key //Alice:模块节点程序启动时需要私钥,这里我们用了预置的 Alice 用户私钥
  • --port 30333:指定 p2p 协议的 TCP 端口
  • --telemetry-url ws://telemetry.polkadot.io:1024:将节点的监控数据发送到指定的监控服务器
  • --validator:启用 validator 模式,参与区块生产
  • --name AlicesNode:指定节点名

命令执行之后,应该能看到以下启动信息:

alice_node

打开一个新的命令行窗口,启动 Bob 节点:

1
2
3
4
5
6
7
8
9
./target/release/template-node \
  --base-path /tmp/bob \
  --chain=local \
  --key //Bob \
  --port 30334 \
  --telemetry-url ws://telemetry.polkadot.io:1024 \
  --validator \
  --name BobsNode \
  --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/QmRhEhiX8QHVW87wKCTp3qKyY1X21ycKXKdDBrqSR74NWx

这里,我们为 Bob 节点指定了不同的数据存储路径、p2p 端口等,--bootnodes 指明了依赖的启动节点信息,这里使用了 Alice 节点作为启动节点,30333 为 Alice 节点的端口,QmRhEhiX8QHVW87wKCTp3qKyY1X21ycKXKdDBrqSR74NWx为 Alice 的节点 ID。

如果一切正常,你应该能够看到:

1
Idle (1 peers), best: #2 (0x5155…5b72), finalized #0 (0x146f…317f), ⬇ 24 B/s ⬆ 0.1kiB/s

表示 Bob 节点连接到 Alice 节点上了 (1 peers),并且新产生的区块没有最终确定 finalized #0 (0x146f…317f),这是因为模块节点程序没有最终确定性这一功能,想要了解更多,请查看官方文档或者留意我的后续文章。

然后,和之前的方式相同,在浏览器访问区块的信息。

使用新账户启动本地测试网络

生成新账户

如果我们不想用预置的 Alice 和 Bob 账户启动网络,就需要执行 subkey -e generate 命令生成新账户,生成的内容包含私钥 seed,公钥 public key 和交易地址 Address:

账户 1:

1
2
3
4
Phrase `gas ride shoe victory oil young music trend kingdom rookie south harbor` is account:
  Seed: 0x9aaae371d50d1109fee8595398e54a86f6c79b116ba1894e8207f503708f7d0f
  Public key (hex): 0xcc706bd768a54054ac70b3f5568d0103e0f70a2f878e37949e125dd7456ee180
  Address (SS58): 5Ggm2DMCG1LRcXUjGE6toVmyHKVSNutzSbUrvQv5gbr5BC6S

账户 2:

1
2
3
4
Phrase `real during evidence worry mountain plastic depth desert actress infant age pill` is account:
  Seed: 0x16208851b59f7c6a383a70342fa0893169c7c3190c543d44bd42833f61e54a56
  Public key (hex): 0xd6147f4bbb0eeb925e61b31fbed45ab1e3c45fed8d36ce4161c99956dfdf8f9b
  Address (SS58): 5GuQCAzXM5xcJfEinUgWnB7PFn2ZGhQfAKAdGRhacRHsXWE9

将生成的内容安全地保存起来,通过分享地址给其它节点,实现 p2p 的连接。

注:如果没有 subkey 命令,需要到 substrate 源码目录下重新编译生成 cargo install --force --path subkey subkey

构造 chainspec 文件

Substrate 区块链的初始启动信息在 chainspec 的 json 文件中维护着,首先生成一个 local 测试网络的 chainspec:

1
./target/release/template-node build-spec --chain=local > localspec.json

编辑 localspec.json,修改 authorities 为新生成用户的地址,其它不用修改:

1
2
3
4
5
6
7
"consensus": {
 "authorities": [
  "5Ggm2DMCG1LRcXUjGE6toVmyHKVSNutzSbUrvQv5gbr5BC6S",
  "5GuQCAzXM5xcJfEinUgWnB7PFn2ZGhQfAKAdGRhacRHsXWE9"
 ],
 "code": "0x0061736d01000000018b011660027..."
}

修改完后,转换 chainspec 为原始格式,区别是原始格式的 chainspec 中所有的字段名都用十六进制进行了编码:

1
./target/release/template-node build-spec --chain localspec.json --raw > customspec.json

启动节点

启动账户 1 的节点:

1
2
3
4
5
6
7
8
./target/release/template-node \
  --base-path /tmp/account1 \
  --chain ./customspec.json \
  --key 0x9aaae371d50d1109fee8595398e54a86f6c79b116ba1894e8207f503708f7d0f \
  --port 30333 \
  --telemetry-url ws://telemetry.polkadot.io:1024 \
  --validator \
  --name Account1Node

这里,--chain ./customspec.json 是启动区块链所需的 chainspec 文件。

启动账户 2 的几点:

1
2
3
4
5
6
7
8
9
./target/release/template-node \
  --base-path /tmp/account2 \
  --chain ./customspec.json \
  --key 0x16208851b59f7c6a383a70342fa0893169c7c3190c543d44bd42833f61e54a56 \
  --port 30334 \
  --telemetry-url ws://telemetry.polkadot.io:1024 \
  --validator \
  --name Account2Node \
  --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/5Ggm2DMCG1LRcXUjGE6toVmyHKVSNutzSbUrvQv5gbr5BC6S

这时候你已经拥有了属于自己的第一条区块链!

总结

恭喜你,完成了 substrate 搭建区块链的第一堂课,我们回顾一下学到的内容,包括安装 substrate 的依赖环境,创建和编译节点程序,启动测试网络,修改 chainspec 等等。社区提供了很多的资料供参考,也可以关注知乎专栏《Substrate 区块链开发》

参考资料

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享