Substrate(1) – 配置环境和编译

Substrate(1) – 配置环境和编译

电报联系方式

前言

截止2019年12月1日,提交33476f08b3400a07fd7c69cd5bf4ad8f47f11373,substrate的README已经出现比较大的改动,所有文档集中到了substrate的官方文档中 substrate.dev。而本身对于环境的配置(linux/mac os)过程已经迁移到了脚本https://getsubstrate.io

Substrate(1) - 配置环境和编译

然而,当前配置方法已简化了许多细节,而随后的–fast执行命令实际上将 Substrate 下载到临时目录并进行编译,然后将其安装到 Cargo 命令的目录中。

环境配置

环境配置分为两个部分:

  1. 依赖库
  2. rust编译链

1. 依赖库

依赖库中包含了大部分常见的编译工具,我将重点介绍一下libssl-dev。这个库实际上用于提供 SSL 支持,在 Substrate 中,它是编译依赖,主要用于支持 Libp2p 和 WebSocket 这两个库,以提供 SSL 加密保护。对于其他 Linux 发行版(如 CentOS、Red Hat 等),你可以将其视为类似 OpenSSL 的编译依赖。

一个需要特别注意的情况是,如果你在一个 Linux 发行版的某个版本上进行编译,然后尝试在该发行版的另一个版本上运行(例如,在 Ubuntu 17.04上编译,然后将可执行文件拷贝到 Ubuntu 16.04 上),你需要格外关注 SSL 库(即libssl-dev)的动态链接依赖。举例来说,在 Ubuntu 17.04 上,默认使用的 OpenSSL 库版本可能是 1.1 或更高版本,而 Ubuntu 16.04 使用的是 OpenSSL 1.0 版本。因此,如果你将在 Ubuntu 17.04 编译的版本放到 Ubuntu 16.04 上运行,可能会遇到动态链接库不匹配的问题。

若需要在ubuntu 17.04及以上版本编译出能在16.04版本上运行的执行文件,可以在编译环境下装好执行环境对应的openssl版本,然后使用

export OPENSSL_LIB_DIR=”<you path>”
export OPENSSL_INCLUDE_DIR=”<you path>”

导出这两个环境变量,再进行编译。

rust 编译链

rust的安装简单得多,首先按照rust官网装好rust环境,确保有rustupcargo命令后:

rustup update nightly # 安装 nightly 编译链
rustup target add wasm32-unknown-unknown –toolchain nightly # 对 nightly 编译链添加 wasm 编译target

事实上,从 Rust 1.38 版本之后,Wasm 目标已经可以在稳定版中使用。然而,由于 Substrate 更改了其编译 Wasm 的方式,它在 Substrate 的代码中指定了使用 Nightly 版本来编译 Wasm。因此,在这里,如果你只为稳定版 Rust 添加wasm32-unknown-unknown目标是不够的,你必须先提供 Nightly 版本的 Rust 编译工具链,然后才能为 Nightly 版本添加 Wasm 的目标。

三 编译

首先讲substrate项目拉下来

git clone https://github.com/paritytech/substrate.git

这里建议导出一个环境变量

export WASM_BUILD_TYPE=release

在这个环境变量下编译出的wasm才是以release模式编译,否则可能影响出块。

因此进入substrate目录后

cd substrate

编译可以采用

cargo build
# 若刚才没有导出 WASM_BUILD_TYPE 可以在这里执行以下命令强制设定
# WASM_BUILD_TYPE=release cargo build

在cargo下:

cargo run — <参数> # 注意这里有两个横杆 —
# 等于
cargo build && ./target/debug/<项目执行文件> <参数>
# 而 release编译
cargo run –release — <参数>
# 等于
cargo build –release && ./target/release/<执行文件> <参数>

对于substrate而言,执行

cargo run — –dev

等于

cargo build && ./target/debug/substrate –dev

由于substrate项目编译后(cargo build)当前会在target目录下生成多个可执行文件,因此请依据自己当前的需求执行。

需要注意的几点:

  1. 确认 Wasm 是否以 Release 模式编译:您可以通过检查target/<debug/release>/wbuild/node-runtime/node_runtime.compact.wasm文件的大小来判断。如果文件大小约为 1.3MB,那么它是以 Release 模式编译的。如果文件大小超过 8MB,那么它一定是以 Debug 模式编译的。如果您发现是以 Debug 模式编译,请建议您配置适当的环境变量,并重新编译。
  2. 编译后生成的执行文件:编译完成后,会生成 4 个执行文件:
    • substrate:这是 Substrate 的节点项目执行文件,源代码位于bin/node。这是您研究 Substrate 的基本入口点,可以使用cargo run来执行该文件。
    • node-rpc-client:这个执行文件用于与 Substrate 节点进行交互,其源代码位于bin/node/rpc-client。请注意,这是用于与节点进行交互,而不是与 node-template 进行交互。
    • node-template:这是 Substrate 的精简版节点,源代码位于bin/node-template。与完整节点相比,它去除了大部分运行时模块,因此可以用于运行极简的链。
    • subkey:这是一个用于生成一些公钥和私钥的实用工具,其源代码位于bin/substrate

对于研究 Substrate,您只需要关注node项目即可。如果您不熟悉 JavaScript,还可以辅助使用node-rpc-client来发送交易等操作。

总结

鉴于 Substrate 官方的安装脚本在安装过程中隐藏了许多细节,并且没有为用户提供一些自定义选项,因此本文建议您不使用脚本安装。相反,我们将提供 Substrate 的环境配置和编译的详细过程,同时解释每个步骤的目的。这样,用户可以根据我们的解释以及自己的环境情况来进行 Substrate 的编译环境配置。

开发联系:DEXDAO

 

© 版权声明

相关文章

暂无评论

暂无评论...