写在前面:
长安链文档:https://docs.chainmaker.org.cn/
本系列教程,是以长安链官方文档为基准。很多文字描述我直接复制官方文档,我只是将自己的使用过程,整理出来。也欢迎留言讨论。
通过命令行工具启动链
1.1. 概述
通过本文你将可以搭建起长安链多节点集群,并使用命令行工具和SDK完成长安链功能的体验。
通过源码搭建长安链并且上链查数据需要以下步骤,本文将一一演示
- 下载长安链及证书管理工具源码
- 编译源码
- 生成节点证书
- 编译及安装包制作
- 启动节点集群
- 查看节点状态
- 使用CMC工具安装、调用、查询一个合约
- 使用GO SDK验证合约
2.2. 环境依赖
2.2.1. 硬件依赖
配置 | 最低配置 | 推荐配置 |
---|---|---|
CPU | 1.5GHz | 2.4GHz |
内存 | 8GB | 16GB |
核心 | 4核 | 8核 |
带宽 | 2Mb | 10Mb |
2.2.2. 软件依赖
当前文档在centos7.6操作下完成,以下为本次演示所需的依赖 软件列表如下:
名称 | 版本 | 描述 | 是否必须 |
---|---|---|---|
git | / | 源码管理 | 是 |
golang | 1.16+ | 编译环境 | 是 |
docker | 18+ | 独立运行容器 | 否 |
docker-compose | / | 容器管理组件 | 否 |
gcc | 7.3+ | 编译环境依赖 | 是 |
glibc | 2.18 | 智能合约执行环境依赖 | 是 |
tmux | / | 默认快速启动命令依赖 | 否 |
wasmer运行时库 libwasmer_runtime_c_api.so | / | 库在chainmaker-go/main 目录下,将该库路径添加至系统PATH环境变量下 启动脚本默认包含,单独启动需加上如下配置: cd deployPath/lib cp xxx/main/libwasmer_runtime_c_api.so libwasmer.so export LD_LIBRARY_PATH=deployPath/lib:$LD_LIBRARY_PATH |
是 |
2.3. 环境搭建
下面将介绍使用脚本搭建
和使用Docker搭建
两种方式搭建环境,任选一种即可。
2.3.1. 使用脚本搭建
适用于
Linux
、MacOS
2.3.1.1. 源码下载
从长安链官网下载源码:https://git.chainmaker.org.cn/chainmaker/chainmaker-go
当前为私有仓库,需要先进行账号注册
- 下载
chainmaker
源码到本地
$ git clone https://git.chainmaker.org.cn/chainmaker/chainmaker-go.git
- 下载证书生成工具源码到本地
$ git clone -b v2.2.0 https://git.chainmaker.org.cn/chainmaker/chainmaker-cryptogen.git
下载到本地你想放置的目录:
2.3.1.2. 源码编译
- 编译证书生成工具
$ cd chainmaker-cryptogen
$ make
也可以查看本地项目目录:
2.3.1.3. 配置文件生成
- 将编译好的
chainmaker-cryptogen
,软连接到chainmaker-go/tools
目录
# 进入工具目录
$ cd chainmaker-go/tools
# 软连接chainmaker-cryptogen到tools目录下
$ ln -s ../../chainmaker-cryptogen/ .
- 2.1版本之后,ChainMaker支持多种身份模式,由于不同身份模式下,配置文件的目录结构和内容差异较大,我们提供了不同的生成配置文件的脚本。根据场景,选择需要使用的身份模式PermissionedWithCert、PermissionedWithKey、Public(详情见身份权限管理),从下面脚本中选择一种即可:
身份模式这里,我最早用了PermissionedWithCert,但是它需要将用户添加到组织。后来我就改成了Public模式。
2.3.1.3.3. Public
2.1版本之后新增的身份模式,详情见身份权限管理
进入chainmaker-go/scripts
目录,执行prepare_pk.sh
脚本生成单链4节点集群配置,存于路径chainmaker-go/build
中
prepare_pk.sh
脚本支持生成4/7/10/13/16节点公私钥和配置
# 进入脚本目录
$ cd ../scripts
# 查看脚本帮助
$ ./prepare_pk.sh -h
Usage:
prepare_pk.sh node_cnt(4/7/10/13/16) chain_cnt(1-4) p2p_port(default:11301) rpc_port(default:12301)
eg1: prepare_pk.sh 4 1
eg2: prepare_pk.sh 4 1 11301 12301
# 生成单链4节点集群的密钥和配置
$ ./prepare_pk.sh 4 1
begin check params...
begin generate keys, cnt: 4
input consensus type (5-DPOS(default)):
input log level (DEBUG|INFO(default)|WARN|ERROR):
input hash type (SHA256(default)|SM3):
enable docker vm (YES|NO(default))
config node total 4
begin generate node1 config...
begin generate node2 config...
begin generate node3 config...
begin generate node4 config...
# 查看生成好的节点密钥和配置
$ tree -L 3 ../build/
../build/
├── config
│ ├── node1
│ │ ├── admin
│ │ ├── chainconfig
│ │ ├── chainmaker.yml
│ │ ├── log.yml
│ │ ├── node1.key
│ │ ├── node1.nodeid
│ │ ├── node1.pem
│ │ └── user
│ ├── node2
│ │ ├── admin
│ │ ├── chainconfig
│ │ ├── chainmaker.yml
│ │ ├── log.yml
│ │ ├── node2.key
│ │ ├── node2.nodeid
│ │ ├── node2.pem
│ │ └── user
│ ├── node3
│ │ ├── admin
│ │ ├── chainconfig
│ │ ├── chainmaker.yml
│ │ ├── log.yml
│ │ ├── node3.key
│ │ ├── node3.nodeid
│ │ ├── node3.pem
│ │ └── user
│ └── node4
│ ├── admin
│ ├── chainconfig
│ ├── chainmaker.yml
│ ├── log.yml
│ ├── node4.key
│ ├── node4.nodeid
│ ├── node4.pem
│ └── user
├── crypto-config
│ ├── node1
│ │ ├── admin
│ │ ├── node1.key
│ │ ├── node1.nodeid
│ │ ├── node1.pem
│ │ └── user
│ ├── node2
│ │ ├── admin
│ │ ├── node2.key
│ │ ├── node2.nodeid
│ │ ├── node2.pem
│ │ └── user
│ ├── node3
│ │ ├── admin
│ │ ├── node3.key
│ │ ├── node3.nodeid
│ │ ├── node3.pem
│ │ └── user
│ └── node4
│ ├── admin
│ ├── node4.key
│ ├── node4.nodeid
│ ├── node4.pem
│ └── user
└── crypto_config.yml
查看帮助脚本:
生成单链4节点集群的密钥和配置:
查看生成好的节点密钥和配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yy7og9k5-1659584466471)(https://img.chengxuka.com/[email protected])]
或者直接查看本地目录:
这里一对儿密钥:
- 关于自动生成的端口说明
通过prepare.sh
脚本生成的配置,默认是在单台服务器上部署,故自动生成的端口号,是从一个起始端口号开始依次递增,可以通过命令行参数修改起始端口号。
主要有2个端口,p2p
端口(用于节点互联)和rpc
端口(用于客户端与节点通信),p2p
起始端口为11301
,rpc
起始端口为12301
。
如果生成4个节点的配置,p2p
端口分别为:11301、11302、11303、11304
,rpc
端口分别为:12301、12302、12303、12304
如果是在多机部署,希望生成固定的端口号,请参考:【多机部署】
2.3.1.4. 编译及安装包制作
- 生成证书(prepare.sh脚本)后执行
build_release.sh
脚本,将编译chainmaker-go
模块,并打包生成安装,存于路径chainmaker-go/build/release
中
$ ./build_release.sh
$ tree ../build/release/
../build/release/
├── chainmaker-v2.2.1-node1-20220803115954-x86_64.tar.gz
├── chainmaker-v2.2.1-node2-20220803115954-x86_64.tar.gz
├── chainmaker-v2.2.1-node3-20220803115954-x86_64.tar.gz
├── chainmaker-v2.2.1-node4-20220803115954-x86_64.tar.gz
└── crypto-config-20220803115954.tar.gz
查看目录:
2.3.1.5. 启动节点集群
- 执行
cluster_quick_start.sh
脚本,会解压各个安装包,调用bin
目录中的start.sh
脚本,启动chainmaker
节点
$ ./cluster_quick_start.sh normal
运行效果:
hanru@localhost scripts % ./cluster_quick_start.sh normal
===> Unzip chainmaker installation package
x chainmaker-v2.2.1-node1/
x chainmaker-v2.2.1-node1/bin/
x chainmaker-v2.2.1-node1/config/
x chainmaker-v2.2.1-node1/lib/
x chainmaker-v2.2.1-node1/log/
x chainmaker-v2.2.1-node1/lib/wxdec
x chainmaker-v2.2.1-node1/lib/libwasmer.dylib
x chainmaker-v2.2.1-node1/config/node1/
x chainmaker-v2.2.1-node1/config/node1/log.yml
x chainmaker-v2.2.1-node1/config/node1/node1.nodeid
x chainmaker-v2.2.1-node1/config/node1/chainconfig/
x chainmaker-v2.2.1-node1/config/node1/admin/
x chainmaker-v2.2.1-node1/config/node1/user/
x chainmaker-v2.2.1-node1/config/node1/chainmaker.yml
x chainmaker-v2.2.1-node1/config/node1/node1.pem
x chainmaker-v2.2.1-node1/config/node1/node1.key
x chainmaker-v2.2.1-node1/config/node1/user/client1/
x chainmaker-v2.2.1-node1/config/node1/user/client1/client1.pem
x chainmaker-v2.2.1-node1/config/node1/user/client1/client1.key
x chainmaker-v2.2.1-node1/config/node1/user/client1/client1.addr
x chainmaker-v2.2.1-node1/config/node1/admin/admin1/
x chainmaker-v2.2.1-node1/config/node1/admin/admin2/
x chainmaker-v2.2.1-node1/config/node1/admin/admin5/
x chainmaker-v2.2.1-node1/config/node1/admin/admin4/
x chainmaker-v2.2.1-node1/config/node1/admin/admin3/
x chainmaker-v2.2.1-node1/config/node1/admin/admin3/admin3.pem
x chainmaker-v2.2.1-node1/config/node1/admin/admin3/admin3.key
x chainmaker-v2.2.1-node1/config/node1/admin/admin4/admin4.pem
x chainmaker-v2.2.1-node1/config/node1/admin/admin4/admin4.key
x chainmaker-v2.2.1-node1/config/node1/admin/admin5/admin5.pem
x chainmaker-v2.2.1-node1/config/node1/admin/admin5/admin5.key
x chainmaker-v2.2.1-node1/config/node1/admin/admin2/admin2.pem
x chainmaker-v2.2.1-node1/config/node1/admin/admin2/admin2.key
x chainmaker-v2.2.1-node1/config/node1/admin/admin1/admin1.pem
x chainmaker-v2.2.1-node1/config/node1/admin/admin1/admin1.key
x chainmaker-v2.2.1-node1/config/node1/chainconfig/bc1.yml
x chainmaker-v2.2.1-node1/bin/docker-vm-standalone-start.sh
x chainmaker-v2.2.1-node1/bin/restart.sh
x chainmaker-v2.2.1-node1/bin/docker-vm-standalone-stop.sh
x chainmaker-v2.2.1-node1/bin/init.sh
x chainmaker-v2.2.1-node1/bin/run.sh
x chainmaker-v2.2.1-node1/bin/stop.sh
x chainmaker-v2.2.1-node1/bin/chainmaker
x chainmaker-v2.2.1-node1/bin/chainmaker.service
x chainmaker-v2.2.1-node1/bin/start.sh
x chainmaker-v2.2.1-node2/
x chainmaker-v2.2.1-node2/bin/
x chainmaker-v2.2.1-node2/config/
x chainmaker-v2.2.1-node2/lib/
x chainmaker-v2.2.1-node2/log/
x chainmaker-v2.2.1-node2/lib/wxdec
x chainmaker-v2.2.1-node2/lib/libwasmer.dylib
x chainmaker-v2.2.1-node2/config/node2/
x chainmaker-v2.2.1-node2/config/node2/log.yml
x chainmaker-v2.2.1-node2/config/node2/chainconfig/
x chainmaker-v2.2.1-node2/config/node2/admin/
x chainmaker-v2.2.1-node2/config/node2/user/
x chainmaker-v2.2.1-node2/config/node2/node2.pem
x chainmaker-v2.2.1-node2/config/node2/node2.nodeid
x chainmaker-v2.2.1-node2/config/node2/chainmaker.yml
x chainmaker-v2.2.1-node2/config/node2/node2.key
x chainmaker-v2.2.1-node2/config/node2/user/client1/
x chainmaker-v2.2.1-node2/config/node2/user/client1/client1.pem
x chainmaker-v2.2.1-node2/config/node2/user/client1/client1.key
x chainmaker-v2.2.1-node2/config/node2/user/client1/client1.addr
x chainmaker-v2.2.1-node2/config/node2/admin/admin1/
x chainmaker-v2.2.1-node2/config/node2/admin/admin2/
x chainmaker-v2.2.1-node2/config/node2/admin/admin5/
x chainmaker-v2.2.1-node2/config/node2/admin/admin4/
x chainmaker-v2.2.1-node2/config/node2/admin/admin3/
x chainmaker-v2.2.1-node2/config/node2/admin/admin3/admin3.pem
x chainmaker-v2.2.1-node2/config/node2/admin/admin3/admin3.key
x chainmaker-v2.2.1-node2/config/node2/admin/admin4/admin4.pem
x chainmaker-v2.2.1-node2/config/node2/admin/admin4/admin4.key
x chainmaker-v2.2.1-node2/config/node2/admin/admin5/admin5.pem
x chainmaker-v2.2.1-node2/config/node2/admin/admin5/admin5.key
x chainmaker-v2.2.1-node2/config/node2/admin/admin2/admin2.pem
x chainmaker-v2.2.1-node2/config/node2/admin/admin2/admin2.key
x chainmaker-v2.2.1-node2/config/node2/admin/admin1/admin1.pem
x chainmaker-v2.2.1-node2/config/node2/admin/admin1/admin1.key
x chainmaker-v2.2.1-node2/config/node2/chainconfig/bc1.yml
x chainmaker-v2.2.1-node2/bin/docker-vm-standalone-start.sh
x chainmaker-v2.2.1-node2/bin/restart.sh
x chainmaker-v2.2.1-node2/bin/docker-vm-standalone-stop.sh
x chainmaker-v2.2.1-node2/bin/init.sh
x chainmaker-v2.2.1-node2/bin/run.sh
x chainmaker-v2.2.1-node2/bin/stop.sh
x chainmaker-v2.2.1-node2/bin/chainmaker
x chainmaker-v2.2.1-node2/bin/chainmaker.service
x chainmaker-v2.2.1-node2/bin/start.sh
x chainmaker-v2.2.1-node3/
x chainmaker-v2.2.1-node3/bin/
x chainmaker-v2.2.1-node3/config/
x chainmaker-v2.2.1-node3/lib/
x chainmaker-v2.2.1-node3/log/
x chainmaker-v2.2.1-node3/lib/wxdec
x chainmaker-v2.2.1-node3/lib/libwasmer.dylib
x chainmaker-v2.2.1-node3/config/node3/
x chainmaker-v2.2.1-node3/config/node3/log.yml
x chainmaker-v2.2.1-node3/config/node3/node3.nodeid
x chainmaker-v2.2.1-node3/config/node3/chainconfig/
x chainmaker-v2.2.1-node3/config/node3/admin/
x chainmaker-v2.2.1-node3/config/node3/user/
x chainmaker-v2.2.1-node3/config/node3/node3.pem
x chainmaker-v2.2.1-node3/config/node3/chainmaker.yml
x chainmaker-v2.2.1-node3/config/node3/node3.key
x chainmaker-v2.2.1-node3/config/node3/user/client1/
x chainmaker-v2.2.1-node3/config/node3/user/client1/client1.pem
x chainmaker-v2.2.1-node3/config/node3/user/client1/client1.key
x chainmaker-v2.2.1-node3/config/node3/user/client1/client1.addr
x chainmaker-v2.2.1-node3/config/node3/admin/admin1/
x chainmaker-v2.2.1-node3/config/node3/admin/admin2/
x chainmaker-v2.2.1-node3/config/node3/admin/admin5/
x chainmaker-v2.2.1-node3/config/node3/admin/admin4/
x chainmaker-v2.2.1-node3/config/node3/admin/admin3/
x chainmaker-v2.2.1-node3/config/node3/admin/admin3/admin3.pem
x chainmaker-v2.2.1-node3/config/node3/admin/admin3/admin3.key
x chainmaker-v2.2.1-node3/config/node3/admin/admin4/admin4.pem
x chainmaker-v2.2.1-node3/config/node3/admin/admin4/admin4.key
x chainmaker-v2.2.1-node3/config/node3/admin/admin5/admin5.pem
x chainmaker-v2.2.1-node3/config/node3/admin/admin5/admin5.key
x chainmaker-v2.2.1-node3/config/node3/admin/admin2/admin2.pem
x chainmaker-v2.2.1-node3/config/node3/admin/admin2/admin2.key
x chainmaker-v2.2.1-node3/config/node3/admin/admin1/admin1.pem
x chainmaker-v2.2.1-node3/config/node3/admin/admin1/admin1.key
x chainmaker-v2.2.1-node3/config/node3/chainconfig/bc1.yml
x chainmaker-v2.2.1-node3/bin/docker-vm-standalone-start.sh
x chainmaker-v2.2.1-node3/bin/restart.sh
x chainmaker-v2.2.1-node3/bin/docker-vm-standalone-stop.sh
x chainmaker-v2.2.1-node3/bin/init.sh
x chainmaker-v2.2.1-node3/bin/run.sh
x chainmaker-v2.2.1-node3/bin/stop.sh
x chainmaker-v2.2.1-node3/bin/chainmaker
x chainmaker-v2.2.1-node3/bin/chainmaker.service
x chainmaker-v2.2.1-node3/bin/start.sh
x chainmaker-v2.2.1-node4/
x chainmaker-v2.2.1-node4/bin/
x chainmaker-v2.2.1-node4/config/
x chainmaker-v2.2.1-node4/lib/
x chainmaker-v2.2.1-node4/log/
x chainmaker-v2.2.1-node4/lib/wxdec
x chainmaker-v2.2.1-node4/lib/libwasmer.dylib
x chainmaker-v2.2.1-node4/config/node4/
x chainmaker-v2.2.1-node4/config/node4/log.yml
x chainmaker-v2.2.1-node4/config/node4/chainconfig/
x chainmaker-v2.2.1-node4/config/node4/admin/
x chainmaker-v2.2.1-node4/config/node4/user/
x chainmaker-v2.2.1-node4/config/node4/chainmaker.yml
x chainmaker-v2.2.1-node4/config/node4/node4.pem
x chainmaker-v2.2.1-node4/config/node4/node4.nodeid
x chainmaker-v2.2.1-node4/config/node4/node4.key
x chainmaker-v2.2.1-node4/config/node4/user/client1/
x chainmaker-v2.2.1-node4/config/node4/user/client1/client1.pem
x chainmaker-v2.2.1-node4/config/node4/user/client1/client1.key
x chainmaker-v2.2.1-node4/config/node4/user/client1/client1.addr
x chainmaker-v2.2.1-node4/config/node4/admin/admin1/
x chainmaker-v2.2.1-node4/config/node4/admin/admin2/
x chainmaker-v2.2.1-node4/config/node4/admin/admin5/
x chainmaker-v2.2.1-node4/config/node4/admin/admin4/
x chainmaker-v2.2.1-node4/config/node4/admin/admin3/
x chainmaker-v2.2.1-node4/config/node4/admin/admin3/admin3.pem
x chainmaker-v2.2.1-node4/config/node4/admin/admin3/admin3.key
x chainmaker-v2.2.1-node4/config/node4/admin/admin4/admin4.pem
x chainmaker-v2.2.1-node4/config/node4/admin/admin4/admin4.key
x chainmaker-v2.2.1-node4/config/node4/admin/admin5/admin5.pem
x chainmaker-v2.2.1-node4/config/node4/admin/admin5/admin5.key
x chainmaker-v2.2.1-node4/config/node4/admin/admin2/admin2.pem
x chainmaker-v2.2.1-node4/config/node4/admin/admin2/admin2.key
x chainmaker-v2.2.1-node4/config/node4/admin/admin1/admin1.pem
x chainmaker-v2.2.1-node4/config/node4/admin/admin1/admin1.key
x chainmaker-v2.2.1-node4/config/node4/chainconfig/bc1.yml
x chainmaker-v2.2.1-node4/bin/docker-vm-standalone-start.sh
x chainmaker-v2.2.1-node4/bin/restart.sh
x chainmaker-v2.2.1-node4/bin/docker-vm-standalone-stop.sh
x chainmaker-v2.2.1-node4/bin/init.sh
x chainmaker-v2.2.1-node4/bin/run.sh
x chainmaker-v2.2.1-node4/bin/stop.sh
x chainmaker-v2.2.1-node4/bin/chainmaker
x chainmaker-v2.2.1-node4/bin/chainmaker.service
x chainmaker-v2.2.1-node4/bin/start.sh
===> Starting chainmaker cluster
START ==> /Users/hanru/Documents/程序咖/chainmaker/chainmaker-go/build/release/chainmaker-v2.2.1-node1
chainmaker is startting, pls check log...
START ==> /Users/hanru/Documents/程序咖/chainmaker/chainmaker-go/build/release/chainmaker-v2.2.1-node2
chainmaker is startting, pls check log...
START ==> /Users/hanru/Documents/程序咖/chainmaker/chainmaker-go/build/release/chainmaker-v2.2.1-node3
chainmaker is startting, pls check log...
START ==> /Users/hanru/Documents/程序咖/chainmaker/chainmaker-go/build/release/chainmaker-v2.2.1-node4
chainmaker is startting, pls check log...
hanru@localhost scripts %
启动效果:
- 启动成功后,将*.gar.gz备份,以免下次启动再次解压缩时文件被覆盖
$ mkdir -p ../build/bak
$ mv ../build/release/*.tar.gz ../build/bak
做好备份:
若需要关闭集群,使用脚本:
$ ./cluster_quick_stop.sh
2.3.1.6. 查看节点启动使用正常
- 查看进程是否存在
$ ps -ef|grep chainmaker | grep -v grep
25261 2146 4 19:55 pts/20 00:00:01 ./chainmaker start -c ../config/wx-org1.chainmaker.org/chainmaker.yml
25286 2146 4 19:55 pts/20 00:00:01 ./chainmaker start -c ../config/wx-org2.chainmaker.org/chainmaker.yml
25309 2146 4 19:55 pts/20 00:00:01 ./chainmaker start -c ../config/wx-org3.chainmaker.org/chainmaker.yml
25335 2146 4 19:55 pts/20 00:00:01 ./chainmaker start -c ../config/wx-org4.chainmaker.org/chainmaker.yml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQdXgf2V-1659584466473)(https://img.chengxuka.com/[email protected])]
- 查看端口是否监听
$ netstat -lptn | grep 1230
tcp6 0 0 :::12301 :::* LISTEN 25261/./chainmaker
tcp6 0 0 :::12302 :::* LISTEN 25286/./chainmaker
tcp6 0 0 :::12303 :::* LISTEN 25309/./chainmaker
tcp6 0 0 :::12304 :::* LISTEN 25335/./chainmaker
mac下,命令稍改一下:netstat -anv | grep 1230
- 检查节点是否有
ERROR
日志
$ cat ../build/release/*/bin/panic.log
$ cat ../build/release/*/log/system.log
$ cat ../build/release/*/log/system.log |grep "ERROR\|put block\|all necessary"
打开活动监视器也能看见这4个服务: