文档章节

ChainCore开源区块链生产环境部署

 风摆残荷
发布于 2017/02/12 22:27
字数 1853
阅读 831
收藏 3

问题&要求

目前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
博文 13
码字总数 25536
作品 0
昌平
程序员
私信 提问
一键部署区块链环境 阿里云发布企业级BaaS服务

8月3日,阿里云宣布推出企业级区块链服务(Blockchain as a Service,以下简称BaaS),支持一键快速部署区块链环境,实现跨企业、跨区域的区块链应用。阿里云BaaS广泛适用于商品溯源、供应链...

阿里云头条
2018/08/03
0
0
阿里云商业产品-区块链服务(公测)发布

产品介绍: 阿里云区块链服务(Blockchain as a Service,简称BaaS)是一种基于主流区块链技术的企业级PaaS(Platform as a Service)平台服务,帮助用户快速构建更稳定、安全的生产级区块链...

刘立超
2018/08/01
0
0
区块链3.0架构:超越货币、金融范围的区块链应用

《区块链:新经济蓝图及导读》一书的作者Melanie Swan把超越货币、金融范围的区块链应用归为区块链3.0,特别是在政府、健康、科学、工业、文化和艺术领域的应用。它支持 广义资产、广义交换,...

程序员杂谈
2018/09/06
0
0
重磅!阿里云区块链服务免费公测,助力企业级业务快速上链

近日阿里云正式上线区块链服务(Blockchain as a Service,简称BaaS),即基于主流区块链技术的企业级技术平台。此次向公众开放的是Hyperledger Fabric,该BaaS承担区块链开发、部署、运维和...

木环
2018/08/15
0
0
阿里云发布区块链解决方案 支持天猫奢侈品正品溯源

4月12日,阿里云发布全新区块链解决方案,支持天猫奢侈平台Luxury Pavilion推出全球首个基于区块链技术的正品溯源功能。该方案旨在帮助进一步打造和拓展奢侈品供应链应用生态。 借助阿里云区...

木环
2018/04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringCloud 与 SpringBoot 的版本兼容

Spring Cloud Finchley 构建并使用 Spring Boot 2.0.x,预计不会与Spring Boot 1.5.x一起使用Spring Cloud Edgware Spring Boot 1.5.xDalston 和 Edgware 发布版基于Spring Boot 1......

晨猫
3分钟前
0
0
microtime 记录的时间点,以毫秒来显示,并显示每一阶段占用百分比。统计代码执行时间。

function mini_bench_to($arg_t, $arg_ra=false){ $tttime=round((end($arg_t)-$arg_t['start'])*1000,4); if ($arg_ra) $ar_aff['total_time']=$tttime; else $aff="total......

lwkai
5分钟前
0
0
Docker 解决容器时间与主机时间不一致的问题三种解决方案

这篇文章主要介绍了Docker 解决容器时间与主机时间不一致的问题的相关资料,这里提供了三种方法,供大家参考,需要的朋友可以参考下 Docker容器时间与主机时间不一致 通过date命令查看时间 查...

Jack088
6分钟前
0
0
neo4j 开启远程web访问7474端口 以 用浏览器打开远程neo4j的web控制台界面

一、对于3.0以前的版本 在安装目录的 $NEO4J_HOME/conf/neo4j.conf 文件内,找到下面一行,将注释#号去掉就可以了 #dbms.connector.https.address=localhost:7474 改为 dbms.connector.https...

Airship
7分钟前
0
0
集合排序

根据指定规则,对集合元素进行自定义排序 List<Map<String, Object>> list= data.stream().sorted(new Comparator<Map>() { @Override public int compare(Map o1, Map o2) { Comparator c =......

zhaochaochao
8分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部