启动支持旧版本Docker_VM的链
通过管理台启动启用Docker虚拟机的链
登录
私有化部署本平台时会生成的对应的admin账号,默认密码为a123456
新增组织证书
填写组织ID和组织名称
组织和和组织名称不能重复
支持申请国密和非国密两种证书。
新增节点证书
目前节点证书角色分为共识节点和同步节点两种。
通过填写节点名称、组织信息,节点角色,申请节点证书。
支持申请国密和非国密两种证书。
新增用户证书
目前用户证书角色分为admin、client和light三种。
通过填写用户名称、组织信息,用户角色申请用户证书。
支持申请国密和非国密两种证书。
合约部署需要对应的管理员证书,所以需要申请对应的管理员用户
新建区块链
选择证书模式
链配置文件参数设定
此处用于新增链配置文件,目前支持自定义链的id、名称、区块最大容量,出块间隔、交易过期时长,以及共识配置。
目前支持配置TBFT、RAFT、SOLO、MAXBFT共识。
申请链配置文件前,请先确保,所需的组织和节点证书已经申请/导入本管理平台。
此处需要勾选Docker_VM
支持单机部署和多机部署,请正确填写所要之后要部署区块链节点的机器所在的ip,并确保端口不冲突。
下载部署链
如图所示需要先下载安装Docker_VM的环境依赖,然后再部署区块链。
部署区块链
下载链配置以zip包为准,zip包包含对应的链配置文件和部署脚本
将下载的包移动的需要部署的机器上去(可以使用scp进行移动)
执行
unzip
解压成release
包,进入release
包执行start.sh
进行启动
快速订阅链
链部署成功之后在管理台进行快速订阅
部署/调用合约验证链是否正常
订阅成功后,可进行部署/调用示例合约,以检查链功能是否正常。部署合约的使用教程可详见:部署示例合约。
通过命令行启动启用Docker虚拟机的链
环境依赖
操作系统
DockerVM实现依赖于cgroup,目前仅支持在Linux系统下部署和运行DockerVM。
软件依赖
docker,7zip
依赖软件下载:
docker:请参看https://docs.docker.com/engine/install/
7zip:请参看7zip官网
拉取官方Docker虚拟机镜像:
docker pull chainmakerofficial/chainmaker-vm-engine:v2.3.0.1
生成证书并初始化配置
启用DockerVM
在chainmaker中启用Docker VM有两种方式。
方式一:
通过命令行工具启动链,在执行prepare.sh
、prepare_pk.sh
、prepare_pwk.sh
时,enable docker vm
选择 YES
enable docker vm (YES|NO(default))
进入chainmaker-go/scripts目录,执行prepare.sh脚本生成单链4节点集群配置,存于路径chainmaker-go/build中
prepare_pk.sh脚本支持生成4/7/10/13/16节点公私钥和配置
# 进入脚本目录
$ cd ../scripts
# 查看脚本帮助
$ ./prepare.sh -h
Usage:
prepare.sh node_cnt(1/4/7/10/13/16) chain_cnt(1-4) p2p_port(default:11301) rpc_port(default:12301) vm_go_runtime_port(default:32351) vm_go_engine_port(default:22351)
eg1: prepare.sh 4 1
eg2: prepare.sh 4 1 11301 12301
eg2: prepare.sh 4 1 11301 12301 32351 22351
# 生成单链4节点集群的证书和配置
./prepare.sh 4 1
begin check params...
begin generate certs, cnt: 4
input consensus type (0-SOLO,1-TBFT(default),3-MAXBFT,4-RAFT):
input log level (DEBUG|INFO(default)|WARN|ERROR):
enable vm go (YES|NO(default))YES
vm go transport protocol (uds|tcp(default))
input vm go log level (DEBUG|INFO(default)|WARN|ERROR):
config node total 4
begin generate node1 config...
begin node1 chain1 cert config...
begin node1 trust config...
begin generate node2 config...
begin node2 chain1 cert config...
begin node2 trust config...
begin generate node3 config...
begin node3 chain1 cert config...
begin node3 trust config...
begin generate node4 config...
begin node4 chain1 cert config...
begin node4 trust config...
# 查看生成好的节点证书和配置
$ tree -L 3 ../build/
../build/
├── backup
│ ├── backup_certs
│ │ ├── crypto-config_20220816164215
│ │ ├── crypto-config_20220816193731
│ │ ├── crypto-config_20220816193745
│ │ ├── crypto-config_20220817195010
│ │ ├── crypto-config_20220819164151
│ │ ├── crypto-config_20220822204421
│ │ ├── crypto-config_20220823193308
│ │ └── crypto-config_20220823193419
│ ├── backup_config
│ │ └── config_20220823193425
│ └── backup_release
│ ├── release_20220808210208
│ ├── release_20220809203122
│ ├── release_20220816193816
│ ├── release_20220817195117
│ └── release_20220819164434
├── config
│ ├── node1
│ │ ├── certs
│ │ ├── chainconfig
│ │ ├── chainmaker.yml
│ │ └── log.yml
│ ├── node2
│ │ ├── certs
│ │ ├── chainconfig
│ │ ├── chainmaker.yml
│ │ └── log.yml
│ ├── node3
│ │ ├── certs
│ │ ├── chainconfig
│ │ ├── chainmaker.yml
│ │ └── log.yml
│ └── node4
│ ├── certs
│ ├── chainconfig
│ ├── chainmaker.yml
│ └── log.yml
├── crypto-config
│ ├── wx-org1.chainmaker.org
│ │ ├── ca
│ │ ├── node
│ │ └── user
│ ├── wx-org2.chainmaker.org
│ │ ├── ca
│ │ ├── node
│ │ └── user
│ ├── wx-org3.chainmaker.org
│ │ ├── ca
│ │ ├── node
│ │ └── user
│ └── wx-org4.chainmaker.org
│ ├── ca
│ ├── node
│ └── user
├── crypto_config.yml
├── pkcs11_keys.yml
└── release
├── chainmaker-v2.3.0-wx-org1.chainmaker.org
│ ├── bin
│ ├── config
│ ├── data
│ ├── lib
│ └── log
├── chainmaker-v2.3.0-wx-org1.chainmaker.org-20220819164205-x86_64.tar.gz
├── chainmaker-v2.3.0-wx-org2.chainmaker.org
│ ├── bin
│ ├── config
│ ├── lib
│ └── log
├── chainmaker-v2.3.0-wx-org2.chainmaker.org-20220819164205-x86_64.tar.gz
├── chainmaker-v2.3.0-wx-org3.chainmaker.org
│ ├── bin
│ ├── config
│ ├── lib
│ └── log
├── chainmaker-v2.3.0-wx-org3.chainmaker.org-20220819164205-x86_64.tar.gz
├── chainmaker-v2.3.0-wx-org4.chainmaker.org
│ ├── bin
│ ├── config
│ ├── lib
│ └── log
├── chainmaker-v2.3.0-wx-org4.chainmaker.org-20220819164205-x86_64.tar.gz
└── crypto-config-20220819164205.tar.gz
方式二
修改节点配置目录下的chainmaker.yml
文件(enable
设置为true
):
vm:
go:
# 是否启用新版Golang容器
enable: true
DockerVM配置
配置信息说明
chainmaker.yml 文件相关配置如下:
vm:
go:
# 是否启用新版Golang容器
enable: true
# 数据挂载路径, 包括合约、sock文件(uds)
data_mount_path: ../data/wx-org1.chainmaker.org/go
# 日志挂载路径
log_mount_path: ../log/wx-org1.chainmaker.org/go
# chainmaker和合约引擎之间的通信协议(可选tcp/uds)
protocol: tcp
# 如果需要自定义高级配置,请将vm.yml文件放入dockervm_config_path中,优先级:chainmaker.yml > vm.yml > 默认配置
# dockervm_config_path: /config_path/vm.yml
# 是否在控制台打印日志
log_in_console: false
# docker合约引擎的日志级别
log_level: DEBUG
# 下面两个server的最大消息发送大小, 默认100MB
max_send_msg_size: 100
# 下面两个server的最大消息接收大小, 默认100MB
max_recv_msg_size: 100
# 下面两个server的最大连接超时时间, 默认10s
dial_timeout: 10
# 合约引擎最多启用的原始合约进程数,默认为20(跨合约调用会额外拉起新的进程)
max_concurrency: 20
# 运行时服务器配置 (与合约实例进程交互,进行信息交换)
runtime_server:
# 端口号,默认为 32351
port: 32351
# 合约引擎服务器配置 (与chainmaker交互,进行交易请求、合约请求等交互)
contract_engine:
# 合约引擎服务器ip, 默认为 127.0.0.1
host: 127.0.0.1
# 端口号,默认为 22351
port: 22351
# 与合约引擎服务器的最大连接数
max_connection: 5
⚠️注意:旧版本的合约不支持在新版DockerVM中运行,为了兼容历史合约,我们支持同时运行两个DockerVM,旧的DockerVM用于执行老版本的合约,所以在chainmaker.yml中有两套关于DockerVM的配置项vm:go
、vm:docker_go
分别对新、旧DockerVM进行配置。
新旧版本名称对照如下表:
新版本 | 旧版本 | |
---|---|---|
官方镜像名称 | chainmakerofficial/chainmaker-vm-engine:v2.3.0.1 | chainmakerofficial/chainmaker-vm-docker-go:v2.3.0.1 |
chainmaker.yml中对应配置项 | vm:go | vm:docker_go |
合约版本 | v2.3.0 | v2.2.1及更低版本 |
如果需要启动旧合约引擎容器,需要将之前的配置迁移到vm:docker_go
:
# Contract Virtual Machine(VM) configs
vm:
# Docker go virtual machine configuration
docker_go:
# Enable docker go virtual machine
enable_dockervm: true
# Mount point in chainmaker
dockervm_mount_path: ../data/wx-org1.chainmaker.org/docker-go
# Specify log file path
dockervm_log_path: ../log/wx-org1.chainmaker.org/docker-go
# Whether to print log at terminal
log_in_console: true
# Log level
log_level: DEBUG
# Unix domain socket open, used for chainmaker and docker manager communication
uds_open: true
# docker vm contract service host, default 127.0.0.1
docker_vm_host: 127.0.0.1
# docker vm contract service port, default 22351
docker_vm_port: 22451
# Grpc max send message size, Default size is 4, Unit: MB
max_send_msg_size: 20
# Grpc max receive message size, Default size is 4, Unit: MB
max_recv_msg_size: 20
# max number of connection created to connect docker vm service
max_connection: 5
启用旧版DockerVM时,配置迁移对照如下图:
通过配置废弃旧合约的安装或升级,只使用新合约
如果希望废弃旧合约的安装或升级,只使用新合约,请添加或修改下面的配置:
# Contract Virtual Machine(VM) configs
vm:
# Docker go virtual machine configuration
docker_go:
# Grpc max receive message size, Default size is 4, Unit: MB
disable_install: true
# max number of connection created to connect docker vm service
disable_upgrade: true
高级配置
如果希望使用合约引擎高级配置,需要配置vm:go
下dockervm_config_path
中配置文件,配置文件模板如下:
########### RPC ###########
rpc:
chain_rpc_protocol: 1 # chain rpc protocol, 0 for unix domain socket, 1 for tcp(default)
chain_host: 127.0.0.1 # chain tcp host
chain_rpc_port: 22351 # chain rpc port, valid when protocol is tcp
sandbox_rpc_port: 32351 # sandbox rpc port, valid when protocol is tcp
max_send_msg_size: 100 # max send msg size(MiB)
max_recv_msg_size: 100 # max recv msg size(MiB)
server_min_interval: 60s # server min interval
connection_timeout: 5s # connection timeout time
server_keep_alive_time: 60s # idle duration before server ping
server_keep_alive_timeout: 20s # ping timeout
########### Process ###########
process:
# max original process num,
# max_call_contract_process_num = max_original_process_num * max_contract_depth (defined in protocol)
# max_total_process_num = max_call_contract_process_num + max_original_process_num
max_original_process_num: 20
exec_tx_timeout: 8s # process timeout while busy
waiting_tx_time: 200ms # process timeout while tx completed (busy -> idle)
release_rate: 30 # percentage of idle processes released periodically in total processes (0-100)
release_period: 10m # period of idle processes released periodically in total processes
########### Log ###########
log:
contract_engine:
level: "info"
console: true
sandbox:
level: "info"
console: true
########### Pprof ###########
pprof:
contract_engine:
enable: false
port: 21215
sandbox:
enable: false
port: 21522
########### Contract ###########
contract:
max_file_size: 20480 # contract size(MiB)
⚠️注意:
在容器启动脚本中,max_concurrency
(最大启用的进程数量)默认为20
(跨合约调用会额外拉起新的进程)。
如果是在生产环境下,建议根据cpu核数配置这三个参数。
8C CPU | 16C CPU | 32C CPU | |
---|---|---|---|
max_concurrency | 20 | 100 | 1500 |
如果有较多跨合约调用交易,请根据跨合约调用的深度按比例减少max_concurrency
的值,例如32核系统下,如果有较多两层跨合约调用,则max_concurrency
值建议设为750(1500/2)
。
如果使用脚本启动,请按需修改脚本里的参数配置。
编译和安装包制作
生成证书(prepare.sh脚本)后执行build_release.sh脚本,将编译chainmaker-go模块,并打包生成安装,存于路径chainmaker-go/build/release中
$ ./build_release.sh
$ tree ../build/release/
../build/release/
├── chainmaker-v2.3.0-wx-org1.chainmaker.org-20220823193812-x86_64.tar.gz
├── chainmaker-v2.3.0-wx-org2.chainmaker.org-20220823193812-x86_64.tar.gz
├── chainmaker-v2.3.0-wx-org3.chainmaker.org-20220823193812-x86_64.tar.gz
├── chainmaker-v2.3.0-wx-org4.chainmaker.org-20220823193812-x86_64.tar.gz
└── crypto-config-20220823193812.tar.gz
同时启动链和DockerVM
启动
执行cluster_quick_start.sh脚本,会解压各个安装包,调用bin目录中的start.sh脚本,启动chainmaker节点,并拉起节点需要的DockerVM容器
$ ./cluster_quick_start.sh normal
查看节点是否存在
查看进程
$ ps -ef|grep chainmaker | grep -v grep
2058348 1 4 19:40 pts/5 00:00:00 ./chainmaker start -c ../config/wx-org1.chainmaker.org/chainmaker.yml
2059604 1 3 19:40 pts/5 00:00:00 ./chainmaker start -c ../config/wx-org2.chainmaker.org/chainmaker.yml
2060801 1 4 19:40 pts/5 00:00:00 ./chainmaker start -c ../config/wx-org3.chainmaker.org/chainmaker.yml
2062057 1 5 19:40 pts/5 00:00:00 ./chainmaker start -c ../config/wx-org4.chainmaker.org/chainmaker.yml
查看端口
$ netstat -lptn | grep 1230
tcp6 0 0 :::12301 :::* LISTEN 2058348/./chainmake
tcp6 0 0 :::12302 :::* LISTEN 2059604/./chainmake
tcp6 0 0 :::12303 :::* LISTEN 2060801/./chainmake
tcp6 0 0 :::12304 :::* LISTEN 2062057/./chainmake
查看DockerVM容器
$ docker ps | grep "chainmakerofficial/chainmaker-vm-engine:v2.3.0.1"
0955ccdb6ebc chainmakerofficial/chainmaker-vm-engine:v2.3.0.1 "/bin/startvm" 4 minutes ago Up 4 minutes VM-GO-wx-org4.chainmaker.org
b48bbb69e204 chainmakerofficial/chainmaker-vm-engine:v2.3.0.1 "/bin/startvm" 4 minutes ago Up 4 minutes VM-GO-wx-org3.chainmaker.org
727adbb76c58 chainmakerofficial/chainmaker-vm-engine:v2.3.0.1 "/bin/startvm" 4 minutes ago Up 4 minutes VM-GO-wx-org2.chainmaker.org
2c944fb3a1d9 chainmakerofficial/chainmaker-vm-engine:v2.3.0.1 "/bin/startvm" 4 minutes ago Up 4 minutes VM-GO-wx-org1.chainmaker.org
查看日志
$ cat ../build/release/*/bin/panic.log
$ cat ../build/release/*/log/system.log
$ cat ../build/release/*/log/system.log |grep "ERROR\|put block\|all necessary"
独立部署DockerVM虚拟机
首先去./build/release
路径下解压各个节点证书及配置的jar包:
tar -zxvf chainmaker-v2.3.0-wx-org4.chainmaker.org-20220824115035-x86_64.tar.gz
启动节点1需要的DockerVM
使用docker-vm-standalone-start.sh脚本启动DockerVM
$ ./docker-vm-standalone-start.sh
input path to cache contract files(must be absolute path, default:'./docker-go'): /home/data/wx-org1.chainmaker.org/go
contracts path does not exist, create it or not(y|n): y
input log path(must be absolute path, default:'./log'): /home/log/wx-org1.chainmaker.org/go
log path does not exist, create it or not(y|n): y
input log level(DEBUG|INFO(default)|WARN|ERROR): DEBUG
input expose port(default 22351): 22351
input runtime port(default 32351): 32351
input container name(default 'chainmaker-docker-vm'): VM-GO-wx-org1.chainmaker.org
# 不使用配置文件启动DockerVM,忽略该项
input vm config file path(use default config(default)):
docker-vm config is nil, use default config
start docker vm container
使用Docker命令启动
$ docker run -itd \
--net=host \
-v "/home/data/wx-org1.chainmaker.org/go":/mount \
-v "/home/log/wx-org1.chainmaker.org/go":/log \
-e CHAIN_RPC_PROTOCOL="1" \
-e CHAIN_RPC_PORT="22351" \
-e SANDBOX_RPC_PORT="32351" \
-e MAX_SEND_MSG_SIZE="100" \
-e MAX_RECV_MSG_SIZE="100" \
-e MAX_CONN_TIMEOUT="10" \
-e MAX_ORIGINAL_PROCESS_NUM="20" \
-e DOCKERVM_CONTRACT_ENGINE_LOG_LEVEL="DEBUG" \
-e DOCKERVM_SANDBOX_LOG_LEVEL="DEBUG" \
-e DOCKERVM_LOG_IN_CONSOLE="false" \
--name VM-GO-wx-org1.chainmaker.org \
--privileged chainmakerofficial/chainmaker-vm-engine:v2.3.0.1 \
> /dev/null
然后启动节点1
$ ./start.sh -f alone
查看节点和容器是否已经建立链接
$ cat /home/log/wx-org1.chainmaker.org/go/go.log |grep "Chain RPC Service"
按照上述步骤依次启动剩余节点。
使用高级配置独立部署DockerVM
高级配置
如果希望使用合约引擎高级配置,需要配置vm:go
下dockervm_config_path
高级配置文件路径,这里我们把节点1的DockerVM高级配置文件vm.yml放置在/home/config_path/wx-org1.chainmaker.org
,在chainmaker.yml中对应的配置如下:
# Contract Virtual Machine(VM) configs
vm:
# Golang runtime in docker container
go:
...
# If use a customized VM configuration file, supplement it; else, do not configure
# Priority: chainmaker.yml > vm.yml > default settings
dockervm_config_path: /home/config_path/wx-org1.chainmaker.org/vm.yml
...
配置文件模板如下:
########### RPC ###########
rpc:
chain_rpc_protocol: 1 # chain rpc protocol, 0 for unix domain socket, 1 for tcp(default)
chain_host: 127.0.0.1 # chain tcp host
chain_rpc_port: 22351 # chain rpc port, valid when protocol is tcp
sandbox_rpc_port: 32351 # sandbox rpc port, valid when protocol is tcp
max_send_msg_size: 100 # max send msg size(MiB)
max_recv_msg_size: 100 # max recv msg size(MiB)
server_min_interval: 60s # server min interval
connection_timeout: 5s # connection timeout time
server_keep_alive_time: 60s # idle duration before server ping
server_keep_alive_timeout: 20s # ping timeout
########### Process ###########
process:
# max original process num,
# max_call_contract_process_num = max_original_process_num * max_contract_depth (defined in protocol)
# max_total_process_num = max_call_contract_process_num + max_original_process_num
max_original_process_num: 20
exec_tx_timeout: 8s # process timeout while busy
waiting_tx_time: 200ms # process timeout while tx completed (busy -> idle)
release_rate: 30 # percentage of idle processes released periodically in total processes (0-100)
release_period: 10m # period of idle processes released periodically in total processes
########### Log ###########
log:
contract_engine:
level: "info"
console: true
sandbox:
level: "info"
console: true
########### Pprof ###########
pprof:
contract_engine:
enable: false
port: 21215
sandbox:
enable: false
port: 21522
########### Contract ###########
contract:
max_file_size: 20480 # contract size(MiB)
使用高级配置启动节点需要的DockerVM
使用docker-vm-standalone-start.sh脚本启动DockerVM
$ ./docker-vm-standalone-start.sh
input path to cache contract files(must be absolute path, default:'./docker-go'): /home/data/wx-org1.chainmaker.org/go
contracts path does not exist, create it or not(y|n): y
input log path(must be absolute path, default:'./log'): /home/log/wx-org1.chainmaker.org/go
log path does not exist, create it or not(y|n): y
## 使用配置文件,忽略该项
input log level(DEBUG|INFO(default)|WARN|ERROR):
## 使用配置文件,忽略该项
input expose port(default 22351):
## 使用配置文件,忽略该项
input runtime port(default 32351):
input container name(default 'chainmaker-docker-vm'): VM-GO-wx-org1.chainmaker.org
input vm config file path(use default config(default)): /home/config_path/wx-org1.chainmaker.org/vm.yml
start docker vm container
使用Docker命令启动DockerVM
$ docker run -itd \
--net=host \
-v "/home/data/wx-org1.chainmaker.org/go":/mount \
-v "/home/log/wx-org1.chainmaker.org/go":/log \
--name VM-GO-wx-org1.chainmaker.org \
--privileged chainmakerofficial/chainmaker-vm-engine:v2.3.0.1 \
> /dev/null
启动节点
$ ./start.sh -f alone
查看节点是否和DockerVM已经建立连接
$ cat /home/log/wx-org1.chainmaker.org/go/go.log |grep "Chain RPC Service"
按照上述步骤依次启动剩余节点。
本地部署的停止
如果是通过./cluster_quick_start.sh
同时启动的节点和虚拟机,可以通过对应的stop脚本同时停止链和DockerVM容器:
$ ./cluster_quick_stop.sh
如果同时需要清除所有链数据可以使用:
$ ./cluster_quick_stop.sh clean
由于DockerVM内使用容器内的root用户启动虚拟机服务,因此日志和缓存文件也属于root用户(uid=0)。如果以非root用户启动的程序,清除数据时可能会报错提示缺少文件访问的权限,需要以root权限删除数据,或者使用userns-remap的功能将容器里用户映射成普通用户。
独立部署的停止
首先关闭链节点
$ ./stop.sh alone
然后关闭该节点对应的虚拟机
$ docker stop VM-GO-wx-org1.chainmaker.org
合约的安装与调用
合约的安装与调用请参考:使用Golang进行智能合约开发