Qtum开发者教程系列——Qtum开发环境设置

Qtum量子链  2018-09-06  QTUM/量子链(Qtum Blockchain)栏目  

Qtum开发者教程系列——Qtum开发环境设置

介绍

  这篇文章介绍如何使用 Docker 在电脑(例如笔记本电脑)上为 Qtum 区块链快速设置私有 3节点 regtest 环境。对想在 Qtum 区块链上进行实验(例如 staking)的人非常有用。

  选择 Docker 是因为(等下)会简化不同系统(如 Windows, macOS/OSX, Linux等)上开发工具的安装,比如 solc 和 ethabi。

  下文专为 Qtum 区块链软件开发者,要求已安装好环境。

  本教程做以下假设:

  你是一位软件开发者(至少知道怎么编辑文件,运行命令行,会用git等等)

  你知道我说的“CTRL-D”指的是同时按下“Ctrl”键和字母“D”键

  我的命令行和输出基于 macOS/OSX 环境,但你可以把它们翻译到你对应的操作系统上(如 Windows, Linux等)

  你有大约 200MB 空闲磁盘空间来装 3 个节点的数据

  使用 $ 字符作为命令开头。不同操作系统可能有不同开头(例如>)。要在shell /终端(例如 Windows 中的“命令提示符”等)中输入这些命令.

  安装 Docker

  我在 macOS Sierra 10.12.6 的笔记本电脑上安装 Docker(CE)版

Qtum开发者教程系列——Qtum开发环境设置

  运行 Docker 命令:

  $ docker version

  则有以下:

  Client:

  Version: 17.09.0-ce

  API version: 1.32

  Go version: go1.8.3

  Git commit: afdb6d4

  Built: Tue Sep 26 22:40:09 2017

  OS/Arch: darwin/amd64

  Server:

  Version: 17.09.0-ce

  API version: 1.32 (minimum version 1.12)

  Go version: go1.8.3

  Git commit: afdb6d4 Built: Tue Sep 26 22:45:38 2017

  OS/Arch: linux/amd64

  Experimental: true

  要确保已安装 Docker 并正常运行,运行命令:

  $ docker run hello-world

  输出如下:

  Unable to find image 'hello-world:latest' locally

  latest: Pulling from library/hello-world

  5b0f327be733: Pull complete

  Digest: sha256:b2ba691d8aac9e5ac3644c0788e3d3823f9e97f757f01d2ddc6eb5458df9d801

  Status: Downloaded newer image for hello-world:latest

  Hello from Docker!

  This message shows that your installation appears to be working correctly.

  To generate this message, Docker took the following steps:

  1. The Docker client contacted the Docker daemon.

  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

  3. The Docker daemon created a new container from that image which runs the

  executable that produces the output you are currently reading.

  4. The Docker daemon streamed that output to the Docker client, which sent it

  to your terminal.

  To try something more ambitious, you can run an Ubuntu container with:

  $ docker run -it ubuntu bash

  Share images, automate workflows, and more with a free Docker ID:

  https://cloud.docker.com/

  For more examples and ideas, visit:

  https://docs.docker.com/engine/userguide/

  *以上发生错误的话请及时向社区寻求帮助

Qtum开发者教程系列——Qtum开发环境设置

2. 创建 Qtum Docker 桥接网络(Qtum Docker Bridge Network)

  为了允许 qtumd 节点(在单独的 Docker 容器中运行)相互通信,我们将为它们创建一个 Docker 桥接网络:

  $ docker network create --driver bridge qtum_network

  查看是否 Docker 网络已正确创建:

  $ docker network ls

  输出类似于这样:

  NETWORK ID NAME DRIVER SCOPE

  6ed968118fba bridge bridge local

  07f2b230641a host host local

  4275590e2165 none null local

  056c85d3e4a3 qtum_network bridge local

  下面进一步使用的命令中,我们引用 qtum_network 网络。

Qtum开发者教程系列——Qtum开发环境设置

3. 拉取 Qtum Docker 镜像(Qtum Docker Image)

  Qtum Docker:https://hub.docker.com/r/cryptominder/qtum/

  将镜像拉取到本地:

  $ docker pull cryptominder/qtum

  几分钟后,应该看到它已将镜像及其依赖下载好了。可以运行:

  $ docker images

  验证镜像(即 cryptominder/qtum)确实在本地可用。Qtum Daemon 数据文件夹(Datadir)作为 Docker 卷(Docker Volume)

  cryptominder/qtum Docker 镜像在 /data 处有一个卷(volume)。我们在本地目录下(每个节点一个)创建 Qtum 数据文件夹(例如,存储区块链数据,钱包文件,调试日志等)。

  这样停止再重启 Docker 容器也不会丢失任何数据。

  我们也把一个本地的 qtumd 配置文件映射到 /home/qtum/qtum.conf (只读)

  使用 docker run 命令加上2个命令行参数:

  -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro

  -v ${PWD}/node1_data:/data

  ${PWD} 环境变量是 Linux 和 macOS/OSX 下的当前目录 - 将其替换为你实际目录路径。在Windows上,这通常相当于 %cd%。

Qtum开发者教程系列——Qtum开发环境设置

4. 获取 Qtum Daemon 配置文件

  开始搭建 Qtum regtest 环境之前,先弄一些 qtumd 配置文件 - 用于 3 个节点。

  我已经在 https://github.com/crypt0m1nd3r/docker-qtum-config 上提供了3个配置文件。可以从 Git 手动下载 3 个文件,也可以简单地克隆仓库:

  $ git clone https://github.com/crypt0m1nd3r/docker-qtum-config.git

  现在你已经下好 3 个文件:

  node1_qtumd.conf

  node2_qtumd.conf

  node3_qtumd.conf

  这些文件几乎完全相同,除了它们如何让一个节点连接到另一个节点(即 node1 连接 到 node2,node2 连接到 node3,node3 连接到 node1)。

Qtum开发者教程系列——Qtum开发环境设置

5. 开始

  现在我们准备启动 3 个节点创建 Qtum 区块链 regtest 网络。

  启动节点#1(1行搞定):

  $ docker run -d --rm --name qtumd_node1 --network=qtum_network -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtumd

  -v 的路径是绝对路径。 同样,在Windows上,可以用%cd%替换${PWD}。

  检查节点#1是否正在运行:

  $ docker ps

  输出(可以向左滚动):

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  e1dd22bdf9c9 cryptominder/qtum:latest "/entrypoint.sh qtumd" 2 seconds ago Up 1 second 3888-3889/tcp, 13888-13889/tcp, 23888/tcp qtumd_node1

  可以看到(在上面的最后一列,在最右边) qtumd 节点#1 的 Docker 容器命名:qtumd_node1。

  qtumd_node1使用配置文件node1_qtumd.conf(确保该文件在提供的路径中),它用当前目录中的 node1_data 作为 datadir。

  检查 ${PWD}/node1_data 目录是否包含名为 regtest 的子目录 - 并且在regtest子目录下面找到 wallet.dat,debug.log 等。运行:

  $ ls -1FA node1_data/regtest

  输出:

  .cookie

  .lock

  banlist.dat

  blocks/

  chainstate/

  database/

  db.log

  debug.log

  peers.dat

  qtumd.pid

  stateQtum/

  vm.log

  wallet.dat

  对节点#2和#3执行与上述相同的步骤(包括检查),即:

  启动节点#2(1行搞定):

  $ docker run -d --rm --name qtumd_node2 --network=qtum_network -v ${PWD}/node2_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node2_data:/data cryptominder/qtum:latest qtumd

  启动节点#3(1行搞定):

  $ docker run -d --rm --name qtumd_node3 --network=qtum_network -v ${PWD}/node3_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node3_data:/data cryptominder/qtum:latest qtumd

  再次运行:

  $ docker ps

  有(注意:下面的输出可以向左滚动)

  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  6a9cf2ea8a6c cryptominder/qtum:latest "/entrypoint.sh qtumd" 1 second ago Up 1 second 3888-3889/tcp, 13888-13889/tcp, 23888/tcp qtumd_node3

  7bc649de7649 cryptominder/qtum:latest "/entrypoint.sh qtumd" 10 seconds ago Up 9 seconds 3888-3889/tcp, 13888-13889/tcp, 23888/tcp qtumd_node2

  e1dd22bdf9c9 cryptominder/qtum:latest "/entrypoint.sh qtumd" 3 minutes ago Up 3 minutes 3888-3889/tcp, 13888-13889/tcp, 23888/tcp qtumd_node1

  恭喜! - 你刚刚创建了一个 3 节点 regtest Qtum 区块链环境。

  随便写一个 shell/batch 脚本来自动执行这个过程

Qtum开发者教程系列——Qtum开发环境设置

