BSC链智能合约质押挖矿模式系统开发

2022-10-25 16:13:12 浏览数 (1)

在chainmaker中启用Docker VM

  • 每个长安链节点都需要配置和启动docker vm。
  • 修改节点配置config目录下的chainmaker.yml文件:
代码语言:javascript复制
# 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"}"

0 人点赞