ChainSQL网络搭建¶
版本获取¶
ChainSQL 的节点程序可在 Github开源仓库 获取到,有 windows,linux 两个版本的可执行程序。
一、区块链网络搭建¶
需要至少 4 个验证节点,下图是最简单的ChainSQL网络拓扑图:
下面以一个验证节点为例进行说明,想要得到更多节点,重复以下步骤即可。
1. 验证节点公私钥的生成¶
1-1. secp256k1算法生成 validation_public_key
及 validation_seed
, 输入:
./chainsqld validation_create secp256k1
返回结果如下:
{
"account_id" : "zJ3xp3rVjXqHRS6kGFKdUBcDbTsroAcUX7",
"validation_key" : "SNUB RIDE WRIT SUN WELD LINE LASS BEY NIB NAVY SAD MIKE",
"validation_private_key" : "pnKUcQu16dcSXZ6pMUmYFMSKKD1KynBpQiynRAfqr7Pg9ATWs5s",
"validation_public_key" : "n94pmxRECPLxwquUNgUtN2ndMvUL8gdJ3GfCwaHHfMwQai8jtspo",
"validation_public_key_hex" : "03CB427521F3A733DD43D8087A661D8EFB26A71507FD3A50C8BBC7E1D50C8334EF",
"validation_seed" : "xhLLvnGfiNFUDtb1pJ155iVfMatNW"
}
1-2. 国密算法生成 validation_public_key
及 validation_seed
, 输入:
./chainsqld validation_create gmalg
返回结果如下:
{
"account_id" : "zDgj18fzucH1Za25n1aDU8JNZP1XaLqQz",
"validation_key" : "BERT RAKE BRIM SAM CAM FREE CUE LAY NEIL LAD WOOL SOFA",
"validation_private_key" : "pcwe5zxSw2k6RcztuzFmNSCdo1eynaRYuuscmPidTrBXsPd439i",
"validation_public_key" : "pEn7uiRwkgVcEvshFPi44UHYHQvtzQ4HZcNUmDb2hFxqSSTUfTZ1Y6mVNXn53NzK1mkXPLubnSgAzEMkpncwHhwqyXHTPswk",
"validation_public_key_hex" : "478EC9C2C4ACDE67085CE9BF9E8D5A07DC8F4282F0134BC5A95B9699FAF975049C0419ED9D5291670418BC67D203108C6026342598B16FAB4222AC7986FE1D0770",
"validation_seed" : "pcwe5zxSw2k6RcztuzFmNSCdo1eynaRYuuscmPidTrBXsPd439i"
}
注解
在0.30.3版本之前,执行验证节点公私钥的生成这一命令要提前启动chainsqld进程,是因为下面的validation_create命令要向进程发送rpc请求,如果进程启动不成功,命令会返回错误。0.30.3及之后的版本可以不启动chainsqld程序直接返回结果。
2. 配置文件的修改¶
以下仅针对部分字段进行说明,针对配置文件的详细说明参考 配置文件详解 。
[sync_db]
配置ip,port,db,mysql安装时设置的(user,pass)等。
Chainsql中的事务与行级控制要求每个节点必须配置数据库,如果用不到这两个特性,也可以选择只在需要查看数据的节点配置数据库。
例如
[sync_db]
type=mysql
host=localhost
port=3306
user=root
pass=root
db=chainsql
first_storage=0
unix_socket=/var/lib/mysql/mysql.sock
注解
使用localhost连接时,会默认使用 sock
方式连接,默认sock路径是 /var/run/mysqld/mysqld.sock
在非ubuntu系统中,这个路径是不对的,会导致连接数据库失败,需要用 unix_socket
选项来指定 sock
路径,如果用ip去连接,会使用 tcp
方式连接,就不会有这个问题
[node_db]
不区分平台,
type=RocksDB
或type=NuDB
[ips_fixed]
chainsql尝试进行对等连接的IP地址或主机名及端口号
例如:
[ips_fixed]
192.168.0.80 5123
192.168.0.81 5123
192.168.0.82 5123
[validators]
或 [validators_file]
添加其他(三个)节点的 validation_public_key
;
例如:
[validators]
n9MRden4YqNe1oM9CTtpjtYdLHamKZwb1GmmnRgmSmu3JLghBGGJ
n9Ko97E3xBCrgTy4SR7bRMomytxgkXePRoQUBAsdz1KU1C7qC4xq
n9Km65gnE4uzT1V9L7yAY9TpjWK1orVPthCkSNX8nRhpRaeCN6ga
[validation_public_key]
添加本节点的validation_public_key。此字段可不配置,但方便后续查阅,建议配置(国密为必填项)。
例如:
[validation_public_key]
n9Jq6dyM2jbxspDu92qbiz4pq7zg8umnVCmNmEDGGyyJv9XchvVn
[validation_seed]
添加本节点的 validation_seed
,必填项。
例如:
[validation_seed]
xnvq8z6C1hpcYPP94dbBib1VyoEQ1
[auto_sync]
[auto_sync]
1
auto_sync配置为1表示开启表自动同步,开启后,在节点正常运行的情况下,新建表会自动入同步到数据库。
如果不想自动同步,只想同步需要同步的表,使用 sync_tables
配置项。
[sync_tables]
[sync_tables]
zBUunFenERVydrqTD3J3U1FFqtmtYJGjNP tablename
zxryEYgWvpjh6UGguKmS6vqgCwRyV16zuy tablename2
配置格式:
非加密表格式: 建表账户 表名
加密表格式: 建表账户 表名 可解密账户私钥
[crypto_alg]
[crypto_alg]
node_alg_type=secp256k1
配置格式:
node_alg_type: 支持值:gmalg/secp256k1
此配置项可不填,默认使用secp256k1,不填时validation_seed和validation_public_key均需为secp256k1算法生成。 即node_alg_type的类型必须同validation_seed和validation_public_key生成算法一致。
重要
节点使用的密码算法类型一经确定,所有参与区块链网络的节点必须使用同一种密码算法,
即验证节点公私钥使用同一种密码算法生成,配置文件的 [crypto_alg]
部分保持一致。
3. 架设网络¶
启动chainsqld程序 进入chainsqld应用程序目录,执行下面的命令
nohup ./chainsqld &
每个网络节点均要执行上述命令,使chainsql服务在后台运行。
重要
如果配置文件在当前目录,且名称为 chainsqld.cfg
,可直接运行 nohup ./chainsqld &
命令即可启动节点,否则需要用 --conf
指定配置文件路径: ./chainsqld --conf="./ chainsqld-example.cfg" &
确认chainsqld程序已经启动,输入 ps -ef|grep chainsqld
,看是否列出chainsqld进程。
检查是否成功 进入chainsql应用程序目录,执行命令:
watch ./chainsqld server_info
等待一段时间(默认90秒,可通过 init_time
配置修改),当输出结果中,字段 server_status
:值从 abnormal
变为 normal
,则chainsqld服务启动成功
每个网络节点的chainsql服务都要求成功运行
查看其它节点的运行情况::
watch ./chainsqld peers
链重启/节点重启 节点全部挂掉的情况:
如果想要清空链,将
db,rocksdb/NuDb
文件夹清空,然后重新执行节链启动过程;如果想要加载之前的区块链数据启动,在某一全节点下执行下面的命令:
nohup ./chainsqld --load &
其它节点执行:
nohup ./chainsqld &
这样即可加载原来的数据启动链
还有节点在运行的情况
只要网络中还有节点还在跑,就不需要用 load
方式重启链,只需要启动挂掉的节点即可::
nohup ./chainsqld &
4.退出终端¶
在终端输入 exit
退出,不然之前在终端上启动的chainsqld进程会退出
二、数据库安装配置(可选)¶
重要
用户可在配置文件中配置本地数据库,也可以配置远程数据库。需要注意的是 mysql
数据库安装完后,需要将默认编码改为 utf8
编码,否则表中的中文会显示为乱码。
1. 安装mysql¶
在需要安装mysql数据库的节点上按照提示安装mysql 以ubuntu 16.04为例,安装配置步骤如下:
sudo apt-get install mysql-server
如果apt-get install不成功,可以选择 安装过程中会提示设置密码,要记下密码,在后面的配置文件中会用到。
2.检查是否安装成功¶
检查是否安装成功:
mysql --version
能查询到mysql版本号则表示安装成功。
检查是否能正常登录:
mysql -uroot –p
上面命令输入之后会提示输入密码,此时正确输入密码就可以登录到mysql。
3. 创建数据库并支持utf8编码¶
登入mysql 后,创建名字为chainsql的database:
CREATE DATABASE IF NOT EXISTS chainsql DEFAULT CHARSET utf8
也可以将mysql的默认编码设置为utf8,然后直接创建数据库
create database chainsql;
设置mysql 默认UTF8编码: 修改/etc/mysql/mysql.conf.d/mysqld.cnf文件
[mysqld]
下添加:
character_set_server = utf8
然后在配置文件最后添加如下配置:
[mysql.server]
default-character-set = utf8
[client]
default-character-set = utf8
然后重启mysql:
/etc/init.d/mysql restart
确认是否为utf8编码:
show variables like 'character%';
显示如下图则认为database是utf8编码
+-------------------------------+----------------------------+
| Variable_name | Value |
+-------------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
4. 最大连接数设置(可选)¶
show variables like '%max_connections%';
set GLOBAL max_connections = 10000;
max_connections
,max_connections=10000
,然后重启MySQL即可。三、Docker 搭建ChainSQL网络¶
ChainSQL 节点的 Docker 镜像地址 为 docker pull peersafes/chainsql:v3.0.0
下面以4个验证节点组建网络为例,介绍Docker搭建ChainSQL网络的过程。
1. 生成4个验证节点的配置文件¶
通过 docker镜像 peersafes/chainsql-tools
完成节点配置文件的生成。下面的命令生成了4个节点的配置文件,其中节点的IP分别为
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
。
# 启动镜像
docker run -itd --name chainsql-tools -v ~/docker/cfg:/opt/chainsql-tools/cfg peersafes/chainsql-tools:v0.1.0 /bin/sh
# 生成节点配置文件
docker exec -it chainsql-tools /bin/sh /opt/chainsql-tools/genCfg.sh 4 "192.168.0.1;192.168.0.2;192.168.0.3;192.168.0.4"
生成配置文件后,目录的结构如下,其中目录 1 , 2 , 3 , 4 下的配置文件分别表示节点1,2,3,4的配置文件 。
# 目录结构为
├── 1
│ └── chainsqld.cfg
├── 2
│ └── chainsqld.cfg
├── 3
│ └── chainsqld.cfg
└── 4
│ └── chainsqld.cfg
如果需要节点需要配置数据库,需修改对应节点的配置文件 chainsqld.cfg
, 具体配置参考 配置数据库
2. 启动ChainSQL的Docker镜像¶
拷贝上一步生成的配置文件到4个节点
scp ./1/chainsqld.cfg root@192.168.0.1:/opt/chainsql/
scp ./2/chainsqld.cfg root@192.168.0.2:/opt/chainsql/
scp ./2/chainsqld.cfg root@192.168.0.3:/opt/chainsql/
scp ./3/chainsqld.cfg root@192.168.0.4:/opt/chainsql/
依次启动节点1,2,3,4
# 登录节点1 后 , 启动节点1
docker run -d --name node1 -p 5125:5125 -v /opt/chainsql/chainsqld.cfg:/opt/chainsql/chainsqld.cfg peersafes/chainsql:v0.30.6
# 登录节点2 后 , 启动节点2
docker run -d --name node2 -p 5125:5125 -v /opt/chainsql/chainsqld.cfg:/opt/chainsql/chainsqld.cfg peersafes/chainsql:v0.30.6
# 登录节点3 后 , 启动节点3
docker run -d --name node3 -p 5125:5125 -v /opt/chainsql/chainsqld.cfg:/opt/chainsql/chainsqld.cfg peersafes/chainsql:v0.30.6
# 登录节点4 后 , 启动节点4
docker run -d --name node4 -p 5125:5125 -v /opt/chainsql/chainsqld.cfg:/opt/chainsql/chainsqld.cfg peersafes/chainsql:v0.30.6
3. 查看网络的状态¶
通过 节点的 peers
, server_info
等命令查看网络的状态
# 通过 server_info 查看网络状态 , 返回字段server_status为normal时表示ChainSQL网络正常运行
docker exec -it node1 /opt/chainsql/chainsqld server_info