EOS 开发第一讲:基于 Docker 的本地测试网络

EOS 开发第一讲:基于 Docker 的本地测试网络

EOS 主网络马上就要在 6 月份上线了,dawn 3.0 测试版代码也已经于前段时间放出。同时,为了配合 dawn 3.0 测试网络的上线(5 月 4 日),EOS 官方关闭了 dawn-2.x 测试网络。在此期间,合约开发者需要自行搭建本地网络进行测试。由于 EOS master 分支的代码更新很快,而 EOS 的文档又是出了名的更新不及时,所以照着文档搭建测试网络的坑还是很多的(比如在 dawn-3.0.0 还叫 account 的 table,在最新代码里变成了复数的 accounts,而文档中却依然沿用 account)。

最近围绕 EOS 的更多讨论都是关于超级节点竞选的,关心开发者疾苦的声音似乎寥寥无几。我们认为,开发者社区的建设才是目前最重要的一环。EOSLaoMao 技术团队未来会持续把在 EOS 开发、部署、运维等过程中遇到的坑或者学到的经验教训总结成文章,希望可以让后来的开发者们少走一点点弯路。

开篇第一章,当然是关于测试网络的搭建,搭建好本地节点,才能方便后续的调试、开发和维护。本文将基于 Docker 讲解 EOS 节点的搭建,EOSLaoMao 团队未来在 EOS 主网上线时的技术方案也是基于 Docker 开发的。关于 Docker 在应用的分发和维护等方面的诸多优点这里不再赘述,感兴趣的可以自行搜索相关内容。

注:本教程基于一台 google cloud n1-standard-2 (2 vCPUs, 7.5 GB memory) 配置的云服务器,运行 ubuntu 16.04 LTS 系统。理论上 4GB 内存的服务器已经足够运行一个本地测试网络。


0. 安装 Docker 和 docker-compose

参见官方文档:

docker: Get Docker CE for Ubuntu

docker-compose: Install Docker Compose

1. 新增用户 eos,后续操作均在该用户下完成

将用户加入 sudo 和 docker 组

sudo adduser eos
sudo usermod -aG sudo eos
sudo usermod -aG docker eos
su eos


2. clone eos-docker-compose docker 配置代码库

sudo chown -R eos /opt 
cd /opt
git clone https://github.com/EOSLaoMao/eos-docker-compose.git
cd eos-docker-compose


3. 更新 config.ini 配置

将下面这行中的 Domain/IP 部分

p2p-server-address = <Domain/IP>:9876

替换为你服务器的 ip 地址或者域名,其他部分保持不变。

p2p-server-address = xx.xx.xx.xx:9876

同一目录下的 genesis.json 文件来自官方代码库,保持不变即可。


4. pull docker image

该 image 由 EOSLaoMao 团队基于 DAWN-2018-04-27-ALPHA 代码 build:

docker pull johnnyzhao/eos-dawn-2018-04-27-alpha


5. docker-compose 配置以及服务的启动

让我们先看一下 Docker 目录下的 docker-compose.yml 的文件内容:

version: "3"

services:
  nodeosd:
    build:
      context: .
    image: johnnyzhao/eos-dawn-2018-04-27-alpha
    command: /usr/local/bin/nodeosd.sh --data-dir /opt/eosio/bin/data-dir
    hostname: nodeosd
    ports:
      - 80:8888
      - 9876:9876
    expose:
      - "9876"
    volumes:
      - /data/nodeosd:/opt/eosio/bin/data-dir

  keosd:
    image: johnnyzhao/eos-dawn-2018-04-27-alpha
    command: /usr/local/bin/keosd --wallet-dir /opt/eosio/bin/data-dir
    hostname: keosd
    links:
      - nodeosd
    volumes:
      - /data/keosd:/opt/eosio/bin/data-dir


可以看到,docker-compose 定义了两项服务,分别是 nodeosd 和 keosd,并且将宿主机的 /data/nodeosd 和 /data/keosd 目录挂载到了两项服务的 /opt/eosio/bin/data-dir 目录。其中 nodeosd 程序负责和区块链部分交互,keosd 则负责管理钱包和私钥。

值得注意的是, nodeosd 的端口配置和官方的 tutorial 稍有不同,其中 8888 端口映射到了服务器的 80 端口。

下面使用 docker-compose 启动上述服务:

首先创建两个目录,并将 copy 配置文件:

mkdir -p /data/nodeosd /data/keosd
cp /opt/eos-docker-compose/{config.ini,genesis.json} /data/nodeosd
cp /opt/eos-docker-compose/{config.ini,genesis.json} /data/keosd

启动服务:

cd Docker
sudo docker-compose up -d

可以看到类似下面的输出:

Starting docker_nodeosd_1 ... done
Starting docker_keosd_1   ... done


运行 docker 命令确认服务已经启动:

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"

可以看到类似下面的输出:

CONTAINER ID        NAMES               PORTS
29c600225bb3        docker_keosd_1
a642aad6408f        docker_nodeosd_1    0.0.0.0:9876->9876/tcp, 0.0.0.0:80->8888/tcp


