3. 命令行工具

3.1. 简介

cmc(ChainMaker Client)是ChainMaker提供的命令行工具,用于和ChainMaker链进行交互以及生成证书等功能。cmc基于go语言编写,通过使用ChainMaker的go语言sdk(使用grpc协议)达到和ChainMaker链进行交互的目的。
cmc的详细日志请查看./sdk.log

3.2. 编译

cmc工具的编译方式如下:

$ git clone --recurse-submodules -b v1.2.0 https://git.chainmaker.org.cn/chainmaker/chainmaker-go.git
$ cd chainmaker-go/tools/cmc
$ go mod download
$ go build
# 方式一:使用默认自带的证书,拷贝sdk的配置文件和示例里cmc命令行需要使用的文件
$ cp -r ../sdk/testdata ./
# 方式二:使用刚生成的证书
$ mkdir testdata
$ cp ../sdk/testdata/sdk_config.yml testdata/
$ cp -r ../../build/crypto-config testdata/

3.3. 配置

使用 cmc 前请先配置好 SDK 配置文件。
SDK配置模版 为模版, 更改对应配置。
注意:
user_key_file_path,user_crt_file_path,user_sign_key_file_path,user_sign_crt_file_path
以上4项设置为client或admin的证书,则对应为普通用户或admin用户。

3.4. 功能

cmc提供功能如下:

  • 私钥管理:私钥生成功能

  • 证书管理:包括生成ca证书、生成crl列表、生成csr、颁发证书、根据证书获取节点Id等功能

  • 交易功能:主要包括链管理、用户合约发布、升级、吊销、冻结、调用、查询等功能

  • 查询链上数据:查询链上block和transaction

  • 链配置:查询及更新链配置

  • 归档&恢复功能:将链上数据转移到独立存储上,归档后的数据具备可查询、可恢复到链上的特性

3.4.1. 示例

3.4.1.1. 私钥管理

生成私钥, 目前支持的算法有 SM2 ECC_P256 未来将支持更多算法。

参数说明

$ ./cmc key gen -h 
Private key generate
Usage:
  cmc key gen [flags]

Flags:
  -a, --algo string   specify key generate algorithm
  -h, --help          help for gen
  -n, --name string   specify storage name
  -p, --path string   specify storage path

示例:

$ ./cmc key gen -a ECC_P256 -n ca.key -p ./

3.4.1.2. 证书管理

  • 生成ca证书

    生成ca证书之前需要先生成ca的私钥文件,然后在生成ca证书时使用-k参数指定生成的私钥文件路径

    参数说明

    $ ./cmc cert ca -h 
    Create certificate authority crtificate
    Usage:
      cmc cert ca [flags]
    
    Flags:
      -c, --cn string         specify common name
      -H, --hash string       specify hash algorithm
      -h, --help              help for ca
      -k, --key-path string   specify key path
      -n, --name string       specify storage name
      -o, --org string        specify organization
      -O, --ou string         specify organizational unit
      -p, --path string       specify storage path
    

    示例

    $ ./cmc cert ca -c wx-org1.chainmaker.org -k ca.key -H sha256 --ou root-ca -n ca.crt -p ./ --org wx-org1
    
  • 生成crl列表

    crl列表用于撤消证书请求,首先将要撤消的证书生成一个crl列表,然后再发送请求到链上

    参数说明

    $ ./cmc cert crl -h  
    create cert crl
    
    Usage:
      cmc cert crl [flags]
    
    Flags:
      -C, --ca-cert-path string   specify certificate authority certificate path
      -K, --ca-key-path string    specify certificate authority key path
          --crl-path string       specify crl file path
          --crt-path string       specify crt file path
      -h, --help                  help for crl
    

    示例

    $ ./cmc cert crl -C ./ca.crt -K ca.key --crl-path=./client1.crl --crt-path=../sdk/testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt
    
  • 生成csr文件

    参数说明

    $ ./cmc cert csr -h
    Create certificate request
    
    Usage:
      cmc cert csr [flags]
    
    Flags:
      -c, --cn string         specify common name
      -h, --help              help for csr
      -k, --key-path string   specify key path
      -n, --name string       specify storage name
      -o, --org string        specify organization
      -O, --ou string         specify organizational unit
      -p, --path string       specify storage path
    

    示例

    $ ./cmc cert csr -c wx-org1.chainmaker.org -k ../sdk/testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key -n client1.csr -p ./ --ou root-ca -o wx-org1
    
  • 颁发证书

    参数说明

    $ ./cmc cert issue -h
    Issue certificate
    
    Usage:
      cmc cert issue [flags]
    
    Flags:
      -C, --ca-cert-path string   specify certificate authority certificate path
      -K, --ca-key-path string    specify certificate authority key path
      -r, --csr-path string       specify certificate request path
      -H, --hash string           specify hash algorithm
      -h, --help                  help for issue
          --is-ca                 specify is certificate authority
      -n, --name string           specify storage name
      -p, --path string           specify storage path
    

    示例

    $ ./cmc cert issue -C ca.crt -K ca.key -r client1.csr -H sha256 -n client1.crt -p ./
    
  • 根据证书获取节点Id

    参数说明

    $ ./cmc cert nid -h
    Get node id of node cert
    
    Usage:
      cmc cert nid [flags]
    
    Flags:
      -h, --help                    help for nid
          --node-cert-path string   specify node cert path
    

    示例

    $ ./cmc cert nid --node-cert-path=../sdk/testdata/crypto-config/wx-org1.chainmaker.org/node/consensus1/consensus1.tls.crt
    node id : QmcQHCuAXaFkbcsPUj7e37hXXfZ9DdN7bozseo5oX4qiC4
    

