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

阅读 686
收藏 2
2018-04-23
原文链接:zhuanlan.zhihu.com

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. 新增用户 eos,后续操作均在该用户下完成

sudo adduser eos
sudo usermod -aG sudo eos
su eos

1. 安装 Docker 和 docker-compose

参见官方文档:

docker: Get Docker CE for Ubuntu

docker-compose: Install Docker Compose

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 团队基于 2018/04/22 的 master 代码 build:

sudo docker pull johnnyzhao/eoslaomao-eos-dawn-3.0:2018-04-22

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

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

version: "3"

services:
  nodeosd:
    build:
      context: .
    image: johnnyzhao/eoslaomao-eos-dawn-3.0:2018-04-22
    command: /opt/eosio/bin/nodeosd.sh --data-dir /opt/eosio/bin/data-dir
    hostname: nodeosd
    ports:
      - 80:8888
      - 9876:9876
    expose:
      - "9876"
    volumes:
      - nodeosd-data-volume:/opt/eosio/bin/data-dir

  keosd:
    image: johnnyzhao/eoslaomao-eos-dawn-3.0:2018-04-22
    command: /opt/eosio/bin/keosd --wallet-dir /opt/eosio/bin/data-dir
    hostname: keosd
    links:
      - nodeosd
    volumes:
      - keosd-data-volume:/opt/eosio/bin/data-dir

volumes:
  keosd-data-volume:
  nodeosd-data-volume:

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

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

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

cd Docker
sudo docker-compose up -d

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

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

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

sudo 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. 数据存储

接下来,让我们看一下数据存储部分。用 docker 命令分别查看 keosd-data-volume 和 nodeosd-data-volume 两个 volume:

sudo docker volume inspect docker_nodeosd-data-volume
sudo docker volume inspect docker_keosd-data-volume

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

[
    {
        "CreatedAt": "2018-04-22T05:43:21Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "docker",
            "com.docker.compose.volume": "nodeosd-data-volume"
        },
        "Mountpoint": "/var/lib/docker/volumes/docker_nodeosd-data-volume/_data",
        "Name": "docker_nodeosd-data-volume",
        "Options": {},
        "Scope": "local"
    }
]

[
    {
        "CreatedAt": "2018-04-22T06:20:35Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "docker",
            "com.docker.compose.volume": "keosd-data-volume"
        },
        "Mountpoint": "/var/lib/docker/volumes/docker_keosd-data-volume/_data",
        "Name": "docker_keosd-data-volume",
        "Options": {},
        "Scope": "local"
    }
]

其中的 Mountpoint 是 volume 在宿主机的文件存储位置。我们看到,区块链数据存储在 nodeosd-data-volume 也就是 /var/lib/docker/volumes/docker_nodeosd-data-volume/ ,钱包私钥等数据则存储在 keosd-data-volume 中。

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

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

配有如下介绍:

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

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

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

alias cleos="sudo docker-compose exec keosd /opt/eosio/bin/cleos -H docker_nodeosd_1"

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

接下来我们就可以方便地使用 cleos 内建的各种命令了(必须在 Docker 目录下执行该命令)

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

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 http://127.0.0.1/v1/chain/get_info 的返回值是一样的。

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/e…

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

评论