10. 链下扩容工具

10.1. 简介

链下扩容是 ChainMaker 之上的扩展,以链上智能合约为信任背书,通过高安全、高可用、高性能的处理交易,以整体提升交易处理性能。

了解技术细节,请参考链下扩容技术文档

10.2. 编译&配置

下载代码

$ git clone https://git.chainmaker.org.cn/ibpc/offchain-channel-scaling

编译&运行方式如下:

创建工作目录 $WORKDIR 比如 ~/chainmaker
启动测试链 在工作目录下 使用脚本搭建

需要 注意 的是,在启动长安链时,需要开启 docker VM

# 编译
$ cd $WORKDIR/offchain-channel-scaling/
$ make build
$ cp -rf $WORKDIR/chainmaker-go/build/crypto-config $WORKDIR/offchain-channel-scaling/testdata/ # 使用chainmaker-cryptogen生成的测试链的证书
# 查看help
$ ./bin/oce --help

最后修改 $WORKDIR/offchain-channel-scaling/config/sdk_config*.yaml 文件 nodes.node_addr 为启动的测试链的 RPC ip:port

10.3. 自定义配置

oce 依赖自有配置 config.yaml 和 sdk-go 配置文件 sdk_config.yaml

编译和配置使用的是模板文件

可通过修改 $WORKDIR/offchain-channel-scaling/config.yaml$WORKDIR/offchain-channel-scaling/sdk-config.yaml实现自定义配置。

比如 sign_priv_key_filesign_cert_file 可以设置为普通用户或 admin 用户的证书/私钥路径。

其他详细配置项请看 $WORKDIR/offchain−channel−scaling/config.yaml 中的注解。

10.4. 智能合约部署

合约代码在 $WORKDIR/offchain-channel-scaling/contract 目录下,编译生成合约参考使用Golang进行智能合约开发章节,编译机上需要安装 7z 压缩工具,在上述所说目录下,执行 ./build.sh 即可执行生成合约,生成好之后有两个合约 channel_contract.7zstake_contract.7z,在部署的测试链上首先部署channel_contract.7z合约,之后再部署 stake_contract.7z 合约。

也可使用已经编译好的合约,直接部署,使用如下命令即可直接部署:

make deploy_contract

10.4.1. 修改合约名称

如果需要自定义合约名称,在项目中全局替换:

  1. channel_contract 替换为 xxx_contract

  2. stake_contract 替换为 yyy_contract

10.5. 启动链下扩容

10.5.1. 使用自己部署的链启动链下通道

一种简单的启动四节点通道办法:

make four

稍微等待几秒命令执行完会启动一个 4 节点的链下通道,之后节点间可以进行交易。

不同机器间 组成链下通道的步骤:

  1. 在各个节点下载项目

  2. 修改 config 目录下 net.listen_addr 配置,127.0.0.1 改为本机节点 IP。

  3. 启动各个节点的程序

    # 节点 1 用 config.yaml
    ./bin/oce chan create -c config/config.yaml -b 30000 -n chan1
    # 节点 2 用 config2.yaml
    ./bin/oce chan join -c config/config2.yaml -b 30000 -n chan1
    # 节点 3 用 config3.yaml
    ./bin/oce chan join -c config/config3.yaml -b 30000 -n chan1
    # 节点 4 用 config4.yaml
    ./bin/oce chan join -c config/config4.yaml -b 30000 -n chan1
    

10.5.2. 使用测试网络启动链下通道

项目切到 cmtestnet 分支,命令如下:

git checkout cmtestnet

之后到 长安链 · ChainMaker 测试网络 注册账号并申请用户证书,下载下来证书后,放到项目 testdata/test-crypto/wx-org5.chainmaker.org/user/ 目录下,修改配置文件对应证书位置,之后下载 chainmaker / common 库到项目同级目录,修改 go.mod 文件如下行,取消注释。

// replace chainmaker.org/chainmaker/common/v2 => ../common

之后打开下载的 common 项目,打开 crypto/x509/verify.go 文件,修改如下位置代码,大约 780 行:

    keyUsages := opts.KeyUsages
	if len(keyUsages) == 0 {
		keyUsages = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}
	}

添加 x509.ExtKeyUsageClientAuth ,如下:

    keyUsages := opts.KeyUsages
	if len(keyUsages) == 0 {
		keyUsages = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth}
	}

保存后,回到链下扩容项目,重新构建可执行文件,之后按 5.1 正常执行即可。

10.6. 节点间交易:

./bin/oce chan trade -a 10 -n chan1 -i QmfHFdpTN1RCLvvqpivwF5KwDTefaGMNezqxw7MoZRzmjh -c config/config.yaml -s

注解:
-a 交易数
-n 通道名称
-i 目标节点id
-c 配置文件
-s 同步返回结果

注:
自己的节点 id 会在加入或创建通道时回显到屏幕上,如下:
channel create success, nodeID: QmUtQmnGVyvmBcKHqbmywiHJwU5p5CrbsVynKuRSocKrDs
channel join success, nodeID: QmfHFdpTN1RCLvvqpivwF5KwDTefaGMNezqxw7MoZRzmjh

10.7. 查询余额

./bin/oce chan balance -n chan1 -c config/config.yaml

注解:
-n 通道名称
-c 配置文件

10.8. 节点创建通道

./bin/oce chan create -c config/config.yaml -b 30000 -n chan1

注解:
-c 配置文件
-b 金额
-n 通道名称

10.9. 节点加入通道

./bin/oce chan join -c config/config2.yaml -b 30000 -n chan1

注解:
-c 配置文件
-b 金额
-n 通道名称

10.10. 节点退出通道

./bin/oce chan exit -n chan1 -c config/config4.yaml

注解:
-c 配置文件
-n 通道名称