风险提示:请理性看待区块链,树立正确的货币观念和投资理念,不要盲目跟风投资,本站内容不构成投资建议,请谨慎对待。 免责声明:本站所发布文章仅代表个人观点,与CoinVoice官方立场无关

Substrate 入门 - 环境配置与编译(一)

PolkaWorld
2019年12月02日

Substrate 入门 - 环境配置与编译(一)

本文经作者 金晓授权,转载自 https://zhuanlan.zhihu.com/p/94624311

substrate 目前已经趋近成熟,因此可以比较系统的对 Substrate 进行介绍。

本文首先介绍 substrate 的依赖与编译过程,以此管中窥豹了解 substrate 的概况。

因笔者的开发环境是 ubuntu/deepin/debain,因此后文命令皆基于这个环境下。

一 前言

截止目前为止(2019 年 12 月 1 日,提交 33476f08b3400a07fd7c69cd5bf4ad8f47f11373),substrate 的 README 已经出现比较大的改动,所有文档集中到了 substrate 的官方文档中:https://substrate.dev/docs/en/getting-started/。而本身对于环境的配置(linux/mac os)过程已经迁移到了脚本 https://getsubstrate.io 中,即该链接 https://substrate.dev/docs/en/getting-started/installing-substrate#unix-based-operating-systems。在这个链接中的介绍为:

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

但是现在的这种配置方式已经把很多细节隐藏了,且后续执行的命令 --fast 实际上把 substrate 下载到了一个 temp 目录中进行编译并安装到了 cargo 命令目录下,实际上并不方便想要探究 substrate 的开发者,因此本文将跳开脚本,把本身配置环境与编译的过程重新介绍。

二 环境配置

以下过程实际和脚本 https://getsubstrate.io/index.html 相同,因此若有疑问可参考脚本本身的内容。

环境配置分为两个部分:

  1. 依赖库

  2. rust 编译链

其他 linux 发行版,mac os 可以对应进行参考

1. 依赖库

    apt install -y cmake pkg-config libssl-dev git gcc build-essential git clang libclang-dev

在依赖库中大部分都是正常的编译工具,这里重点介绍一下 libssl-dev。这个库实际上就是提供 ssl 的支持,在 substrate 中用于 Libp2p 与 websocket 这两个库的编译依赖,提供 ssl 保护。因此对应于其他发行版(如 centos,redhat 等)就是提供类似 openssl 的编译依赖。

在同一发行版的不同版本上编译后需要在另一个版本上运行时(例如在 ubuntu 17.04 上编译,把执行文件拷贝到 ubuntu16.04 上),尤其需要注意这个库(ssl)的动态链接依赖。例如在 ubuntu 17.04 默认的 openssl 库使用的是 openssl 1.1 以上的版本,而 ubuntu 16.04 使用的是 openssl1.0 版本。因此把 ubuntu17.04 编译的版本放到 16.04 上会出现动态链接库不匹配的问题。

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

    export OPENSSL_LIB_DIR=""  
    export OPENSSL_INCLUDE_DIR=""

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

ps:在脚本中对于 arch 系指定的 openssl 版本是 1.0 的,因为笔者不用 arch 系的 linux,尚不可知为何 parity 团队要指定这个版本。若需要探究的话可参考到 rust-libp2p 的相应需求。

rust 编译链

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

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

这里说明:

实际上自 rust stable 1.38 之后 wasm 的这个 target 就已经可以提供给 stable 了,但是由于 substrate 改变了其编译 wasm 的方式,是在 substrate 的代码中指定了使用 nightly 编译 wasm,因此这里如果只给 stable 添加 wasm32-unknown-unknown 是没有用的,必须先提供 nightly 编译链,再对 nightly 添加 wasm 的 target。

在该版本的 substrate 中已经不需要在添加 wasm-gc 做 wasm 的压缩。(windows 的还是看到了这个命令,笔者怀疑是 substrate 的文档还没有改)

三 编译

首先讲 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//wbuild/node-runtime/node_runtime.compact.wasm 的大小,若其大小是 1.3M 左右,可确定是以 release 编译,若是 8M 以上,则一定是以 debug 编译,此时建议设置好相应环境变量重新编译。

2. 编译后的执行文件

编译后产生的执行文件有 4 个

  • substrate # 即 substrate 的 node 项目执行文件,源码位于 bin/node,研究 substrate 的基础入口,cargo run 执行的文件即为该文件

  • node-rpc-client # 与 substrate node 进行交互的 rpc 执行文件,源码位于 bin/node/rpc-client 下,注意这个和 node 交互,不是与 node-template 交互

  • node-template # 精简版的 node,源码位于 bin/node-template,与 node 相比去除了大部分 runtime 模块,可作为最精简链运行

  • subkey # 用于生成一些公私钥的工具,源码位于 bin/substrate

对于 substrate 的研究,只需要关心 node 项目即可,不擅长 js 的,可用辅助使用 node-rpc-client 用来发交易。

其他

在 substrate 的官方脚本中,后续操作还安装了 https://github.com/paritytech/substrate-up 这个项目,该项目是用来生成依托于 substrate 框架的链的一个模板生成工具。由于 substrate 更新很频繁,这个工具早已更不上变化,因此不建议安装。

总结

由于 substrate 官方的安装脚本隐藏了很多细节,且没给予用户一些选择的权利,因此本文不建议使用脚本安装,而是梳理了当前 substrate 的环境配置与编译,并解释了各个步骤的含义。因此用户可根据本文的解释结合自己的环境情况进行 substrate 的编译环境配置。

Substrate 入门 - 环境配置与编译(一)

该系列更多文章:

Substrate 设计总览(三)—— Substrate 入门参考

Substrate 设计总览 (二)

Substrate 设计总览 (一)

长按识别关注公众号,回复 “开发”领取 Substrate 开发教程合辑 / 加入开发者群

Substrate 入门 - 环境配置与编译(一)

关注 PolkaWorld

发现 Web 3.0 时代新机遇


声明:本内容为作者独立观点,不代表 CoinVoice 立场,且不构成投资建议,请谨慎对待,如需报道或加入交流群,请联系微信:VOICE-V。

评论0条