部署长安链与智能合约

前置需求

  • linux(以Ubuntu22.04为例)
  • docker
  • docker-compose

安装长安链管理平台

  • 新建docker-compose.yml文件如下:

    version: "3.9"
    
    services:
      cm_db:
        image: mysql:5.7
        volumes:
          - db_data:/var/lib/mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: Baec&chainmaker
          MYSQL_USER: chainmaker
          MYSQL_PASSWORD: Baec&chainmaker
          MYSQL_DATABASE: chainmaker_dev
        command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--max_allowed_packet=200M']
    
      cm_mgmt_server:
        depends_on:
          - cm_db
        image: chainmakerofficial/management-backend:v2.3.0
        ports:
          - "9999:9999"
        restart: always
    
      cm_mgmt_web:
        depends_on:
          - cm_mgmt_server
        image: chainmakerofficial/management-web:v2.3.0
        ports:
          - "80:80"
        restart: always
    
    volumes:
      db_data: {}
    
    • 这里指定版本号为2.3.0最新版
    • 可以修改cm_mgmt_web的端口,使用反向代理,一般情况下保持默认即可
  • 启动容器

    • docker-compose up -d
      
    • # 查看容器运行状况
      docker ps
      
      • 可以看到三个容器正在运行

创建证书

  • 进入管理平台
    • 假设我的服务器ip为192.168.60.130,web端口为80,则可以通过http://192.168.60.130:80来进入管理后台
    • 默认用户名:admin
    • 默认密码:a123456
    • image-20240128230315598
  • 创建组织证书
    • 链账户管理 -> 证书账户 -> 组织证书 -> 申请组织证书
    • image-20240128230405865
    • 一个组织对应两个条目( 签名私钥、签名证书)
  • 创建节点证书
    • 链账户管理 -> 证书账户 -> 节点证书 -> 申请节点证书
    • SOLO模式下需要1个节点以上,建议创建4个以上共识节点,以便后续操作。
    • image-20240128230516866
    • 一个节点对应了4个条目(签名私钥,签名证书,tls私钥,tls证书)
  • 创建用户证书
    • 链账户管理 -> 证书账户 -> 用户证书 -> 申请用户证书
    • image-20240128230644339
    • 一个用户对应了4个条目(签名私钥,签名证书,tls私钥,tls证书)

创建链配置

  • 区块链管理 -> 新建区块链
  • image-20240128230759332
  • 密码算法:国密(与前面创建证书时相对应)
  • 共识策略:推荐TBFT(需要4个以上共识节点)
  • 勾选节点:
    • image-20240128230914999
  • 配置连接信息:
    • image-20240128230937889
    • 因为我直接在当前服务器部署,所以ip为服务器的ip
    • 如果需要在其他服务器部署链,填写其他服务器的ip即可
    • 将部署的设备和管理后台必须可以相互访问
  • 在点击下一步后,进入部署阶段:
    • image-20240128231139320

部署链

  • 下载配置文件
    • image-20240128231201050
  • 将配置文件解压到服务器上的任意目录
    • image-20240128231247475
  • 授予执行权限
    • sudo -R 777 ./release
      
    • 直接给全部权限就行,如果有需要,可以只给执行权限
  • 以管理员身份启动链
    • cd release
      sudo ./start.sh
      
    • image-20240128231444517
  • 检查是否已经正常启动
    • ps -ef | grep chainmaker
      
    • image-20240128231516782
    • 因为我创建了6个节点,所以有6个进程

订阅链

  • 回到管理平台,点击下一步,立即订阅
  • 你需要确保管理后台的服务器可以访问到链所在服务器拉取镜像

智能合约的编写

  • 这里使用c++编写智能合约
    • go编写的智能合约不一定能部署,这个bug在2024/01/28为止还没修复,疑似docker_go环境通讯问题
    • 使用官方提供的docker环境进行智能合约的编写
  • 拉取镜像
    • docker pull chainmakerofficial/chainmaker-cpp-contract:2.1.0
      
  • 启动容器
    • docker run -d --name chainmaker-cpp-contract -v $WORK_DIR:/home chainmakerofficial/chainmaker-cpp-contract:2.1.0 bash -c "while true; do echo hello world; sleep 5;done"
      
    • 注意,这里的$WORK_DIR需要替换为你的工作目录,比如我将在./cpp-contracts这个目录下写智能合约,那就输入./cpp-contracts
  • 进入容器
    • docker exec -it chainmaker-cpp-contract bash
      
    • 注意这里的容器名对应
  • 将示例代码解压到容器中的/home目录
    • cd /home/
      tar xvf /data/contract_cpp_template.tar.gz
      
  • 编译示例合约
    • make clean
      emmake make
      
    • image-20240128232338118
    • 可以看到wasm文件已经编译出来了
    • 在容器外编译智能合约:
    • docker exec -it chainmaker-cpp-contract /bin/bash -c  "cd /home/contract_cpp && make clean && emmake make"
      
  • 部署智能合约
    • 因为已经提前将目录映射到 ./cpp-contracts所以可以在宿主机的这个目录中找到编译完的wasm文件
    • 打开管理后台,进入区块链管理面板
    • 点击合约管理 -> 部署合约
    • image-20240128232515914
    • 合约名称和版本可以自己定
    • 虚拟机类型选择WXVM
    • 导入生成的合约文件
    • image-20240128232628729
    • 点击确定后,即可看到合约被正常部署到链上
  • 编写自己的智能合约
    • 如果需要编写自己的智能合约,只需修改main.cc文件,在里面编写自己的业务逻辑
    • 然后继续进入容器进行编译即可