访问 api 获取网络最新数据,确认网络正常运行:

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

可以看到类似下面的 JSON 输出:

{
   "server_version":"15953cc1",
   "head_block_num":212,
   "last_irreversible_block_num":201, 
   "head_block_id":"000059500e32b6a2e1c18241e736a2c0cba29bed457c53c4cebbf50ed891a088",
   "head_block_time":"2018-04-22T08:54:11",
   "head_block_producer":"eosio"
}


其中 server_version 表示当前服务器运行的 eos 代码版本,其取值为代码的最近一条 commit log 前 8 个字符。如果你严格按照这个教程配置,走到这一步看到的肯定也是 '15953cc1' 这串字符,对应的正是 build docker image 的时候 master 代码的最新 commit。

head_block_num 表示最新的区块编号,可以理解为区块高度。

last_irreversible_block_num 表示不可逆区块的最大编号,关于这两个的具体区别,可以参见 EOS 技术白皮书中文版

head_block_time 是最新区块的生成时间。

head_block_producer 则表示由哪个节点产生。由于我们只有一个节点,因此其取值一直是 eosio。


另外,上述 API 也可以通过外网 IP 进行访问,将 127.0.0.1 替换为服务器 IP 即可(需要配合防火墙开放 80 端口)。


6. 数据存储


接下来,让我们看一下数据存储部分。由于我们将宿主机的 /data/nodeosd 和 /data/keosd 目录挂载到了两项服务的 /opt/eosio/bin/data-dir,因此我们可以很方便地在宿主机查看文件内容:

ls -la /data/nodeosd/

total 32
drwxr-xr-x  2 root   root   4096 Apr 26 08:48 blocks
-rw-rw-r--  1 eos    eos     816 Apr 26 08:23 config.ini
drwxr-xr-x 27 root   root   4096 Apr 26 08:45 contracts
-rw-rw-r--  1 eos    eos    7457 Apr 26 08:23 genesis.json
drwxr-xr-x  2 root   root   4096 Apr 26 08:48 shared_mem

ls -la /data/keosd/

total 24
-rw-rw-r-- 1 kittyzhao kittyzhao  816 Apr 26 08:23 config.ini
-rw-rw-r-- 1 kittyzhao kittyzhao 7457 Apr 26 08:23 genesis.json

其中,除了 config.ini 和 genesis.json 这两个配置文件外,在 /data/nodeosd/ 目录下,还有三个目录,分别是 blocks, shared_mem 以及 contracts。其中,blocks 存储的即为区块数据,share_mem 存储的是共享在内存的区块数据,contracts 存储的是 eosio 官方提供的一系列智能合约。目前看来 /data/keosd/ 除了配置文件外,没有其他数据,别急,下一篇揭晓。


7.通过 cleos 和 nodeosd 以及 keosd 交互

在 EOS 的官方文档中有这么一张图,描述了不同组件之间的关系:


配有如下介绍:

nodeos - 服务器端的区块链节点组件
keosd - 钱包管理组件
cleos - 操作 nodeos 和 keosd 的命令行工具


可见 cleos 是一个内建了针对 nodeos 和 keosd 的各种操作的工具包,方便开发者和上述两个组件进行交互。

接下来,让我们配置好 cleos 命令:

alias cleos="sudo docker exec docker_nodeosd_1 /usr/local/bin/cleos"

其中 docker_nodeosd_1 为 docker-compose 启动的容器的名称,请自行替换。(为了方便以后的操作,可以将上述 alias 添加到服务器的 bash profile 中)

接下来我们就可以方便地使用 cleos 内建的各种命令了

比如获取网络的基本信息:

cleos get info

会得到下面的输出:

{
  "server_version": "15953cc1",
  "head_block_num": 34190,
  "last_irreversible_block_num": 34189,
  "head_block_id": "0000858e82570b460a17506b46093b18ac4c7859aa75d807532ddd144ad2aa94",
  "head_block_time": "2018-04-22T10:28:49",
  "head_block_producer": "eosio"
}

我们发现,这个命令的输出和 API 127.0.0.1/v1/chain/get_ 的返回值是一样的。


cleos 内建了很多命令,主要有下面五个大类:

version                     Retrieve version information
  create                      Create various items, on and off the blockchain
  get                         Retrieve various items and information from the blockchain
  set                         Set or update blockchain state
  transfer                    Transfer EOS from account to account
  net                         Interact with local p2p network connections
  wallet                      Interact with local wallet
  sign                        Sign a transaction
  push                        Push arbitrary transactions to the blockchain
  multisig                    Multisig contract commands


其中,create 命令可以用来创建钱包,私钥,账户,get 则是一个读操作等等。


在下一篇文章中,我们将以一个例子,来演示如何创建钱包和账户,并部署合约发行一个叫做 CAT 的代币,届时我们将详细讲解 cleos 的各项用法。


注:

本文用到的相关代码地址:

github.com/EOSLaoMao/eo

本文由 EOSLaoMao 超级节点技术团队出品。欢迎加入 EOSLaoMao 超级节点 telegram 群:telegram.me/eoslaomao

编辑于 2018-05-04

文章被以下专栏收录