本节来演示如何编译 Nervos ckb https://github.com/nervosnetwork/ckb 。操作系统是 Ubuntu16.04 。操作步骤基本上是按照官方 README https://github.com/nervosnetwork/ckb/blob/develop/README.md 中的说明,我自己踩了一个小坑,就是关于编译头文件的。我写的内容的意义是对每一步进行说明。不过,读懂本文还是最好要有一点 Linux 命令行,以及编译程序的经验的。

系统准备

首先要有一台 Ubuntu 16.04 系统。

如果你手头没有 Linux 机器,可以去 aliyun 上申请一个计时收费的 ECS 服务器,我就是这么干的。

申请好之后,以 root 身份登录上去。

adduser peter --ingroup sudo

创建一个可以行使超级用户权限的普通用户 peter 。后续操作后会以 peter 的身份来执行。

这就是系统的基本情况了,一个全裸的 Ubuntu 。

编译准备

编译之前,首先要下载代码,然后安装一些必要的依赖。

因为要从 github 上把代码 clone 下来,所以需要先安装 git 。

sudo apt-get update
sudo apt-get install git

首先 sudo ,以超级用户身份更新一下系统软件包仓库的列表,否则安装包的时候会报错。接下来就可以安装 git 了。

接下来 clone 项目。

git clone https://github.com/nervosnetwork/ckb.git

这里使用的仓库地址是 https 的,使用 git@ 打头的 ssh 协议的地址会有权限问题,估计跟没有添加公钥到 Github.com 有关,不过咱们不用管。

ckb 是一个 rust 语言项目。下面安装 rust 的编译环境。

curl https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env

参考 rust 的安装说明 https://www.rust-lang.org/zh-CN/install.html 。安装一下 rust 。安装好之后,需要通过 source 命令执行一些脚本内容,这样才能在当前命令行中找到 rustc 命令。

$ rustc --version

如果能正确的显示版本号,证明安装成功了。这样后续要使用的 cargo 命令也都一并安装好了。关于 rust 的基础知识,可以参考之前我写的 《 Hello Rust 》那篇的内容 http://haoduoshipin.com/videos/322 。

下面进入项目,根据官网 README 的说明,做一些设置。

cd ckb
rustup override set 1.29.2
rustup component add rustfmt-preview
rustup component add clippy-preview

编译器版本调整了一下,然后添加了两个需要的组件进来。

sudo apt-get install git autoconf flex bison texinfo libtool pkg-config libssl-dev libclang-dev

下面通过 apt-get 命令,安装一些 ubuntu 系统包,基本都是编译的依赖。

编译并解决报错

下面来执行编译。解决一下我说的那个坑。

下面就来编译一下。

cargo build --release

出错了。

...
rocksdb/include/rocksdb/c.h:68:10: fatal error: 'stdarg.h' file not found, err: true
...

缺少 stdarg.h 这样的编译头文件。

官方 README 上说让执行这两步。基本的意思是系统上其实是有头文件的,只是编译的时候没有找到,所以到 /user/include 之下,作一下符号链接就能够找到了。

sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/7/include/stdarg.h /usr/include/stdarg.h
sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/7/include/stddef.h /usr/include/stddef.h

不过在 16.04 系统上 7 这个路径根本不存在。

所以需要执行

sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h /usr/include/stdarg.h
sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h /usr/include/stddef.h

再次

cargo build --release

没有报错了。

target/release/ckb run

项目顶级位置,执行 run 命令,启动 ckb 。输出中看到

0.0.0.0:8114

启动到了本地的 8114 端口。

现在的一个问题是,如何去调用 ckb 。这需要我们有两个命令行终端。所以我们来安装 tmux 。注意,只有想我这样再远端服务器上操作,安装 tmux 才有意义,包括可以方便的打开多个终端,已经在退出登录后继续维持进程不死,而如果是在本地安装的 Ubuntu ,那么直接手动打开两个终端就好了,用不着 tmux 。

Ctrl-C 先停下当前的 ckb 进程。

sudo apt-get tmux

安装 tmux 。

执行

tmux

打开的 tmux 会话中,运行 target/release/ckb run

执行 Ctrl-b c 新建一个 tmux 会话,运行下面的 curl 命令,来调用 cbk 的 rpc 接口。

curl -d '{"id": 1, "jsonrpc": "2.0", "method":"get_tip_header","params": []}' \
  -H 'content-type:application/json' 'http://localhost:8114'

可以得到正确的输出,表示 ckb 运行正常。

要退出 tmux ,可以先 Ctrl-c 停下运行的进程,然后 Ctrl-d 关掉当前 tmux 会话,所有的会话都关闭之后,tmux 就退出了。

这样,我们就成功编译了 ckb ,并尝试调用了它的 rpc 接口。

总结

这节关于如何编译 Nervos ckb ,内容就到这里了。主要的知识点有:如何安装 Ubuntu 的包,如何安装各种编译依赖,如何通过 tmux 在服务器上开启多个终端。

参考: