# 命令行工具
## 简介
cmc是ChainMaker提供的命令行工具,用于和ChainMaker链进行交互以及生成证书等功能。cmc基于go语言编写,通过使用ChainMaker的go语言sdk(使用grpc协议)达到和ChainMaker链进行交互的目的。
## cmc编译
cmc工具的编译方式如下:
```sh
git clone --recurse-submodules -b v1.1.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 ./
```
## cmc功能
cmc提供功能如下:
- 私钥管理:私钥生成功能
- 证书管理:包括生成ca证书、生成crl列表、生成csr、颁发证书、根据证书获取节点Id等功能
- 交易功能:主要包括链管理、用户合约发布、升级、吊销、冻结、调用、查询等功能
- 帮助功能:提供所有命令的帮助查询
### 示例
- 私钥管理
生成私钥
**参数说明**:
```sh
tianlehan@DANAHAN-MB0 cmc % ./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
```
**示例:**
```sh
./cmc key gen -a ECC_P256 -n ca.key -p ./
```
- 证书管理
- 生成ca证书
生成ca证书之前需要先生成ca的私钥文件,然后在生成ca证书时使用-k参数指定生成的私钥文件路径
**参数说明**
```sh
tianlehan@DANAHAN-MB0 cmc % ./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
```
**示例**
```sh
./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列表,然后再发送请求到链上
**参数说明**
```sh
tianlehan@DANAHAN-MB0 cmc % ./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
```
**示例**
```sh
./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文件
**参数说明**
```sh
tianlehan@DANAHAN-MB0 cmc % ./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
```
**示例**
```sh
./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
```
- 颁发证书
**参数说明**
```sh
tianlehan@DANAHAN-MB0 cmc % ./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
```
**示例**
```sh
./cmc cert issue -C ca.crt -K ca.key -r client1.csr -H sha256 -n client1.crt -p ./
```
- 根据证书获取节点Id
**参数说明**
```sh
tianlehan@DANAHAN-MB0 cmc % ./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
```
**示例**
```sh
tianlehan@DANAHAN-MB0 cmc % ./cmc cert nid --node-cert-path=../sdk/testdata/crypto-config/wx-org1.chainmaker.org/node/consensus1/consensus1.tls.crt
node id : QmcQHCuAXaFkbcsPUj7e37hXXfZ9DdN7bozseo5oX4qiC4
```
- 交易功能
cmc的交易功能用来发送交易和链进行交互,主要参数说明如下:
```sh
--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
```
- 创建合约
```sh
./cmc client contract user create \
--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 \
--byte-code-path=../../test/wasm/rust-asset-management-1.0.0.wasm \
--contract-name=asset --runtime-type=WASMER \
--sdk-conf-path=./testdata/sdk_config.yml \
--version=1.0 \
--sync-result=true \
--params="{\"issue_limit\":\"1000\",\"total_supply\":\"100000000\"}"
```
- 调用合约
```sh
./cmc client contract user invoke \
--contract-name=asset --method=register \
--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 \
--sync-result=true
```
- 查询合约
```sh
./cmc client contract user get \
--contract-name=asset \
--method=query_address \
--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
```
- 升级合约
```sh
./cmc client contract user create \
--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 \
--byte-code-path=../../test/wasm/rust-asset-management-1.0.0.wasm \
--contract-name=asset \
--runtime-type=WASMER \
--sdk-conf-path=./testdata/sdk_config.yml \
--version=1.0 \
--sync-result=true \
--params="{\"issue_limit\":\"1000\",\"total_supply\":\"100000000\"}"
```
- 冻结合约
```sh
./cmc client contract user freeze \
--sdk-conf-path=./testdata/sdk_config.yml \
--contract-name=asset \
--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
```
- 解冻合约
```sh
./cmc client contract user unfreeze \
--sdk-conf-path=./testdata/sdk_config.yml \
--contract-name=asset \
--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
```
- 吊销合约
```sh
./cmc client contract user revoke \
--sdk-conf-path=./testdata/sdk_config.yml \
--contract-name=asset \
--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
```
- 查询链配置
```sh
./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
```
- 更新链配置(出块时间间隔)
```sh
./cmc client chainconfig block updateblockinterval \
--org-id=wx-org1.chainmaker.org \
--client-crt-file-paths=../sdk/testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.crt \
--client-key-file-paths=../sdk/testdata/crypto-config/wx-org1.chainmaker.org/user/client1/client1.tls.key \
--sdk-conf-path=../sdk/testdata/sdk_config.yml \
--admin-crt-file-paths=../sdk/testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.crt \
--admin-key-file-paths=../sdk/testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.tls.key \
--block-interval 1000
```