问题&要求
目前ChainCore没有提供用于生产环境的Docker容器,因此,对于生产环境,我们需要单独进行生产方式部署。
我们对于生产环境要求如下:
- 关闭ChainCore数据重置功能
- 可以独立设置Generator,Signer,Quorum
概念扫盲
ChainCore数据重置
ChainCore数据重置功能,由两个地方提供:
- ChainCore Developer Dashboard中(Web 工具)
- corectl(shell 工具)
注意:ChainCore的数据重置功能,本质上就是清空表,但是有三张表的数据是不会清空的,分别是:
- mockhsm(存储模拟生成的HSM秘钥)
- access_tokens(存储生成的token,包括client token和network token)
- migrations(存储表结构迁移记录)
目前操作的结果是,仅有migrations这张表的数据保留,其他表的数据均被清空,源码中指定了跳过上述三张表,目前这个问题还在探讨中。
ChainCore核心概念
Block Generator
区块生成器(下文称Generator),用于生成区块,ChainCore支持两种方式生成区块:
- 按照时间频率(例如每隔一秒生成一个)
- 按照交易池中的交易数量(例如每满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
来源:oschina
链接:https://my.oschina.net/u/2436283/blog/836890