EOSIO开发(一)使用Docker构建本地环境

前言

一直想学习EOS开发,但是不知道怎么入门。最近从GitHub上下载了源码,发现官方已经提供了完整的EOSIO开发入门教程,既然如此赶紧开始行动。今天是系列文章的第一篇,介绍如何使用Docker搭建本地环境。

选择构建方式

官方支持两种方式搭建本地环境

  • 使用源码
  • 使用Docker

我个人首选Docker,因为可以将与EOSIO相关的软件、环境都封装在一个镜像中,不管是出了问题要回退,还是学完以后删除相关的软件,Docker都很方便。

所以在这篇文章中我就不介绍怎么使用源码构建了,有兴趣的同学可以参考官方文档的Building EOSIO章节。

前期准备

EOSIO的构成

在正式开始构建之前,我们先来了解EOSIO的组成部分,官方文档对于EOSIO是这么介绍的。

EOSIO comes with a number of programs(EOSIO由下面的程序构成):

  • nodeos - server-side blockchain node component(服务端的区块链节点组件)
  • cleos - command line interface to interact with the blockchain(与区块链进行交互的命令行界面)
  • keosd - EOSIO wallet(EOSIO钱包)
  • eosio-launcher - application to assist with deploying a multi-node blockchain network(用来协助部署一个多节点区块链网络的应用程序)

中文是我自己翻译的,请原谅我的学渣翻译水平,由于对EOSIO不了解,所以只能按照字面意思硬译。翻译完之后,我发现除了keosd(EOSIO钱包),其它几个程序的作用仍然不明所以。

好在今天的任务是搭建环境,能够将这几个程序安装起来并且正常运行就可以了,各个程序的具体作用后面再做深入学习。

开始构建

参考开发文档,执行下面的命令,如果源码已下载可忽略第一行。

git clone https://github.com/EOSIO/eos.git --recursive
cd eos/Docker
docker build . -t eosio/eos

开始执行以后不需要人工干预,让机器自动运行就可以了,整个过程会持续半小时到一小时。

在执行的过程当中,我们来分析一下构建的步骤,打开eos/Docker/DockerFile 文件,可以看到下面的内容。

FROM eosio/builder as builder

RUN git clone -b master --depth 1 https://github.com/EOSIO/eos.git --recursive
&& cd eos
&& cmake -H. -B"/tmp/build" -GNinja -DCMAKE_BUILD_TYPE=Release -DWASM_ROOT=/opt/wasm -DCMAKE_CXX_COMPILER=clang++
-DCMAKE_C_COMPILER=clang -DCMAKE_INSTALL_PREFIX=/tmp/build -DSecp256k1_ROOT_DIR=/usr/local
&& cmake --build /tmp/build --target install
FROM ubuntu:16.04
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install openssl && rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/lib/* /usr/local/lib/
COPY --from=builder /tmp/build/bin /opt/eosio/bin
COPY --from=builder /tmp/build/contracts /contracts
COPY --from=builder /eos/Docker/config.ini /eos/genesis.json /
COPY nodeosd.sh /opt/eosio/bin/nodeosd.sh
ENV EOSIO_ROOT=/opt/eosio
RUN chmod +x /opt/eosio/bin/nodeosd.sh
ENV LD_LIBRARY_PATH /usr/local/lib
VOLUME /opt/eosio/bin/data-dir
ENV PATH /opt/eosio/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

整个构建过程可以分成下面几个步骤:

  1. 下载eosio/builder镜像。这个镜像包含了EOSIO运行时需要的各种软件和配置信息。
  2. 编译生成可执行文件并安装。这一步与直接使用源码构建环境是一样的,环境参数可能会有细微差别。
  3. 下载ubuntu镜像。看来Docker环境使用的是Ubuntu系统16.04版本。
  4. 安装软件,拷贝配置信息,设置环境变量等等。

构建失败

正当我以为构建会很顺利的时候,命令行上出现一条错误信息:


0406001

在执行"COPY --from=builder /eos/Docker/config.ini /eos/genesis.json /" 语句时出错,eos/genesis.json文件不存在。

这就奇怪了,难道官方开发人员自己没有跑过构建脚本?还是我本地环境的原因导致的错误?

我尝试着将DockerFile中的"eos/genesis.json / "替换成"eos/genesis.json",因为结尾那个多余的 / 看着非常可疑,与前面的地址中间隔了一个空格。

修改之后没有报错,构建成功并且生成了镜像,但是在启动镜像时出现异常,此法不通。

我又另外尝试了几个方法,仍然无法生成正确的镜像,无奈之下,我去GitHub上提交了一个Bug,看看官方开发人员怎么说。

0406002

然并卵,只有两个同病相怜的小伙伴说跟我遇到了一样的问题,官方开发人员并没有答复。

0406003

生成不了正确的镜像,难道我的EOS开发之旅要就此夭折?

当然不会,否则我也没必要写今天这篇文章了,正所谓条条大路通罗马,自己生成不了镜像,就拿官方已经生成好的。

下载eosio/eos镜像

还记得前面执行的命令么

docker build . -t eosio/eos

这句话的意思是让我们生成一个名为eosio/eos的镜像文件,在Docker的命名习惯下,eosio/eos对应了Docker公共仓库eosio命名空间下的eos仓库。也就是说,EOS官方很有可能已经把编译好的镜像文件上传到Docker公共仓库中。

事实是否如此?我尝试做了以下操作。

1.删除本地异常的eosio/eos镜像

docker rmi e7bc2acf31bf

0407001

2.下载eosio/eos镜像

docker pull eosio/eos

0407002

还真让我下载到了。

环境验证

下载好了镜像,我们来进一步验证该镜像是否可用,不管是自己生成的镜像,还是从Docker仓库下载的,下面的验证步骤都是一样的。

参考开发文档Start nodeos docker container only章节。

1.启动一个nodeos节点

docker run --name nodeos -p 8888:8888 -p 9876:9876 -t eosio/eos nodeosd.sh arg1 arg2

0407003

启动成功

2.验证nodeos节点是否可用

curl http://127.0.0.1:8888/v1/chain/get_info

0407004

验证通过

3.同时启动nodeos和kesod节点

docker volume create --name=nodeos-data-volume
docker volume create --name=keosd-data-volume
docker-compose up -d

0407005

这一步要注意几点:

  • 执行命令前先把第1步启动的nodeos节点停掉
  • docker-compose命令相关的配置信息在/eos/Docker/docker-compose.yml文件中
  • 官方文档是说启动nodeos和kesod两个节点,但实际上还启动了builder节点,经过测试这个节点是没有用的,大家可以从docker-compose.yml文件中将builder节点相关的配置信息删掉。

4.执行cleos命令

alias cleos='docker-compose exec keosd /opt/eosio/bin/cleos -H nodeosd'
cleos get info
cleos get account inita

0407007

注意head_block_num的值时10239,在前面验证nodeos节点是否可用时,返回的head_block_num是711,这说明nodeos节点已经在自动生成区块了。

至此环境验证完毕,部署成功。

小结

整个环境构建过程并不复杂,开发文档已经写得比较清楚,顺利的话1到2个小时可以完成。

不过大家还是要注意随机应变,不能完全依赖开发文档,比如当我遇到生成镜像失败的问题时,直接从Docker仓库下载镜像,这一点EOS的开发文档中是没有的。

另外还有一点要注意,开发文档的内容变动很频繁。我刚开始看文档的时候,还是在 https://github.com/EOSIO/eos 里面,不知什么时候开始就变到 https://github.com/EOSIO/eos/wiki 里面,目录结构也变了。

最后还是要吐槽一下EOS官方开发人员

  • 既然可以直接下载镜像,干嘛还让我们自己构建,太浪费时间。
  • 让我们自己构建就算了,能不能测一下构建脚本,没有BUG了再上传?

今天中午在GitHub看到昨天提交的BUG已经Close,官方开发人员的回复是:已经删除genesis.json文件。我还没有测试,希望这次修改之后不会再有新的问题。

0407006
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容

  • EOS架构简单介绍 比较有价值的网站 http://www.eosdata.io https://steemit....
    糖果果老师阅读 674评论 0 2
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,468评论 0 120
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,374评论 0 27
  • 《市场街的最后一站》 推荐理由:生活从来不缺少美,而是缺少发现美的眼睛。《市场街的最后一站》就是一部关于发现美的图...
    xhyread阅读 773评论 0 0
  • 2017年10月3日星期二晴 今天爸爸妈妈和我,还有爷爷奶奶,舅舅,和舅舅的女朋友我们一起来到了南戴河旅行。来到...
    陈泉妡阅读 266评论 0 2