3.4.1.3. 交易功能

cmc的交易功能用来发送交易和链进行交互,主要参数说明如下:

  --admin-key-file-paths:指定admin用户的私钥文件路径
  --admin-crt-file-paths:指定admin用户的证书文件路径
  --org-id:指定发送交易的用户所属的组织Id
  --chain-id:指定链Id
  --client-crt-file-paths:指定发送交易的用户证书文件路径
  --client-key-file-paths:指定用户的私钥文件路径
  --byte-code-path:指定合约的wasm文件路径
  --contract-name:指定合约名称
  --method:指定调用的合约方法名称
  --runtime-type:指定合约执行虚拟机环境,包含:GASM、WASMER、WXVM、NATIVE
  --sdk-conf-path:指定cmc使用sdk的配置文件路径
  --version:指定合约的版本号,在发布和升级合约时使用
  --sync-result:指定是否同步等待交易执行结果,默认为false,如果设置为true,在发送完交易后会主动查询交易执行结果
  --params:指定发布合约或调用合约时的参数信息
  --concurrency:指定调用合约并发的go routine,用于压力测试
  --total-count-per-goroutine:指定单个go routine发送的交易数量,用于压力测试,和--concurrency配合使用
  --block-height:指定区块高度
  --tx-id:指定交易Id
  --with-rw-set:指定获取区块时是否附带读写集,默认是false
  • 创建合约

    $ ./cmc client contract user create \
    --contract-name=fact \
    --runtime-type=WASMER \
    --byte-code-path=../../test/wasm/rust-fact-1.2.0.wasm \
    --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 \
    --admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt \
    --org-id=wx-org1.chainmaker.org \
    --client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
    --client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
    --sync-result=true \
    --params="{}"
    

    如下返回表示成功:

    create contract resp: message:”OK” contract_result:<gas_used:73738 >

    注:智能合约编写及生成wasm文件参见:智能合约开发

  • 调用合约

    $ ./cmc client contract user invoke \
    --contract-name=fact \
    --method=save \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --params="{\"faile_name\":\"name007\",\"file_hash\":\"ab3456df5799b87c77e7f88\",\"time\":\"6543234\"}" \
    --org-id=wx-org1.chainmaker.org \
    --client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
    --client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
    --sync-result=true
    

    如下返回表示成功:

    INVOKE contract resp, [code:0]/[msg:OK]/[contractResult:gas_used:13282710 ]

  • 查询合约

    $ ./cmc client contract user get \
    --contract-name=fact \
    --method=find_by_file_hash \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --params="{\"file_hash\":\"ab3456df5799b87c77e7f88\"}" \
    --org-id=wx-org1.chainmaker.org \
    --client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
    --client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key
    

    如下返回表示成功:

    QUERY contract resp: message:”SUCCESS” contract_result:<result:”{“file_hash”:”ab3456df5799b87c77e7f88”,”file_name”:””,”time”:”6543234”}” gas_used:24034881 >

  • 升级合约

    $ ./cmc client contract user upgrade \
    --contract-name=fact \
    --runtime-type=WASMER \
    --byte-code-path=../../test/wasm/rust-fact-1.2.0.wasm \
    --version=2.0 \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key \
    --admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt \
    --org-id=wx-org1.chainmaker.org \
    --client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
    --client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
    --sync-result=true \
    --params="{}"
    

    如下返回表示成功:其中result结果为用户自定义,每个合约可能不一样,也可能没有。

    upgrade contract resp: message:”OK” contract_result:<result:”upgrade ok” gas_used:4787624 >

  • 冻结合约

    $ ./cmc client contract user freeze \
    --contract-name=fact \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key \
    --admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt \
    --org-id=wx-org1.chainmaker.org \
    --client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
    --client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
    --sync-result=true
    

    此时再执行查询、调用合约则会失败:会报如下错误:

    QUERY contract resp: code:CONTRACT_FREEZE_FAILED message:”36, 1, contractName[fact] method[find_by_file_hash] txType[QUERY_USER_CONTRACT], failed to run user contract, fact has been frozen.” contract_result:<code:FAIL message:”failed to run user contract, fact has been frozen.” >

    $ ./cmc client contract user get
    –contract-name=fact
    –method=find_by_file_hash
    –sdk-conf-path=./testdata/sdk_config.yml
    –params=”{“file_hash”:”ab3456df5799b87c77e7f88”}”
    –org-id=wx-org1.chainmaker.org
    –client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt
    –client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key

  • 解冻合约

    $ ./cmc client contract user unfreeze \
    --contract-name=fact \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key \
    --admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt \
    --org-id=wx-org1.chainmaker.org \
    --client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
    --client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
    --sync-result=true
    

    解冻后的合约可正常使用

  • 吊销合约

    $ ./cmc client contract user revoke \
    --contract-name=fact \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key \
    --admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt \
    --org-id=wx-org1.chainmaker.org \
    --client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
    --client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
    --sync-result=true
    

    吊销合约后,不可恢复,且不能对该合约执行任何操作,包括查询。

