# 链下扩容工具 ### 简介 链下扩容是 ChainMaker 之上的扩展,以链上智能合约为信任背书,通过高安全、高可用、高性能的处理交易,以整体提升交易处理性能。 了解技术细节,请参考[链下扩容技术文档](../tech/链下扩容项目技术文档.md)。 ### 编译&配置 下载代码 ```bash $ git clone https://git.chainmaker.org.cn/ibpc/offchain-channel-scaling ``` 编译&运行方式如下: > 创建工作目录 $WORKDIR 比如 ~/chainmaker > 启动测试链 [在工作目录下 使用脚本搭建](https://docs.chainmaker.org.cn/recovery/%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7%E5%90%AF%E5%8A%A8%E9%93%BE.html) 需要 **注意** 的是,在启动长安链时,需要开启 ***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` ### 自定义配置 oce 依赖自有配置 config.yaml 和 sdk-go 配置文件 sdk_config.yaml 编译和配置使用的是[模板文件](https://git.chainmaker.org.cn/chainmaker/sdk-go/-/blob/master/testdata/sdk_config.yml) 可通过修改 `$WORKDIR/offchain-channel-scaling/config.yaml` 、 `$WORKDIR/offchain-channel-scaling/sdk-config.yaml`实现自定义配置。 比如 `sign_priv_key_file`,`sign_cert_file` 可以设置为普通用户或 admin 用户的证书/私钥路径。 其他详细配置项请看 `$WORKDIR/offchain−channel−scaling/config.yaml` 中的注解。 ### 智能合约部署 合约代码在 `$WORKDIR/offchain-channel-scaling/contract` 目录下,编译生成合约参考[使用Golang进行智能合约开发章节](https://docs.chainmaker.org.cn/v2.3.0_alpha/html/instructions/%E4%BD%BF%E7%94%A8Golang%E8%BF%9B%E8%A1%8C%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6%E5%BC%80%E5%8F%91.html),编译机上需要安装 7z 压缩工具,在上述所说目录下,执行 `./build.sh` 即可执行生成合约,生成好之后有两个合约 `channel_contract.7z` 和 `stake_contract.7z`,在部署的测试链上首先部署`channel_contract.7z`合约,之后再部署 `stake_contract.7z` 合约。 也可使用已经编译好的合约,直接部署,使用如下命令即可直接部署: ```shell make deploy_contract ``` #### 修改合约名称 如果需要自定义合约名称,在项目中全局替换: 1. `channel_contract` 替换为 `xxx_contract`。 2. `stake_contract` 替换为 `yyy_contract`。 ### 启动链下扩容 #### 使用自己部署的链启动链下通道 一种简单的启动四节点通道办法: ```shell make four ``` 稍微等待几秒命令执行完会启动一个 4 节点的链下通道,之后节点间可以进行交易。 **不同机器间** 组成链下通道的步骤: 1. 在各个节点下载项目 2. 修改 config 目录下 net.listen_addr 配置,127.0.0.1 改为本机节点 IP。 3. 启动各个节点的程序 ```shell # 节点 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 ``` #### 使用测试网络启动链下通道 项目切到 cmtestnet 分支,命令如下: ```shell git checkout cmtestnet ``` 之后到 [长安链 · ChainMaker 测试网络](https://chainmaker.org.cn/testnet) 注册账号并申请用户证书,下载下来证书后,放到项目 `testdata/test-crypto/wx-org5.chainmaker.org/user/` 目录下,修改配置文件对应证书位置,之后下载 [chainmaker / common](https://git.chainmaker.org.cn/chainmaker/common) 库到项目同级目录,修改 `go.mod` 文件如下行,取消注释。 ```shell // replace chainmaker.org/chainmaker/common/v2 => ../common ``` 之后打开下载的 `common` 项目,打开 `crypto/x509/verify.go` 文件,修改如下位置代码,大约 780 行: ```go keyUsages := opts.KeyUsages if len(keyUsages) == 0 { keyUsages = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth} } ``` 添加 `x509.ExtKeyUsageClientAuth` ,如下: ```go keyUsages := opts.KeyUsages if len(keyUsages) == 0 { keyUsages = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth} } ``` 保存后,回到链下扩容项目,重新构建可执行文件,之后按 5.1 正常执行即可。 ### 节点间交易: ```shell ./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 ``` ### 查询余额 ```shell ./bin/oce chan balance -n chan1 -c config/config.yaml 注解: -n 通道名称 -c 配置文件 ``` ### 节点创建通道 ```shell ./bin/oce chan create -c config/config.yaml -b 30000 -n chan1 注解: -c 配置文件 -b 金额 -n 通道名称 ``` ### 节点加入通道 ```shell ./bin/oce chan join -c config/config2.yaml -b 30000 -n chan1 注解: -c 配置文件 -b 金额 -n 通道名称 ``` ### 节点退出通道 ```shell ./bin/oce chan exit -n chan1 -c config/config4.yaml 注解: -c 配置文件 -n 通道名称 ```