在Mac上编译部署CITA链

  • 0.引子
  • 最近发现Nervos AppChain的技术框架很有创意,于是准备一探究竟。
  • 官网文档提供了【部署一条AppChain】的四种方法,见 https://docs.nervos.org/Nervos-AppChain-Docs/#/quick-start/deploy-appchain ,在我看来,直接使用测试链和使用万云Baas是一个意思,就是现成有个节点,直接通过它来部署合约什么的就好,这种体验是无感的,不是我想要的;至于华为云的云端部署,我找了半天也没找到部署的地方,而且看演示截图是要收费的,呃,还是算了吧!
  • 于是,决定【自行部署】,一开始文档链接还有点小问题,后在吕老师的帮助下,到达了【快速入门】页,也就是自行部署CITA链的文档页,即 https://docs.nervos.org/cita/#/chain/getting_started
  • 我也是最近才用上Mac(一个GPU是N卡的Macbook Pro,想想有多久了,不过内存16G、CPU是i7的,估计也是当年的顶配了吧),所以,我几乎是个Mac小白,这个OS上很多基础的东西都在摸索,所以也适合把自己的经历写成小白教程。
  • 1.Docker和加速器
  • 要编译部署CITA,首先要安装Docker,Mac跟linux系统里不同,Docker是要下载安装的,所以我们到这个网站https://store.docker.com/editions/community/docker-ce-desktop-mac 下载CE即社区免费版,要注册后才能下载。(如果不想注册,可以试试这个链接是否能直接下载 https://download.docker.com/mac/stable/Docker.dmg ,然而,即便可以下载安装,使用过程中依然是需要登录的,呵呵)。下载后,跟Mac中别的软件一样,安装启动它就好(启动后,右上角就有个一个鲸鱼小图标了)。(再多说一句,Mac版本的Docker自带docker-compose,不用再额外安装了,这个可能与本文主题无关,不过以后搞EOS的时候就是必要的了。)
  • 接着,我们从docker官网pull镜像,命令 docker pull cita/cita-build ,然而,国内的“网速”呵呵,于是乎,办法是,用daocloud加速器,具体方法是: 到这个网站注册 https://www.daocloud.io ,然后参看这里 https://www.daocloud.io/mirror#accelerator-doc ,进行配置:点右上角的鲸鱼小图标,下拉菜单中点【Preferences】,在弹出窗口中选【Daemon】选项卡,在【Registry mirrors】中点【+】,把你的加速地址复制粘贴进去(我的是 http://e106196b.m.daocloud.io ),然后点【Apply & Restart】按钮让设置生效,重启过程中,鲸鱼图标会动起来,大概20秒时间,鲸鱼图标处于静止状态后,就算重启成功了。
  • 再次运行命令 docker pull cita/cita-build ,健步如飞!
  • 2.Git和无障碍上网
  • 接下来我们按照官网文档继续,下载github上的CITA源码:
  • git clone https://github.com/cryptape/cita.git
  • 这里我就遇到问题了,众所周知的“网速”问题,老是失败!只能祭出神器ShadowsocksX-NG,很长一段时间,我都只能在浏览器中无障碍上网,但在命令行(终端)中,不知道怎么设置,试过很多方法都没有搞定。现在我知道怎么让ShadowsocksX-NG的效果在命令行中实现了,就是点右上角ShadowsocksX-NG图标(我是1.7.1版本),在弹出菜单中点【Copy HTTP Proxy Shell Export Line】,然后提示Export命令已经复制,接着到命令行中粘贴,那么这一个命令行就具备了无障碍上网能力了(可以试一下curl ip.cn命令,看看是不是已经出国了)!(可以把Export配置到系统文件中,不过我没有这样做,毕竟只是低频使用。)
  • 在实现无障碍的命令行中执行:
  • git clone https://github.com/cryptape/cita.git
  • cd cita
  • git submodule init
  • git submodule update
  • 速度突然快得让人怀疑人生……不想多说了。
  • 3.make编译
  • 接下来
  • ./env.sh make release
  • (我按照官方文档的顺序,先 ./env.sh make debug 总是出现错误,以前在ubuntu上编译出现过此类错误,大致原因是内存不够,不过现在本机是16G内存,应该没那么夸张吧,况且我搜了一圈,也没找到有调整Mac上虚拟内存的办法。看到有个博客说,debug消耗的资源比release多很多,所以总失败,直接运行release就好了,没想到却是如他所说,直接release就成功了。)
  • 其实,补充一点,是在编译成功后一段时间我才顿悟,这编译是发生在Docker虚拟机里面的,应该是虚拟机的内存不够,而不是宿主机的内存,所以赶快去Docker下拉菜单中点【Preferences】进入【Advanced】查看,果然内存才2G、swap交换空间才1G。所以如果以后遇到编译失败,可以调整Docker占用的内存,也可以./env.sh进入容器实例中,用ubuntu上调整swap交换分区的命令增加大小。这两项没试过,只是解决问题的思路。
  • 如果在运行后提出错误,说某个目录没有访问权限,那就到Docker下拉菜单中点【Preferences】进入【File Sharing】当中添加这个目录。
  • 这个make开始时,会自动先docker pull对应版本的CITA镜像(不一定是之前docker pull的那版),并运行起来。
  • 这个make过程中,要下载一些github上的东西,比如rust-lang/crates.io-index,还要下载一系列的编译工具,所以为避免失败,最好在开启了无障碍上网模式的命令行中运行。
  • 值得一说的是,根据文档看出来 ./env.sh ,这个脚本就是调用docker中CITA镜像的工具,所有以此脚本开头的命令,实际上就是在操作Docker到CITA镜像中的东西。所以,按照官网文档的提示,倘若有任何与Docker相关的报错,干脆就粗暴的kill掉Docker中所有的容器实例,即 docker kill $(docker ps -a -q) ,然后再重新运行 ./env.sh 开头的命令,新的命令自然会重启需要的容器实例。
  • 下载之后,Comiling开始了,不用盯着电脑屏幕,当你听到电脑的风扇猛转、感觉到键盘开始发烫,就说明Comiling已经开始了。
  • 对了,官网文档上说,可以直接下载编译好的发布包cita_secp256k1_sha3,下载地址 https://github.com/cryptape/cita/releases ,然而,想测试一下官网文档上的操作,就遇到了问题,主要是在文档【测试】一节中提到的“tests”文件夹下的脚本,因为cita_secp256k1_sha3中没有“tests”文件夹,所以无法执行。自认为机智地把git下来的cita中的“tests”文件夹拷贝过来,再运行这些脚本,会出现没有/opt/cita-run/target/install文件夹导致的系列错误。这个/opt/cita-run我看不懂了,也不知道怎么改,于是使用编译好的发布包作罢,专心致志搞本地的编译。
  • 4.tests脚本
  • 经过了漫长的大约两个多小时的编译,终于编译成功啦!(其实可能不需要两个小时,也许一个小时就够,因为中途有一阵风扇转得特别厉害,感觉已经是极限了,持续了大半个小时后,我发现一直停在Compiling create_key_addr不动,而且硬盘上的文件也不见大小改变,于是control+c中止了编译,待风扇缓和下来,再次执行,程序会从其中断的地方继续,没有任何影响,而且之后很快就编译执行完毕了。)
  • 庆祝编译成功,放一张截图庆祝!
  • 编译成功后,在cita/target/目录下就多了一个install目录(编译不成功是没有的哦~),这里面有一个 create_cita_config.py 文件,这是CITA链的配置工具,可以配置创世块、节点、网络连接、私钥等(详见 https://docs.nervos.org/cita/#/chain/config_tool )。但是我按照官方文档的指引,用命令生成默认的本地4节点Demo(命令是 ./env.sh ./scripts/create_cita_config.py create --nodes “127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002,127.0.0.1:4003” ,终端报了很多错,虽然也声称了【test-chain】及之下1、2、3、4和template各文件夹,但create步骤之后的setup步骤会报错,命令是 ./env.sh ./bin/cita setup test-chain/0 及1、2、3,报错是 sudo: unable to resolve host linuxkit-025000000001,我到处都找不到修改linuxkit-025000000001的地方,搜了一下,发现这个编号很诡异;此外,之前用编译好的发布包cita_secp256k1_sha3,也遇到过这个问题,所以,对我来说,此路暂时不通。)
  • 回到cita主目录下,调用tests/integrate_test/下的脚本(注意不是target/install下面的哦),却是可以不报错的。
  • 这也是官网文档提供的,包括:
  • (1)启动 4 个节点
  • ./env.sh tests/integrate_test/cita_start.sh
  • (2)4 个节点启动并成功出块,基本功能测试然后停止 4 个节点:
  • ./env.sh ./tests/integrate_test/cita_basic.sh
  • (3)发送交易测试
  • ./env.sh ./tests/integrate_test/cita_transactiontest.sh
  • (4)拜占庭测试,即模拟网络异常情况下的功能测试。
  • ./env.sh ./tests/integrate_test/cita_byzantinetest.sh
  • 以上这些脚本都能运行成功。
  • 5.端口映射和Postman
  • 运行前面的(1)测试脚本,即启动 4 个节点的过程中,即 ./env.sh tests/integrate_test/cita_start.sh 运行至看到 CITA start OK后,说明节点都已经启动起来了,开启另一个终端命令行,进到cita主目录下,可以运行如下Request命令:
  • ./env.sh curl -X POST --data ‘{“jsonrpc”:“2.0”,“method”:“peerCount”,“params”:[],“id”:74}’ 127.0.0.1:1337
  • (1337是默认的jsonrpc_port)
  • 得到返回的json信息。
  • 以上是查询节点个数,下面的命令还可以查询当前块高度(区别只是–data的内容):
  • ./env.sh curl -X POST --data ‘{“jsonrpc”:“2.0”,“method”:“blockNumber”,“params”:[],“id”:83}’ 127.0.0.1:1337
  • 在此前一个窗口中运行的cita_start.sh显示CITA start OK,但是,究竟有没有实际在产生区块呢?我们把“查询当前块高度”的脚本间隔几秒钟运行一次,可以发现,每一次结果都不一样,好的,那说明,区块是在不停的产生的。
  • 更多的【CITA JSON-RPC】接口,可见 https://docs.nervos.org/cita/#/rpc_guide/rpc
  • 现在我要准备下一步的开发,那么,CITA链的在Docker容器实例之中,如何与宿主机的程序进行交互呢?直接在Postman中新建一个POST任务( Postman工具下载网址 https://www.getpostman.com/apps ),网址填127.0.0.1:1337,内容依次选Body-raw,然后将之前Request命令中的—data部分(不包括两边的单引号)填入,点【send】,呃,发现根本连接不上127.0.0.1:1337。什么情况?
  • 哦,原来之前Request命令都是通过./env.sh来curl进行交互,而env.sh这个脚本的意义事实上是一个进入Docker容器实例的跳板,当然还有一些其它的设置,包括互通一些在宿主机和虚拟机(docker)上的文件,避免了非要进docker容器实例中进行待运行文件的编辑,极大地方便了开发工作。这个很酷(其实这已经是很普遍的方法了,只是自己学艺不精,今天终于用到,确实很受用,所以,请原谅一个小白的大惊小怪)。
  • 所以,要想通过Postman使宿主机能够直接与CITA链进行交互,需要对env.sh文件进行一点小修改,加上一个端口映射,即在docker run -d之后、一系列参数之前,加上 -p 1337:1337 ,即转发Docker容器实例的1337端口到宿主机的1337端口(这个可以加多个,如果有必要的话,例如 -p 80:80 -p 1337:1337 )。
  • 修改env.sh之后,先不着急再次运行脚本,因为此时CITA链的Docker容器实例还在运行,没有关,还记得前面提到的粗暴方法嘛, docker kill $(docker ps -a -q) ,对,先把所有的Docker容器实例都kill掉,然后再运行 ./env.sh tests/integrate_test/cita_start.sh ,待CITA start OK之后,我们打开Postman试试:
  • 成功啦!
  • 后续我会继续分享我学习CITA链的心得,有兴趣一起学习的朋友,欢迎加我微信啦 Lawup2 (^_^)
4 Likes

将 Docker 中 Memory 改为 4G,Swap 改为 2G 后,可以编译通过。

1 Like

报错: sudo: unable to resolve host linuxkit-025000000001
是由于target/install目录下的env.sh在启动docker时用了参数
–net=host
这个参数在mac下执行有问题。需改成
-p 1337:1337 --network bridge

由于1337这个端口可以由使用者指定,不好直接写到env.sh中。我还没有想到好办法怎么把端口映射出来。