3.4.1.4. 查询链上数据

查询链上block和transaction 主要参数说明如下:

  --sdk-conf-path:指定cmc使用sdk的配置文件路径
  --chain-id:指定链Id
  • 根据区块高度查询链上未归档区块

    ./cmc query block-by-height [blockheight] \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml
    
  • 根据区块hash查询链上未归档区块

    ./cmc query block-by-hash [blockhash] \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml
    
  • 根据txid查询链上未归档区块

    ./cmc query block-by-txid [txid] \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml
    
  • 根据txid查询链上未归档tx

    ./cmc query tx [txid] \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml
    

3.4.1.5. 链配置

查询及更新链配置 主要参数说明如下:

  --admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割
  --admin-key-file-paths:admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割
  --admin-crt-file-paths:admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割
  --org-id:指定发送交易的用户所属的组织Id
  --chain-id:指定链Id
  --client-crt-file-paths:指定发送交易的用户证书文件路径
  --client-key-file-paths:指定用户的私钥文件路径
  --sdk-conf-path: 指定cmc使用sdk的配置文件路径
  --block-interval: 出块时间 单位ms
  --trust-root-org-id: 增加/删除/更新组织证书时指定的组织Id
  --trust-root-path: 增加/删除/更新组织证书时指定的组织CA根证书文件目录
  --node-id: 增加/删除/更新共识节点Id时指定的节点Id
  --node-ids: 增加/更新共识节点Org时指定的节点Id列表
  --node-org-id: 增加/删除/更新共识节点Id,Org时指定节点的组织Id 

  • 查询链配置

    ./cmc client chainconfig query \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --org-id=wx-org1.chainmaker.org \
    --client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
    --client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key
    

  • 更新出块时间

    ./cmc client chainconfig block updateblockinterval \
    --org-id=wx-org1.chainmaker.org \
    --client-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
    --client-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt \
    --admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key \
    --block-interval 1000
    

  • 增加组织根证书

    –admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与上边列出的flag保持一致。
    以上所有flag值的顺序及个数需要保持一致

    ./cmc client chainconfig trustroot add \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-org-ids=wx-org1.chainmaker.org,wx-org2.chainmaker.org,wx-org3.chainmaker.org \
    --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 \
    --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 \
    --trust-root-org-id=wx-org5.chainmaker.org \
    --trust-root-path=./testdata/crypto-config/wx-org5.chainmaker.org/ca/ca.crt
    

  • 删除组织根证书

    –admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与上边列出的flag保持一致。
    以上所有flag值的顺序及个数需要保持一致

    ./cmc client chainconfig trustroot remove \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-org-ids=wx-org1.chainmaker.org,wx-org2.chainmaker.org,wx-org3.chainmaker.org \
    --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 \
    --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 \
    --trust-root-org-id=wx-org5.chainmaker.org \
    --trust-root-path=./testdata/crypto-config/wx-org5.chainmaker.org/ca/ca.crt
    

  • 更新组织根证书

    –admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与上边列出的flag保持一致。
    以上所有flag值的顺序及个数需要保持一致

    ./cmc client chainconfig trustroot update \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-org-ids=wx-org1.chainmaker.org,wx-org2.chainmaker.org,wx-org3.chainmaker.org \
    --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 \
    --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 \
    --trust-root-org-id=wx-org5.chainmaker.org \
    --trust-root-path=./testdata/crypto-config/wx-org5.chainmaker.org/ca/ca.crt
    

  • 添加共识节点Org

    –admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与上边列出的flag保持一致。
    以上所有flag值的顺序及个数需要保持一致

    ./cmc client chainconfig consensusnodeorg add \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-org-ids=wx-org1.chainmaker.org,wx-org2.chainmaker.org,wx-org3.chainmaker.org \
    --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 \
    --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 \
    --node-ids=QmcQHCuAXaFkbcsPUj7e37hXXfZ9DdN7bozseo5oX4qiC4,QmaWrR72CbT51nFVpNDS8NaqUZjVuD4Ezf8xcHcFW9SJWF \
    --node-org-id=wx-org5.chainmaker.org
    

  • 删除共识节点Org

    –admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与上边列出的flag保持一致。
    以上所有flag值的顺序及个数需要保持一致

    ./cmc client chainconfig consensusnodeorg remove \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-org-ids=wx-org1.chainmaker.org,wx-org2.chainmaker.org,wx-org3.chainmaker.org \
    --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 \
    --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 \
    --node-org-id=wx-org5.chainmaker.org
    

  • 更新共识节点Org

    –admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与上边列出的flag保持一致。
    以上所有flag值的顺序及个数需要保持一致

    ./cmc client chainconfig consensusnodeorg update \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-org-ids=wx-org1.chainmaker.org,wx-org2.chainmaker.org,wx-org3.chainmaker.org \
    --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 \
    --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 \
    --node-ids=QmcQHCuAXaFkbcsPUj7e37hXXfZ9DdN7bozseo5oX4qiC4,QmaWrR72CbT51nFVpNDS8NaqUZjVuD4Ezf8xcHcFW9SJWF \
    --node-org-id=wx-org5.chainmaker.org
    

  • 添加共识节点Id

    –admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与上边列出的flag保持一致。
    以上所有flag值的顺序及个数需要保持一致

    ./cmc client chainconfig consensusnodeid add \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-org-ids=wx-org1.chainmaker.org,wx-org2.chainmaker.org,wx-org3.chainmaker.org \
    --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 \
    --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 \
    --node-id=QmcQHCuAXaFkbcsPUj7e37hXXfZ9DdN7bozseo5oX4qiC4 \
    --node-org-id=wx-org1.chainmaker.org
    

  • 删除共识节点Id

    –admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与上边列出的flag保持一致。
    以上所有flag值的顺序及个数需要保持一致

    ./cmc client chainconfig consensusnodeid remove \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-org-ids=wx-org1.chainmaker.org,wx-org2.chainmaker.org,wx-org3.chainmaker.org \
    --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 \
    --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 \
    --node-id=QmcQHCuAXaFkbcsPUj7e37hXXfZ9DdN7bozseo5oX4qiC4 \
    --node-org-id=wx-org1.chainmaker.org
    

  • 更新共识节点Id

    –admin-org-ids: admin签名者的org-id列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-crt-file-paths: admin签名者的tls crt文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与下边列出的flag保持一致。
    –admin-key-file-paths: admin签名者的tls key文件的路径列表. 单签模式下只需要填写一个即可, 离线多签模式下多个需要用逗号分割,顺序及个数与上边列出的flag保持一致。
    以上所有flag值的顺序及个数需要保持一致

    ./cmc client chainconfig consensusnodeid update \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --admin-org-ids=wx-org1.chainmaker.org,wx-org2.chainmaker.org,wx-org3.chainmaker.org \
    --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 \
    --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 \
    --node-id=QmXxeLkNTcvySPKMkv3FUqQgpVZ3t85KMo5E4cmcmrexrC \
    --node-id-old=QmcQHCuAXaFkbcsPUj7e37hXXfZ9DdN7bozseo5oX4qiC4 \
    --node-org-id=wx-org1.chainmaker.org
    

