美文网首页
chainmaker简介

chainmaker简介

作者: 冰冰大象 | 来源:发表于2021-04-09 18:02 被阅读0次

    工作原因需要调研一下chainmaker官网https://www.chainmaker.org

    优势
    1. 社会背景复杂,传说中的国家队
    2. 有一个在使用的案例《北京冷链》
    3. TPS过万满足绝大使用场景,得益于DAG 并发交易执行
    4. 架构简约,功能简单利益学习
    5. 开源
    不足点
    1. 起步相对较晚,配套工具不完善,缺少CA服务(官方不久后会发布CA服务)
    2. 完善技术文档

    由于刚开源所以有些文档描述并不正确,所以主要从SDK角度来学习一下chainmaker
    先看官方架构介绍https://git.chainmaker.org.cn/chainmaker/chainmaker-docs/-/blob/master/ChainMaker_User_Manual.md#user-content-整体架构
    chainmaker共识目前具有solo,TBFT。solo模式用于测试,这里主要以TBFT为主

    证书生成

    chainmaker用户体系采用CA证书,

    1. 下载工具
      git clone --recursive https://git.chainmaker.org.cn/chainmaker/chainmaker-cryptogen.git
      chainmaker-cryptogen是证书生成工具

    2. 进入cd chainmaker-cryptogen/src 执行go build 编译,编译成功如图

    使用./chainmaker-cryptogen generate -c ../config/crypto_config_template.yml 生成的证书文件在crypto-config,其中crypto_config_template.yml为配置文件,修改如下我们生成5个组织


    最终生成的证书集合如下
    打开一个文件看下
    其中ca文件夹里存放的是ca证书,user文件夹主要是放着普通用户和管理员用户,node文件夹分为2种,common是node作为同步节点时使用的证书,consensus是node作为参与共识的节点时使用的证书,其中nodeid为libp2p格式下面会用到

    注 当前项目还不能新增组织,只能通过chainmaker-cryptogen extend来新增用户,所以需要等官方出CA服务

    配置创世块

    1. 配置创世块的文件夹结构不是唯一的 ,这里主要是我为了方便docker-compose使用采用的项目结构
    • certs 证书

      • ca 文件夹存放所有参与共识的节点的ca
      • node user 文件夹就是工具生成的文件夹
    • chainconfig 里bc1.yml为创世块配置文件 里面的讲解看注释好了

    #
    # Copyright (C) BABEC. All rights reserved.
    # Copyright (C) THL A29 Limited, a Tencent company. All rights reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    #
    
    chain_id: chain1    # 链标识
    version: v1.0.0         # 链版本
    sequence: 1             # 配置版本
    auth_type: "identity"   # 认证类型
    
    crypto:
      hash: SHA256
    
    # 交易、区块相关配置
    block:
      tx_timestamp_verify: true # 是否需要开启交易时间戳校验
      tx_timeout: 600  # 交易时间戳的过期时间(秒)
      block_tx_capacity: 100  # 区块中最大交易数
      block_size: 10  # 区块最大限制,单位MB
      block_interval: 2000 # 出块间隔,单位:ms
    
    # core模块
    core:
      tx_scheduler_timeout: 10 #  [0, 60] 交易调度器从交易池拿到交易后, 进行调度的时间
      tx_scheduler_validate_timeout: 10 # [0, 60] 交易调度器从区块中拿到交易后, 进行验证的超时时间
    
    #共识配置
    consensus:
      # 共识类型(0-SOLO,1-TBFT,2-MBFT,3-HOTSTUFF,4-RAFT,10-POW)
      type: 1
      # 共识节点列表,组织必须出现在trust_roots的org_id中,每个组织可配置多个共识节点,节点地址采用libp2p格式 
      # 10.190.28.222 是我本机IP 这里采用4个节点的TBFT共识
      nodes:
        - org_id: "wx-org1.chainmaker.org"
          address:
            - "/ip4/10.190.28.222/tcp/11301/p2p/QmeXXfQgh3yAyA7gvHut3fR96GTucZZsTg92SC64WnV2WX"
        - org_id: "wx-org2.chainmaker.org"
          address:
            - "/ip4/10.190.28.222/tcp/11302/p2p/QmfBAtFNRdiFSGM6mLU1eir7TUA2YtQT5sxBLdWKeZ9vCY"
        - org_id: "wx-org3.chainmaker.org"
          address:
            - "/ip4/10.190.28.222/tcp/11303/p2p/QmX12zQJgWjtKuwZbLgi1Ub6udYKBqWonQZz9uKzaDyTY5"
        - org_id: "wx-org4.chainmaker.org"
          address:
            - "/ip4/10.190.28.222/tcp/11304/p2p/QmWSCTAnJz3mgz6WVWUknFFVpNmQmGGupwBDYii4adUn56"
      ext_config: # 扩展字段,记录难度、奖励等其他类共识算法配置
        - key: aa
          value: chain01_ext11
    
    # 信任组织和根证书 只有参与共识的节点才需要,同步节点不需要
    trust_roots:
      - org_id: "wx-org1.chainmaker.org"
        root: "./certs/ca/wx-org1.chainmaker.org/ca.crt"
      - org_id: "wx-org2.chainmaker.org"
        root: "./certs/ca/wx-org2.chainmaker.org/ca.crt"
      - org_id: "wx-org3.chainmaker.org"
        root: "./certs/ca/wx-org3.chainmaker.org/ca.crt"
      - org_id: "wx-org4.chainmaker.org"
        root: "./certs/ca/wx-org4.chainmaker.org/ca.crt"
    
    # 权限配置(只能整体添加、修改、删除)
    resource_policies:
      - resource_name: NODE_ADDR_UPDATE
        policy:
          rule: SELF # 规则(ANY,MAJORITY...,全部大写,自动转大写)
          org_list: # 组织名称(组织名称,区分大小写)
          role_list: # 角色名称(role,自动转大写)
            - admin
      - resource_name: TRUST_ROOT_UPDATE
        policy:
          rule: SELF # 规则(ANY,MAJORITY...,全部大写)
          org_list: # 组织名称(组织名称)
          role_list: # 角色名称(role,自动转大写)
            - admin
      - resource_name: CONSENSUS_EXT_DELETE
        policy:
          rule: MAJORITY
          org_list:
          role_list:
            - admin
      - resource_name: BLOCK_UPDATE
        policy:
          rule: ANY
          org_list:
          role_list:
            - admin
            - client
      - resource_name: INIT_CONTRACT
        policy:
          rule: ANY
          org_list:
          role_list:
      - resource_name: UPGRADE_CONTRACT
        policy:
          rule: ANY
          org_list:
          role_list:
      - resource_name: FREEZE_CONTRACT
        policy:
          rule: ANY
          org_list:
          role_list:
      - resource_name: UNFREEZE_CONTRACT
        policy:
          rule: ANY
          org_list:
          role_list:
      - resource_name: REVOKE_CONTRACT
        policy:
          rule: ANY
          org_list:
          role_list:
    
    • chainmaker.yml 链配置文件
    #
    # Copyright (C) BABEC. All rights reserved.
    # Copyright (C) THL A29 Limited, a Tencent company. All rights reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    #
    
    log:
      config_file: ./log.yml          # config file of logger configuration.
    
    blockchain:
      - chainId: chain1 # 链名称
        genesis: ./chainconfig/bc1.yml # 他的创世块配置
    node:
      # 节点类型:full、spv
      type:              full
      org_id:            wx-org1.chainmaker.org
      priv_key_file:     ./certs/node/consensus1/consensus1.sign.key   # 节点私钥
      cert_file:         ./certs/node/consensus1/consensus1.sign.crt  #节点证书
      signer_cache_size: 1000
      cert_cache_size:   1000
      pkcs11:
        enabled: false
        library: # path to the so file of pkcs11 interface
        label: # label for the slot to be used
        password: # password to logon the HSM
        session_cache_size: 10 # size of HSM session cache, default to 10
        hash: "SHA256" # hash algorithm used to compute SKI
    
    net:
      provider: LibP2P
      listen_addr: /ip4/0.0.0.0/tcp/11301 
      tls:
        enabled: true
        priv_key_file: ./certs/node/consensus1/consensus1.tls.key
        cert_file:     ./certs/node/consensus1/consensus1.tls.crt
    
    txpool:
      max_txpool_size: 50000 # 普通交易池上限
      max_config_txpool_size: 10 # config交易池的上限
      full_notify_again_time: 30 # 交易池溢出后,再次通知的时间间隔(秒)
      batch_max_size: 30000 # 批次最大大小
      batch_create_timeout: 200 # 创建批次超时时间,单位毫秒
    
    rpc:
      provider: grpc
      port: 12301
      # 检查链配置TrustRoots证书变化时间间隔,单位:s,最小值为10s
      check_chain_conf_trust_roots_change_interval: 60
      ratelimit:
        # 每秒补充令牌数,取值:-1-不受限;0-默认值(10000)
        token_per_second: -1
        # 令牌桶大小,取值:-1-不受限;0-默认值(10000)
        token_bucket_size: -1
      subscriber:
        # 历史消息订阅流控,实时消息订阅不会进行流控
        ratelimit:
          # 每秒补充令牌数,取值:-1-不受限;0-默认值(1000)
          token_per_second: 100
          # 令牌桶大小,取值:-1-不受限;0-默认值(1000)
          token_bucket_size: 100
      tls:
        # TLS模式:
        #   disable - 不启用TLS
        #   oneway  - 单向认证
        #   twoway  - 双向认证
        #mode: disable
        #mode: oneway
        mode:           twoway
        priv_key_file:  ./certs/node/consensus1/consensus1.tls.key
        cert_file:      ./certs/node/consensus1/consensus1.tls.crt
    
    monitor:
      enabled: true
      port: 14321
    
    pprof:
      enabled: false
      port: 24321
    
    storage:  # 区块链数据存放路径
      provider: LevelDB
      store_path: ./data/ledgerData
    
    debug:
      # 是否开启CLI功能,过度期间使用
      is_cli_open: true
      is_http_open: false
      use_batch_tx_pool: false
      is_extreme: false
      use_net_msg_compression: false
      is_net_insecurity: false
    
    
    • log.yml 日志配置文件
    #
    # Copyright (C) BABEC. All rights reserved.
    # Copyright (C) THL A29 Limited, a Tencent company. All rights reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    #
    
    log:
      system:
        log_level_default: INFO
        log_levels:
          core: INFO
          net: INFO
        file_path: ./log/system.log
        max_age: 365                  # 日志最长保存时间,单位:天
        rotation_time: 1              # 日志滚动时间,单位:小时
        log_in_console: true         # 是否展示日志到终端,仅限于调试使用
        show_color: true              # 是否打印颜色日志
      brief:
        log_level_default: INFO
        file_path: ./log/brief.log
        max_age: 365                  # 日志最长保存时间,单位:天
        rotation_time: 1              # 日志滚动时间,单位:小时
        log_in_console: true         # 是否展示日志到终端,仅限于调试使用
        show_color: true              # 是否打印颜色日志
      event:
        log_level_default: INFO
        file_path: ./log/event.log
        max_age: 365                  # 日志最长保存时间,单位:天
        rotation_time: 1              # 日志滚动间隔,单位:小时
        log_in_console: true         # 是否展示日志到终端,仅限于调试使用
        show_color: true              # 是否打印颜色日志
    
    • docker-compose.yml 配置文件
    #
    # Copyright IBM Corp All Rights Reserved
    #
    # SPDX-License-Identifier: Apache-2.0
    #
    version: '2'
    
    networks:
      basic:
    
    services:
      chainmaker5:
    #    restart: on-failure  #on-failure:5 最多重启5次
        image: littlegirlpppp/chainmaker:v0.5.0
        tty: true
        container_name: chainmaker5
        working_dir: /chainmaker-go
        command: chainmaker  start
        volumes:
          - ./certs/:/chainmaker-go/certs
          - ./chainconfig/:/chainmaker-go/chainconfig
          - ./chainmaker.yml:/chainmaker-go/chainmaker.yml
          - ./log.yml:/chainmaker-go/log.yml
          - ./data/:/chainmaker-go/data
        networks:
          - basic
        ports:
          - 11305:11305
          - 12305:12305
          - 14325:14325
    
    • start.sh 启动docker-compose
    #!/bin/bash
    set -ev
    export MSYS_NO_PATHCONV=1
    docker-compose -f docker-compose.yml up -d chainmaker
    docker ps
    

    其他几个组织依次配置,端口号不能冲突
    注意 所有参与共识的创世块配置必须一致,因为只要相同的创世块才能加入到同一条链中 即所有的bc1.yml复制成一样的

    1. 下载镜像docker pull littlegirlpppp/chainmaker:v0.5.0
      分别进入
      依次执行./start 启动docker-compose。同过docker ps 会发现已经启动四个node节点如图

      随便进入一个镜像 你会看到all necessary peers connected
    2021-04-09 07:54:44.328 [INFO]  [Net]   p2p/libp2p_connection_supervisor.go:91  [ConnSupervisor] all necessary peers connected.
    

    则表示基于TBFT的四个共识节点的 区块链网络搭建完成

    使用SDK访问区块

    如果你了解过fabric go SDK, 那么chainmaker SDK使用就非常简单,注释也非常详细 看一下是DEMO就可以了 感觉比文档更方便,当前文档还有很多是用旧版本的会报错,这里只有等官方更新文档了 ,SDK下载https://git.chainmaker.org.cn/chainmaker/chainmaker-sdk-go.git

    //创建SDK客户端
        client, err := createClientWithCertBytes()
        if err!=nil{
    
        }
        //获取组织admin用户
        admin1, err := createAdmin(orgId1)
        admin2, err := createAdmin(orgId2)
        admin3, err := createAdmin(orgId3)
        admin4, err := createAdmin(orgId4)
        contractName   := "counter-go-11"
        version        := "1.0.0"
        byteCodePath := "./main1.wasm"
        //创建合约
        UserContractCounterGoCreate(client, admin1, admin2, admin3, admin4, contractName,version,byteCodePath,true)
        //调用合约
        params:=make(map[string]string)
        params["key"]="22222"
        UserContractCounterGoInvoke(client,contractName,"add",params,true)
        //查询合约
        UserContractCounterGoQuery(client,contractName,"getdata",params)
    

    这里说明一下 如果你使用go get的方式安装SDK可能会遇到问题,我这里没有解决 所以我是把SDK clone到本地 用replace 方式去引用 具体使用可以看一下demo https://github.com/littlegirlpppp/chainmakerDemo.git

    智能合约编写

    智能合约我个人觉得 还是有很多需要改善的地方,下面说目前的智能合约编写和部署。

    1. 目前智能合约只支持wasm方式部署,chainmaker生成wasm方式是采用TinyGo第三方工具来生成,所以导致无法Debug,并且使用方法受到限制 比如不能使用json 因为TinyGo不支持,当然还有很多go功能TinyGo不支持

    2. 为了方便使用 官方提供了一个docker 镜像来方便我们使用TinyGo
      拉镜像

      docker pull huzhenyuan/chainmaker-go-contract:1.0.0
      
    3. 创建目录用来存放合约

      mkdir docker-go-contract
      
    4. 启动镜像

      export work_path=/Users/sunbo/Desktop/ChainMaker/src/docker-go-contract
      docker run -it --name chainmaker-go-contract -v $work_path:/home huzhenyuan/chainmaker-go-contract:1.0.0 bash
      cd home
      tar xvf /data/contract_go_template.tar.gz
      cd contract_tinygo
      
    5. 此时回到本地 使用goland 打开docker-go-contract/contract_tinygo 如图
    6. 此时我们就可以编辑main.go 了 其中chainmaker.go 就是能使用的合约方法,easycodec.go 提供一个简单的 输入json 转化的方法。所以合约功能目前很有限

    7. 编辑完成后,回到刚才运行的Docker容器里,cd contract_tinygo/此时能看到项目文件 如图

      tinygo build -no-debug -opt=s -o main.wasm -target wasm
      

    使用tinygo 生成main.wasm

    1. 此时唯一的测试就是使用gasm命令的模拟一下invoke,让后靠输出来测试模式gasm wasm名 方法名 参数 值 参数1 值1 如下
     gasm main2.wasm add key 1111 
    ReadBytes len=559662021-04-09 09:52:44.829  [DEBUG] [Vm]    waci/waci.go:41 waci log>> [1234567890123456789012345678901234567890123456789012345678901234] ssssssssss1111
    2021-04-09 09:52:44.918 [DEBUG] [Vm]    gasm/runtime.go:192 invoke gasm success, tx id:1234567890123456789012345678901234567890123456789012345678901234, gas cost 3400503,[IGNORE: ret [], retTypes []]
    2021-04-09 09:52:44.930 [INFO]  [Vm] @chain01   main/mian.go:28 contractResult :gas_used:3400503 
    

    其中 ssssssssss1111就是输出

    1. 我使用的是go 所以在安装SDK 安装合约的时候 需要设置一下类型
    //common.RuntimeType_GASM 为go Wasm 安装  官方demo使用的是rust安装
    resp, err := createUserContract(client, admin1, admin2, admin3, admin4,
            contractName, version, byteCodePath, common.RuntimeType_GASM, []*common.KeyValuePair{}, withSyncResult)
        return resp,err
    

    至此chainmaker SDK 入门基本完成,等chainmaker完成CA服务 和合约功能升级后 在继续

    相关文章

      网友评论

          本文标题:chainmaker简介

          本文链接:https://www.haomeiwen.com/subject/bkuikltx.html