ChainCore开源区块链生产环境部署
ChainCore开源区块链生产环境部署
风摆残荷 发表于1年前
ChainCore开源区块链生产环境部署
  • 发表于 1年前
  • 阅读 738
  • 收藏 3
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

摘要: ChainCore给我们提供的Docker容器,是基于测试环境下的,测试环境下的ChainCore,可以随意重置整个区块链,这很显然是不允许的。

问题&要求

目前ChainCore没有提供用于生产环境的Docker容器,因此,对于生产环境,我们需要单独进行生产方式部署。

我们对于生产环境要求如下:

  1. 关闭ChainCore数据重置功能
  2. 可以独立设置Generator,Signer,Quorum

概念扫盲

ChainCore数据重置

ChainCore数据重置功能,由两个地方提供:

  1. ChainCore Developer Dashboard中(Web 工具)
  2. corectl(shell 工具)

注意:ChainCore的数据重置功能,本质上就是清空表,但是有三张表的数据是不会清空的,分别是:

  1. mockhsm(存储模拟生成的HSM秘钥)
  2. access_tokens(存储生成的token,包括client token和network token)
  3. migrations(存储表结构迁移记录)

目前操作的结果是,仅有migrations这张表的数据保留,其他表的数据均被清空,源码中指定了跳过上述三张表,目前这个问题还在探讨中。

ChainCore核心概念

Block Generator

区块生成器(下文称Generator),用于生成区块,ChainCore支持两种方式生成区块:

  1. 按照时间频率(例如每隔一秒生成一个)
  2. 按照交易池中的交易数量(例如每满100比交易生成一个区块)

注意:在一条ChainCore区块链中,只能有一个Generator,一个Generator也可以同时是一个Block Signer

关于Generator的高可用问题,不在本文的讨论范畴

Block Signer

区块签名者(下文称Signer),用于给区块签名。

Generator会将生成的区块(包含交易)发送给每个Signer,Signer会对收到的区块进行验证,如果验证通过,Signer会对接收到的区块进行签名,并返回签名哈希给Generator

注意,在一条ChainCore区块链中,可以包含多个Signer

Block Participant

区块链参与者(下文称Participant),能够发行资产,发起交易等,不能够生成区块以及对区块签名。

Quorum

Quorum,法定数量,这个概念要结合Signer来理解。

上文提到,一条ChainCore区块链中,可以包含多个Signer,这里的Quorum,就是代表着,Signer中,有Quorum个签名通过,那么Generator就认为这个区块是有效的。

生产环境部署

下文中命令行命令,是建立在《开源区块链ChainCore源码方式安装》一文的基础上的,如果没有按照此文搭建源码环境,请先按照此文进行源码环境的搭建。

禁用ChainCore数据重置功能

使用shell脚本编译

对于ChainCore数据重置功能的禁用,只需要在编译时提供 prod 参数即可,幸运的是,对于release版本的构建,ChainCore已经给我们提供了简单易用的shell脚本,存放在 $CHAIN/bin 目录中。

首先我们将对应的release构建脚本复制到$CHAIN目录中

cp $CHAIN/bin/build-cored-release ../

接着我们尝试执行构建脚本

$CHAIN/build-cored-release

执行后会发现得到如下提示:

Usage: /home/poet/Develop/src/chain/build-cored-release <releaseRef> <outputDir>

这是告诉我们,这个shell脚本需要两个参数,第一个为Git的版本号,第二个为编译输出的目录

截止本文时间,ChainCore的最新版release版本为 cmd.cored-1.0.2 (使用git tag查询) 

因此,我们可以使用如下命令来编译ChainCore

$CHAIN/build-cored-release cmd.cored-1.0.2 $GOPATH/release

执行结束后,在 $CHAIN 目录下会存在 cored,corectl 两个可执行程序

分别来解释下这两个程序的作用:

  • cored,ChainCore区块链服务,主要提供完整的区块链功能
  • corectl,ChainCore区块链控制程序,包含生成token,配置、初始化ChainCore等功能

我们可以使用如下命令尝试启动ChainCore