3.4.1.6. 归档&恢复功能

cmc的归档功能是指将链上数据转移到独立存储上,归档后的数据具备可查询、可恢复到链上的特性。
为了保持数据一致性和防止误操作,cmc实现了分布式锁,同一时刻只允许一个cmc进程进行转储。
cmc支持增量转储和恢复、断点中继转储和恢复,中途退出不影响数据一致性。

主要参数说明如下:

	--sdk-conf-path:指定cmc使用sdk的配置文件路径
	--chain-id:指定链Id
	--type:指定链下独立存储类型,如 --type=mysql 默认mysql,目前只支持mysql
	--dest:指定链下独立存储目标地址,mysql类型的格式如 --dest=user:password:localhost:port
	--target:指定转储目标区块高度,在达到这个高度后停止转储(包括这个块) --target=100
            也可指定转存目标日期,转储在此日期之前的所有区块 --target="2021-06-01 15:01:41"
	--blocks:指定本次要转储的块数量,注意:对于target和blocks这两个参数,cmc会就近原则采用先符合条件的参数
	--start-block-height:指定链数据恢复时的起始区块高度,如设置为100,则从已转储并且未恢复的最大区块开始降序恢复链数据至第100区块
	--secret-key:指定密码,用于链数据转储和链数据恢复时数据一致性校验,转储和恢复时密码需要一致
  • 根据时间转储,将链上数据转移到独立存储上,需要权限:admin用户

    ./cmc archive dump --type=mysql \
    --dest=root:password:localhost:3306 \
    --target="2021-06-01 15:01:41" \
    --blocks=10000 \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --secret-key=mypassword
    
  • 根据区块高度转储,将链上数据转移到独立存储上,需要权限:admin用户

    ./cmc archive dump --type=mysql \
    --dest=root:password:localhost:3306 \
    --target=100 \
    --blocks=10000 \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --secret-key=mypassword
    
  • 恢复,将链下的链数据恢复到链上,需要权限:admin用户

    ./cmc archive restore --type=mysql \
    --dest=root:password:localhost:3306 \
    --start-block-height=0 \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --secret-key=mypassword
    
  • 根据区块高度查询链下已归档区块

    ./cmc archive query block-by-height [blockheight] \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --type=mysql \
    --dest=root:password:localhost:3306
    
  • 根据区块hash查询链下已归档区块

    ./cmc archive query block-by-hash [blockhash] \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --type=mysql \
    --dest=root:password:localhost:3306
    
  • 根据txid查询链下已归档区块

    ./cmc archive query block-by-txid [txid] \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --type=mysql \
    --dest=root:password:localhost:3306
    
  • 根据txid查询链下已归档tx

    ./cmc archive query tx [txid] \
    --chain-id=chain1 \
    --sdk-conf-path=./testdata/sdk_config.yml \
    --type=mysql \
    --dest=root:password:localhost:3306