• 长安链GO语言智能合约环境搭建及使用


    前提条件

    • 准备一套长安链环境
    • 目前仅支持在Linux系统下部署和运行chainmaker-vm-docker-go
    • 软件依赖
    名称版本描述是否必须
    docker18+独立运行容器
    7zip16+压缩、解压合约文件

    安装部署

    7zip安装

    1. wget http://101.34.22.188/7-zip/p7zip-16.02-10.el7.x86_64.rpm -P /opt
    2. rpm -ivh /opt/p7zip-16.02-10.el7.x86_64.rpm

    注意事项:

    1. 每台长安链节点服务器都需要安装。
    2. 安装成功后,在centos系统下的使用命令为7za,在ubuntu系统下是7z。
    3. 当使用centos部署go智能合约时,会遇到下述问题:
    fail to extract contract: exec: "7z": executable file not found in $PATH

    原因:长安链在部署go语言合约时,默认使用的是“7z”命令解压go语言智能合约压缩包,故在centos系统下需要做一个软连接把7za改为7z。

    ln -s /usr/bin/7za /usr/bin/7z

    在chainmaker中启用Docker VM

    • 每个长安链节点都需要配置和启动docker vm。
    • 修改节点配置config目录下的chainmaker.yml文件:
    1. # Docker go virtual machine configuration
    2. vm:
    3. # Enable docker go virtual machine
    4. enable_dockervm: true
    5. # Mount point in chainmaker
    6. dockervm_mount_path: ../data/org1/docker-go
    7. # Specify log file path
    8. dockervm_log_path: ../log/org1/docker-go
    9. # Whether to print log at terminal
    10. log_in_console: false
    11. # Log level
    12. log_level: INFO
    13. # Unix domain socket open, used for chainmaker and docker manager communication
    14. uds_open: true
    15. # Grpc max send message size, Default size is 4, Unit: MB
    16. max_send_msg_size: 20
    17. # Grpc max receive message size, Default size is 4, Unit: MB
    18. max_recv_msg_size: 20
    19. # max number of connection created to connect docker vm service
    20. max_connection: 5
    • 修改节点配置bin目录下的start.sh文件:

    主要添加-e ENV_MAX_SEND_MSG_SIZE=20 -e ENV_MAX_RECV_MSG_SIZE=20以避免后续部署合约时,因请求消息太大导致部署不成功现象发生。

    1. docker run -itd \
    2. -e ENV_LOG_IN_CONSOLE="$log_in_console" -e ENV_LOG_LEVEL="$log_level" -e ENV_ENABLE_UDS=true \
    3. -e ENV_USER_NUM=1000 -e ENV_MAX_CONCURRENCY=100 -e ENV_TX_TIME_LIMIT=8 \
    4. -e ENV_MAX_SEND_MSG_SIZE=20 -e ENV_MAX_RECV_MSG_SIZE=20 \
    5. -v "$mount_path":/mount \
    6. -v "$log_path":/log \
    7. --name DOCKERVM-ljh-org3.qianjinlian.com \
    8. --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存证示例合约为例:

    1. ./cmc client contract user create \
    2. --contract-name=contract_fact \
    3. --runtime-type=DOCKER_GO \
    4. --byte-code-path=./testdata/docker-go-demo/contract_fact.7z \
    5. --version=1.0 \
    6. --sdk-conf-path=./testdata/sdk_config.yml \
    7. --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 \
    8. --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 \
    9. --sync-result=true \
    10. --params="{}"

    这里可能会出现一个问题就是:请求消息太大,导致部署不成功。错误提示语如下

    trying to send message larger than max (6153962 vs. 4194304)

    此时需要修改连接配置:testdata/sdk_config.yml里边的rpc_client:

    1. rpc_client:
    2. max_receive_message_size: 1000
    3. max_send_message_size: 1000

    把max_send_message_size调大一些。这里还需要提一点就是JAVA SDK 2.2.0版本不支持max_send_message_size配置,算是一个BUG,所以如果尝试使用JAVA SDK部署合约时,发生上边的错误暂时只能改为通过CMC去部署。

    调用合约

    1. ./cmc client contract user invoke \
    2. --contract-name=contract_fact \
    3. --method=invoke_contract \
    4. --sdk-conf-path=./testdata/sdk_config.yml \
    5. --params="{\"method\":\"save\",\"file_name\":\"name007\",\"file_hash\":\"ab3456df5799b87c77e7f88\",\"time\":\"6543234\"}" \
    6. --sync-result=true

    查询合约

    1. ./cmc client contract user get \
    2. --contract-name=contract_fact \
    3. --method=invoke_contract \
    4. --sdk-conf-path=./testdata/sdk_config.yml \
    5. --params="{\"method\":\"findByFileHash\",\"file_hash\":\"ab3456df5799b87c77e7f88\"}"
  • 相关阅读:
    java入门-----基本语法之语句的使用
    Hyperspectral Imagery Classification Based on Contrastive Learning
    解决使用 Eruda 绑定 dom 未在指定位置显示问题
    【黑马程序员pinik名师讲html】HTML很容易忘记?有它我不慌的
    某男子因用本地虚拟机做压测,惨遭字节面试官当场嘲笑
    从零到一手写迷你版Vue
    「iOS」UI——无限轮播图实现与UIPageControl运用
    目前最火的测试框架,pytest封神级讲解
    大桌子系统升级
    微信小程序的OA会议之首页搭建
  • 原文地址:https://blog.csdn.net/h363659487/article/details/125412174