在chainmaker中启用Docker VM
- 每个长安链节点都需要配置和启动docker vm。
- 修改节点配置config目录下的chainmaker.yml文件:
# Docker go virtual machine configuration
vm:
# Enable docker go virtual machine
enable_dockervm: true
# Mount point in chainmaker
dockervm_mount_path: ../data/org1/docker-go
# Specify log file path
dockervm_log_path: ../log/org1/docker-go
# Whether to print log at terminal
log_in_console: false
# Log level
log_level: INFO
# Unix domain socket open, used for chainmaker and docker manager communication
uds_open: true
# 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
- 修改节点配置bin目录下的start.sh文件:
主要添加-e ENV_MAX_SEND_MSG_SIZE=20 -e ENV_MAX_RECV_MSG_SIZE=20以避免后续部署合约时,因请求消息太大导致部署不成功现象发生。
代码语言:javascript复制 docker run -itd
-e ENV_LOG_IN_CONSOLE="$log_in_console" -e ENV_LOG_LEVEL="$log_level" -e ENV_ENABLE_UDS=true
-e ENV_USER_NUM=1000 -e ENV_MAX_CONCURRENCY=100 -e ENV_TX_TIME_LIMIT=8
-e ENV_MAX_SEND_MSG_SIZE=20 -e ENV_MAX_RECV_MSG_SIZE=20
-v "$mount_path":/mount
-v "$log_path":/log
--name DOCKERVM-ljh-org3.qianjinlian.com
--privileged $image_name
- 启动docker vm:
在 UNIX Domain Socket 的连接模式中(官方还提供一种TCP方式,没特殊要求可以就用socket模式),节点配置
bin
目录下start.sh
脚本会自动拉起Docker VM容器,在已经启动的环境下,上述步骤配置完成后,可以使用restart.sh重启节点即可启动docker vm。 - 停止docker vm:
在 UNIX Domain Socket 的连接模式中,停止节点时,节点配置
bin
目录下的stop.sh
脚本自动停止Docker VM容器。 也可以使用docker命令单独停止Docker VM容器。
使用CMC工具部署和调用GO智能合约
创建合约
下边是以官方提供的contract_fact存证示例合约为例:
代码语言:javascript复制./cmc client contract user create
--contract-name=contract_fact
--runtime-type=DOCKER_GO
--byte-code-path=./testdata/docker-go-demo/contract_fact.7z
--version=1.0
--sdk-conf-path=./testdata/sdk_config.yml
--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.key,./testdata/crypto-config/wx-org4.chainmaker.org/user/admin1/admin1.tls.key
--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.tls.crt,./testdata/crypto-config/wx-org4.chainmaker.org/user/admin1/admin1.tls.crt
--sync-result=true
--params="{}"
这里可能会出现一个问题就是:请求消息太大,导致部署不成功。错误提示语如下
代码语言:javascript复制trying to send message larger than max (6153962 vs. 4194304)
此时需要修改连接配置:testdata/sdk_config.yml里边的rpc_client:
代码语言:javascript复制 rpc_client:
max_receive_message_size: 1000
max_send_message_size: 1000
把max_send_message_size调大一些。这里还需要提一点就是JAVA SDK 2.2.0版本不支持max_send_message_size配置,算是一个BUG,所以如果尝试使用JAVA SDK部署合约时,发生上边的错误暂时只能改为通过CMC去部署。
调用合约
代码语言:javascript复制./cmc client contract user invoke
--contract-name=contract_fact
--method=invoke_contract
--sdk-conf-path=./testdata/sdk_config.yml
--params="{"method":"save","file_name":"name007","file_hash":"ab3456df5799b87c77e7f88","time":"6543234"}"
--sync-result=true
查询合约
代码语言:javascript复制./cmc client contract user get
--contract-name=contract_fact
--method=invoke_contract
--sdk-conf-path=./testdata/sdk_config.yml
--params="{"method":"findByFileHash","file_hash":"ab3456df5799b87c77e7f88"}"