6. 验证

  要进一步验证 regtest 网络是否已设置正确,使用 qtum-cli 命令在一个或多个节点上调用 qtumd 的 RPC 接口。

  要使用 qtum-cli 在 qtum_node1 上调用RPC接口,运行:

  $ docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getinfo

  输出类似于这样:

  "errors": ""

  {

  "version": 140301,

  "protocolversion": 70016,

  "walletversion": 130000,

  "balance": 0.00000000,

  "stake": 0.00000000,

  "blocks": 0,

  "timeoffset": 0,

  "connections": 0,

  "proxy": "",

  "difficulty": {

  "proof-of-work": 4.656542373906925e-10,

  "proof-of-stake": 4.656542373906925e-10

  },

  "testnet": false,

  "moneysupply": 0,

  "keypoololdest": 1507353938,

  "keypoolsize": 100,

  "paytxfee": 0.00000000,

  "relayfee": 0.00400000,

  }

  帮助 help

  $ docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli help

  以上将显示所有可用的RPC命令

  getconnectioncount

  $ docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getconnectioncount

  上面应该输出2(假设节点已经启动了几分钟,所以它们有机会相互连接)。

  getaccountaddress

  $ docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli -stdin getaccountaddress

  运行上面的命令后,按 Enter 键(获得节点钱包的默认/空""帐户地址),然后按CTRL-D。 这是使用 -stdin 选项指定更高级命令行参数的示例(每行一个,直到按下 CTRL-D)。

  当然还有许多其他命令(运行帮助 help时可以看到它们,见上文)

  上面的命令用的是 qtumd_node1。可以更改命令行上的相关参数项(即将 1 变为 2 等等)在其他节点上运行这些参数项。可以检查每个节点是否就区块高度给出相同的结果 (即来自getinfo命令的"blocks": 0”。

  再次建议,随便写个 shell/批处理脚本(或别名)来简化这些命令的调用。

Qtum开发者教程系列——Qtum开发环境设置

7.进入到权益证明 (POS, Proof-of-Stake) 区块阶段

  可能你已经注意到上一步中的 getinfo 命令输出:“blocks”:0。这意味着我们的 Qtum regtest 区块链上尚未创建任何区块。

  在 regtest 区块链中,你需要手动生成区块。 可以用 generate RPC 命令。运行 help generate以查看其工作原理:

  $ docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli help generate

  提示:也可以 help 用于其他 RPC 命令。现在,生成1个区块:

  $ docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli generate 1

  再次运行 getinfo 命令:

  $ docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getinfo

  输出

  "blocks": 1,

  在 Qtum 中,前 5000 个区块是工作证明(POW)区块。建议将区块高度提高到(至少)5000,这样就可以进入权益证明(POS, Proof-of-Stake)区块。如果上面生成了 1 个块,则现在需要生成 4999 个块:

  $ docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli generate 4999

  运行上述命令需要2或3分钟才能完成。完成后,可以看到一个很长的输出(即一个 JSON 格式的输出,包含 4999 个生成区块的哈希,每一个一行)

  Qtum 的首席开发者 Jordan Earls 告诉我:“实际上并非如此。PoS 和 PoW 区块在区块 5000 之下是混合出现的,并且在区块 5000 之后禁止 PoW。但是,在 regtest 模式下,没有 PoW 或 PoS 限制。

  因此,只要生成至少 500 个区块(因为代币不能用于 staking 直到 500 区块后成熟),就可以生成几乎任何数量的区块。我通常选择 600。此外,由于与时间戳执行相关的一些技术问题,5000这么大的区块数会导致花费几个小时才会进入到PoS阶段”

  再次运行 getinfo 命令:

  $ docker run -i --network container:qtumd_node1 -v ${PWD}/node1_qtumd.conf:/home/qtum/qtum.conf:ro -v ${PWD}/node1_data:/data cryptominder/qtum:latest qtum-cli getinfo

  会得到:

  "blocks": 5000,

  我们现在处于 Proof-of-Stake(POS)阶段。

  重要说明:在 Qtum regtest 环境中,POS 区块自动生成。生成第 5001 个块需要一点时间(例如大约10分钟) - 但之后区块生成很快。有需要的话仍然可以手动生成 POS 区块。

  生成块之后,可以看到钱包余额增加(使用 getbalance 查看)

Qtum开发者教程系列——Qtum开发环境设置

8. 停止和重置

  要停止节点,只需运行:

  $ docker stop qtumd_node1

  (显然,更改 qtumd_node1 来停止对应节点)

  如果希望完全重置区块链,则可以在停止节点后删除全部 3 个数据目录(例如node1_data/regtest 等)。如果想“登录”正在运行的容器,以下命令很有用:

  $ docker exec -it /bin/sh

  部分可以是容器ID(如docker ps所示)或我们给容器的名称(例如qtumd_node1)

  做完后需要退出,只需输入:

  # exit

  退出容器(它仍将继续运行)。

  希望本教程对你有所帮助。如果你需要帮助,请在下面评论,或者在 Qtum subreddit 上找我。我也积极参与 Qtum 的 Slack(尽管随着 Qtum 团队准备转移到另一个协作/消息传递平台,Slack 邀请已经关闭)。

  如果你觉得本教程很有用,我的 Qtum tip 钱包地址(在我的Raspberry Pi 3上运行)是:QUa3yA8ALfQyM5eEb9sDPRWkX6sSurMs6D。

  感谢你的支持!

版权信息
作者:Qtum量子链
来源:量子链平台Qtum

关于我们

联系我们

作者进驻

手机版

Copyright © 2013 比特巴 www.btb8.com
始建于2013年,提供比特币 区块链及数字货币新闻、技术教程、测评、项目周报、人物等资讯
本页面提供的是QTUM教程资讯,量子链Qtum致力于构建比特币和以太坊之外的第三种区块链生态系统,用以拓展区块链技术的应用边界。