$GOPATH/release/cored

ChainCore启动成功后,通过查看 Core Status ,我们可以看到一个红色的Delete All Data按钮(如下图),下一步,我们就要想办法禁用这个功能。

生产版本Core编译

对于生产版本的编译,非常简单,只需要在build的时候,添加一个 prod tag就可以

因此我们对build-cored-release脚本进行修改,找到如下部分:

go build\
  -tags 'insecure_disable_https_redirect'\
  -ldflags "$ldflags"\
  -o $outputDir/cored\
  chain/cmd/cored

echo "building corectl..."

go build\
  -o "$outputDir/corectl"\
  chain/cmd/corectl

修改为:

go build\
  -tags 'prod insecure_disable_https_redirect'\
  -ldflags "$ldflags"\
  -o $outputDir/cored\
  chain/cmd/cored

echo "building corectl..."

go build\
  -tags 'prod'\
  -o "$outputDir/corectl"\
  chain/cmd/corectl

在后再执行上述的编译命令,即可编译生产环境的ChainCore。

这里有一点需要注意的是,在第二个编译中(编译corectl),由于目前源码的问题(dev环境和prod环境import不一致),会导致corectl无法成功编译。

此问题的解决办法不在本文描述,如果有Go语言基础,可以自行解决,具体问题已经提交到GitHub Issue中。

再次运行ChainCore,会发现,红色的Delete All Data按钮已经消失了,如下图:

配置、初始化ChainCore

corectl工具使用

create-token

用于创建token,包括client token和network token。

使用方法:

usage: corectl create-token [-net] [name]

参数释义:

    -net 生成一个network token(若不指定,则生成client token)

    name token的别名,注意:别名不可重复

使用举例:

# 生成一个别名为client的token
corectl create-token client

# 生成一个别名为net的network token
corectl create-token -net net

create-block-keypair

用于创建一个公钥,公钥别名为 block_key ,注意:此命令只能执行一次,多次执行会报错,因此,当公钥生成后,务必妥善保管。

使用方法:

usage: corectl create-block-keypair

参数释义:

    不需要参数

使用举例:

corectl create-block-keypair

这个命令生成的公钥,将会在配置Generator,Signer中使用

config-generator

此命令用于配置节点为Generator,已经配置过的节点,不可以使用此命令。

使用方法:

usage: corectl config-generator [-s] [-w duration] [quorum] [pubkey url]...

参数释义:

    -s 指定此Generator同时为Signer

    -w 发行窗口持续时间,默认24小时

    quorum 签名法定数量

    [pubkey url] 这两个参数为一组参数,pubkey为Signer端使用create-block-keypair生成的公钥,url为Signer的连接url,固定格式如下:http://<signer-access-token>@<signer-ip>:<signer-port>

quorum参数必须小于或等于[pubkey url]参数的个数

使用举例:

  暂无

config

此命令用于配置节点为Signer或Participant,已经配置过的节点,不可以使用此命令。

使用方法:

usage: corectl config [-t token] [-k pubkey] [blockchain-id] [url]

参数释义:

    -t 指定token,此token为Generator的access token

    -k 指定公钥,这里的公钥为本身使用 create-block-keypair 命令生成的公钥

    blockchain-id   要加入区块链的id,由 config-generator 命令执行后生成

    url  generator的url,一般为http://<generator-ip>:<generator-port>

使用举例:

  暂无

使用举例:

reset

开发环境中使用,用于清空数据库表,功能同Developer Dashboard中的Delete All Data相同。

使用方法:

usage: corectl reset

参数释义:

    不需要参数

使用举例:

usage: corectl reset

补充

若想在单机模拟产品环境,可以通过在不同Terminal中设置不同环境变量来修改监听端口和数据库连接,如:

# 设置cored服务监听端口为2000
export LISTEN=:2000

# 设置cored的数据库连接url
export DATABASE_URL=DATABASE_URL=postgres://<username>:<password>@<pg-host>/<database-name>?sslmode=disable

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 2
博文 11
码字总数 25536
×
风摆残荷
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: