根据官方文档搭建一条单机的4节点区块链,部署区块链浏览器,部署ERC1155合约,编写SDK调用。
本文档于2022-10-22形成,文中涉及的一些官方bug(可能)只针对当前时间的当前版本,后续版本是否存在,得各自甄别。
长安链从0到1的过程
硬件选型
4核8G2Mb200G数据盘(数据盘需要另外挂载)的ECS服务器,操作系统选择CentOS7.6。
软件依赖
(前置条件)
软件依赖目录:https://docs.chainmaker.org.cn/tutorial/%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8.html#id7
git,golang>1.16+,docker>18+,docker-compose,gcc>4+,glibc>2.18,tmux,wasmer 运行时库 libwasmer_runtime_c_api.so。
- git参考文章:https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
- golang参考文章:https://golang.org/doc/install
- docker:https://docs.docker.com/engine/install/centos/,开机自启动:systemctl enable docker
- docker-compose:https://www.cnblogs.com/weibanggang/p/14092837.html
- gcc:安装https://blog.csdn.net/dream_1996/article/details/69397089,升级http://lokie.wang/article/96,添加环境变量:scl enable devtoolset-7 bash
- glibc:https://blog.csdn.net/weixin_44051608/article/details/109514140
- wasmer 运行时库 libwasmer_runtime_c_api.so:https://docs.chainmaker.org.cn/tutorial/%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8.html#id7
安装长安链管理台
通过长安链管理台安装长安链。
参考文章链接:https://docs.chainmaker.org.cn/dev/%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0.html#id9;
参考视频链接:https://www.bilibili.com/video/BV1MU4y197KW/?spm_id_from=pageDriver
建议修改配置文件让出80端口给区块链浏览器使用,到配置文件修改端口,注意docker映射端口和连接应用端口
设置管理平台访问端口为90
长安链管理平台访问地址:http://localhost:90
删除容器及数据卷(重新开始)
1 | docker-compose down -v |
Tips:链重启后,管理台需要重新订阅才生效
安装长安链
设置长安链在内网运行,节点node的IP都设置为内网IP。
长安链运行ERROR(可不管)
cmlogagentd文件缺失解决方案:https://git.chainmaker.org.cn/chainmaker/issue/-/issues/36
如果客户端调用SDK连接长安链失败,建议关闭所有的TLS
关闭TLS后,长安链数据明文传输,但是都在内网系统,可保证数据传输安全性
安装区块链浏览器
注意:可不用调整配置文件,docker-compose直接启动
但是,建议设置区块链浏览器端口为80,方便后期对外开放,到配置文件修改端口,注意docker映射端口和连接应用端口
建议修改MySQL对外端口为3307,避免与管理平台相同,外部访问困难
设置区块链浏览器访问端口为80
访问地址:http://localhost:80
删除容器及数据卷(重新开始)
1 | docker-compose down -v |
Tips:链重启后,需要修改订阅(一样配置即可)才生效
合约solidity编译
合约开发语言与虚拟机关系:https://docs.chainmaker.org.cn/dev/%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6.html
部署solidity合约需要选择EVM虚拟机,并上传 .bin 和 .abi 两个合约文件。参考:https://cloud.tencent.com/document/product/663/72542
FISCO编译
针对FISCO合约迁移长安链,可到WeBase控制台-合约管理-合约IDE-目标合约,直接复制abi和bin内容。
或者
右上角的导出java项目,也能得到两合约文件。(推荐)
ChainMaker-docker编译
ChainMaker的 Docker 镜像编译 solidity 合约代码:
solc 编译命令使用的是 0.8.4+**commit.c7e474f2.Linux.g++ 版本的编译器,被编译的 solidity 合约版本号必须大于等于 0.8.4,否则有可能编译告警或报错。
如果开发者不愿意修改 solidity 合约以适应 solc 编译器的版本,那么也可以直接使用 **Remix 编译。通过 Remix 编译出的字节码也可以在长安链上直接部署运行。
MacOS安装docker:https://yeasy.gitbook.io/docker_practice/install/mac
Docker Desktop for Apple silicon:https://docs.docker.com/desktop/mac/apple-silicon/
使用官方编译器,升级合约版本从0.5到0.8
- 显式标记override,virtual,参考:https://cloud.tencent.com/developer/article/1655754
- uint128(~0) 解决:https://coinspace.datat.one/questions/solidity/explicit-type-conversion-not-allowed-from-int-const-1-to-uint128/?zh=c
- Member sub not found or not visible after argument-dependent lookup in uint256解决:https://www.anycodings.com/1questions/1031630/solidity-error-member-sub-not-found-or-not-visible-after-argument-dependent-lookup-in-uint256
- Member “isContract” not found or not visible after argument-dependent lookup in address解决:using Address for address;
- Member “add” not found or not visible after argument-dependent lookup in uint256解决:using SafeMath for uint256;using Address for address;
- Function state mutability can be restricted to pur解决:https://www.twle.cn/t/639
- SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing “SPDX-License-Identifier:
“ to each source file. Use “SPDX-License-Identifier: UNLICENSED” for non-open-source code. Please see https://spdx.org for more information.解决:https://stackoverflow.com/questions/65234522/warning-spdx-license-identifier-not-provided-in-source-file
Remix编译
在线Remix地址:https://remix.ethereum.org
Remix编译合约教程:https://junyiseo.com/solidity/1020.html
Remix获取abi和bin文件:https://www.cnblogs.com/YpfBolg/p/14772356.html
Tips
合约初始化部署失败:合约编译不正确
附
长安链官方go语言ERC合约:https://git.chainmaker.org.cn/contracts/contracts-go/-/tree/master
部署调用合约
长安链管理台
通过长安链管理平台部署的合约,合约创建者为当前登录用户。针对简单合约,可以通过控制台成功调用。但是针对只能创建者调用的复杂合约,管理台部署的合约则不能调用成功。因为管理台部署合约的用户是当前登录用户,而调用合约的用户却是用户证书中的用户,二者不一致,所以调用一定不成功。针对这种复杂合约,只能通过CMC工具或者客户端SDK部署。还有用户一定要添加到链上才可以调用合约,在pwc和pwk模式下。
管理台调用合约交易失败解决方案:合约内部限制,需通过CMC工具或SDK部署及调用,以满足内部限制。
Tips:不建议使用长安链管理台部署合约,除非很简单的合约。感觉使用管理台部署合约,合约在使用中会出现些许意想不到的bug,徒增工作量。
客户端SDK
注意查看长安链版本号,需保证SDK版本与长安链版本适配。
SDK源码仓库:https://git.chainmaker.org.cn/chainmaker/sdk-java/-/tree/v2.1.0
SDK源码在实际项目中被打包为依赖引入工程使用。
SDK的Test部分描述了常用的调用方式,在工程开发中,有很强的参考性。
长安链客户端参考demo:https://git.chainmaker.org.cn/chainmaker/sdk-java-demo/-/tree/v2.2.0
需要修改的配置:sdk_config.yml,InitClient,把节点node的certs文件夹下载到工程目录crypto-config下
合约调用部分参考SDK的Test修改
sdk_config.yml
1 | # 如果没有开启TLS,enable_tls修改为false |
针对ERC1155合约转移调用失败,铸造查询等调用成功,解决:目标地址必须是链上用户才能转移成功,且要是私钥模式的长安链,证书模式的估计不行。私钥模式下,得先将私钥加入到链上,然后才能转移成功。
外部私钥用户授权平台地址方法(NFT持有者充当调用者,而不是平台管理员充当调用者):见PWK模式长安链
修改链账户模式
修改长安链账户模式为PWK模式(原来为cert模式)
ERC1155需要在PWK模式下才能正常运行,基于私钥+公钥+地址的合约需要使用PWK模式部署。
模式对比
对比项 \ 身份模式 | PermissionWithCert | PermissionWithKey | Public |
---|---|---|---|
模式名称 | 证书模式 | 公钥注册模式 | 公钥模式 |
模式简称 | cert 模式 | pwk 模式 | pk 模式 |
账户类型 | 节点账户 (共识节点、同步节点、轻节点), 用户账户 (管理员、普通用户) | 同证书模式 | 同证书模式 |
账户标识 | 数字证书 | 公钥 / 地址 | 公钥 / 地址 |
是否需要准入 | 是,证书需要 CA 签发 | 是,账户需要管理员在链上注册 | 否,普通用户可直接调用合约 |
账户与组织关系 | 账户属于某个组织 | 账户属于某个组织 | 账户无组织概念 |
适用链类型 | 联盟链 | 联盟链 | 公链 |
共识算法 | TBFT、RAFT、MaxBFT | TBFT、RAFT | TBFT、DPOS |
长安链管理平台目前只支持证书模式链,所以部署PWK模式的长安链只能通过命令工具部署,不能通过长安链可视化部署。
长安链区块链浏览器目前也只支持证书模式链
安装版本:v2.2.1,这个版本相对来说比较完善。
更高版本[v2.3.0_alpha]存在严重bug:SDK计算的地址和链上地址不一致【公私钥计算(SDK)出来的地址和链上地址不一样,即使是官方cmc工具生成的密钥对也是一样的,直接废掉。猜测是SDK的计算方法与链上的计算方法不一致导致的,等官方后续版本改进。】
命令工具部署长安链
- 命令行工具部署长安链:https://docs.chainmaker.org.cn/v2.2.0/html/tutorial/%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
- dial tcp 142.251.43.17:443: i/o timeout 解决:https://www.cnblogs.com/futurelifekin/p/16145106.html
- cannot use “quic-go doesn’t build on Go 1.19 yet.” (untyped string constant) as int value in variable declaration 解决:https://blog.csdn.net/huyuchengus/article/details/116903117(golang版本降低为1.16,小版本号随意)
- cmc工具验证长安链可用性:https://docs.chainmaker.org.cn/v2.2.0/html/dev/%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7pwk.html
一定修改 chainmaker-cryptogen/config/pwk_config_template.yml 中的 pk_algo 为RSA2048,ecc_p256下客户端实现非常非常困难。
长安链PWK模式下,要启用长安链管理平台和长安链区块链浏览器,需要改写源码实现
密钥对生成
通过RSA2048工具生成对应公私钥对,以字符串形式存储数据库。
如果没有修改pk_algo为RSA2048,默认为ecc_p256,则需要生成ecc_p256的密钥对(生成困难)。
建议修改pk_algo,生成常见的RSA2048密钥对。
验证密钥对合法性
如果密钥对类型不对,通过官方SDK计算出来的地址和链上的实际地址不一定相同,最好验证一下。
在ERC1155环境下(前提:密钥对添加到链上用户),可以使用当前用户作为调用者,调用ERC1155的create方法,再通过creators方法便可查询到当前token的铸造者地址,即当前用户的链上地址。再通过官方SDK方法,输入公钥,计算出地址。比较二者是否相同。
如果不相同的话,需看一下官方文档,看官方支持的密钥对算法,生成官方支持的公私钥对才行。
密钥对添加到链上用户
密钥对生成之后,需要使用公钥,把用户添加到链上,建议选择client角色。作为链上用户,可以以私钥发起链上调用,如完成ERC1155的授权方法、转移方法等。
ecc_p256难题
第一次搭建长安链,全部使用默认参数,即pk_algo为ecc_p256,遇到问题:
- JAVA客户端通过SDK一直连接不上链,一直报错,但是python-sdk和go-sdk能正常使用。大概原因是java-sdk当前版本还不支持这种算法。修改pk_algo为RSA2048,JAVA环境下才能正常连接。
python-sdk实现(PWK)
配置文件
1 | chain_client: |
配置文件创建client
1 | def pwk_with_rsa(config_dir): |
持有者充当调用者
1 | user = User(org_id='wx-org1.chainmaker.org', |
部署合约
1 | crypto_config_path = '/Users/chenlianghong/Documents/NFT/ChainMaker/code/sdk-python-v2.2.0/tests/resources/crypto-config' |
添加/查询/删除外部公钥用户
1 | # 添加外部公钥用户 |
调用合约
1 | def invoke_contract_evm(cc, method_temp, params_temp): |
获取mint铸造的token列表
1 | def invoke_contract_evm(cc, method_temp, params_temp): |
根据公私钥计算地址
1 | # 根据公钥获取用户地址 |
java-sdk实现(PWK)
部署的ERC1155合约的safeTransferFrom一直调用不成功,使用官方SDK编码encode的(其他方法正常调用)。
和python-SDK对比发现,二者encode后的method完全不一样,但都是使用官方SDK编码的。
java下方法safeTransferFrom编码后method:34e190b2
python下方法safeTransferFrom编码后method:f242432a
不得已放弃JAVA实现长安链客户端,选择使用python的Django实现。(望后续版本迭代中修复这个bug)
部分SDK使用如下,仅供参考。
sdk_config_pwk.yml
1 | chain_client: |
InitClient
1 | package chainmaker.sdk.demo; |
Contract
1 | package chainmaker.sdk.demo; |
Django
根据已有数据库表生成 model 类
1 | # 生成model |
单例注入
单例必须注入全局变量,使用的时候从全局变量导入过来
1 | class Client(object): |
Forbidden (CSRF cookie not set.)
- 在你创建的项目中,找到
settings.py
文件 - 文件 settings.py 找到
MIDDLEWARE
参数 - 注释掉
'django.middleware.csrf.CsrfViewMiddleware',
即可
统一异常处理
异常处理类
1 | # middlewares.py |
配置(erc1155为应用目录)
1 | MIDDLEWARE = [ |
异步(有bug)
参考异步视图:https://zhuanlan.zhihu.com/p/250187291,异步任务+异步视图实现。
1 | # 异步任务 |
多线程
1 | from django.shortcuts import render |
部署Ubuntu
因SDK服务为内部服务,所以没有使用Nginx代理。部署模式:Django+Anaconda+uwsgi。
- 安装Anaconda:https://cloud.tencent.com/developer/article/1649008#circle=on
- Anaconda设置国内镜像:https://blog.csdn.net/qq_40345954/article/details/114392892
- Anaconda使用:https://zhuanlan.zhihu.com/p/94744929#circle=on
- 安装Django指定版本:https://www.csdn.net/tags/NtjaEg4sMzEyNzMtYmxvZwO0O0OO0O0O.html#circle=on
- Anaconda安装uwsgi:https://bibichuan.gitee.io/posts/efa5a9e3.html#circle=on
- Anaconda安装uwsgi:conda Collecting package metadata (repodata.json) 卡住或 failed 问题:https://blog.csdn.net/qq_40345954/article/details/114392892,安装命令修改为:
conda install uwsgi
- Django软件依赖安装:https://developer.aliyun.com/article/835203#circle=on
- Anaconda查看环境绝对路径:https://blog.csdn.net/weixin_35757704/article/details/121994493,https://blog.csdn.net/Granery/article/details/90637573
- uwsgi配置实现:https://cloud.tencent.com/developer/article/1593045
- uwsgi服务状态检查:
ps -aux | grep uwsgi
,netstat -ntulp | grep 8000
,lsof -i:8000
修改时区
修改时区为东八区(上海时间)
1 | TIME_ZONE = 'Asia/Shanghai' |
关闭DEBUG
1 | # SECURITY WARNING: don't run with debug turned on in production! |
RSA生成加速
RSA生成不同长度公私钥的时间对比
pip install rsa
(数字越大生成的速度越慢)
生成加速需要增加进程,通过 poolsize=8
设置多进程。
更换生成方法,借助OpenSSL生成
pip install pyOpenSSL
1 | from OpenSSL.crypto import PKey |
性能优化
查看cpu个数:cat /proc/cpuinfo |grep "processor"|wc -l
,CPU个数一般等于processes
计算threads:
根据 linux 的默认进程和线程大小计算:
默认一个进程的堆栈大小是 2GB
默认一个线程的堆栈大小是 1MB
所以一个进程可以开 2G/1M=2048 个线程,但实际上内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小,一般情况会达到 1500 个线程。
设置listen
如果没有设置 uwsgi 的 –listen,如果 sysctl -a | grep net.core.somaxconn 发现 net.core.somaxconn=128。
那你使用 uwsgi 启动的服务,单机最大支持并发数为 100*(启动的 uwsgi 进程数)。
如果启动进程为 4 个,则最大并发只能支持 400,这样会在 uwsgi 的 log 日志中出现错误 uWSGI listen queue of socket 4 full。
同时,nginx 对应也会出现错误 ***** upstream time out。
修补措施:
临时生效
sysctl -w net.core.somaxconn=32768
sysctl -w net.ipv4.tcp_max_syn_backlog=8192永久生效
vi /etc/sysctl.conf
net.core.somaxconn=32768
net.ipv4.tcp_max_syn_backlog=8192
:wq
执行 sysctl -p 重新 load 参数设置,这样会立即生效,并且以后重新启动机器也会生效。查看是否修改成功
sysctl -a
sysctl -a | grep net.core.somaxconn设置 uwsgi 启动的 –listen 10000
Django性能优化,uwsgi.ini见下:
1 |
|
日志切割
uwsgi.ini
1 | # 修改及增加 |
/root/chainMaker-application/chainMaker/logs/uwsgi_log_cut.sh
1 |
|
/root/chainMaker-application/chainMaker/logs/clean_log.sh
1 |
|
区块链浏览器实现(PWK)
explorer-backend
修改非配置文件创建client为配置文件创建client
拷贝配置文件:crypto-config
,sdk_config_pwk_org1_admin.yml
sdk_config_pwk_org1_admin.yml 内容:
1 | chain_client: |
chain_client.go 修改为:
1 | /* |
修改docker-comopose.yml
- 指定数据库端口映射
- 指定数据库挂载目录(数据盘挂载目录下)
- 修改数据库默认密码
- 修改Web端暴露端口
- 分离MySQL为独立docker-compose
- 分离explorer_web为独立docker-compose
- 注释容器依赖depends_on
1 | version: "3.9" |
修改config.yml
- 修改数据库用户名 / 密码
1 | web: |
修改配置文件路径
- 这两个路径在本地GoLand调试是正常的,但是docker打包运行不正常。
1 | const ( |
- 打包运行时,需要修改这两个路径,具体修改参考Dockerfile:
1 | # docker下针对go运行bin的相对路径 |
部署
- docker镜像image的save和load方法针对相同的操作系统,否则load之后运行image会报错,建议拷贝项目到服务器再docker打包镜像image。
- 修改项目名称为chainmaker-explorer-server
- docker-build命令详见Makefile文件,注意镜像版本version需要与docker-compose一致。
- 打包完成,到docker目录,docker-compose up命令启动。
server初始化
执行curl请求,或者ApiFox执行,或者Web端执行(路径:/addchain),完成explorer-server的初始化。
推荐Web可视化执行——等explorer-web部署启动,直接访问首页,首页找不到则追加路径/addchain。
1 | # 服务IP:59.110.154.31(建议设置内网IP) |
explorer-MySQL
部署环境新建数据库工作目录 {WORKDIR}/chainmaker-explorer-mysql/docker
目录下拷贝 docker-compose.yml,注释前后端服务,修改为:
1 | version: "3.9" |
启动命令:
1 | cd {WORKDIR}/chainmaker-explorer-mysql/docker |
explorer-web
- 注释:新增订阅+修改订阅+取消订阅
本地调试:README.md文件查看本地启动命令,修改 src/utils/apis/request.ts
连接到实际后端,修改完成后需把配置切换回去。
1 | // // const BASEURL = 'http://192.168.1.108:8888/chainmaker'; |
注释新增订阅 注释修改订阅 注释取消订阅:直接关键词搜索位置,注释,并根据提示注释无用的组件和常量。
拷贝整个项目到服务器环境(不拷贝node_modules),docker打包,参考Makefile文件,注意镜像版本version与docker-compose一致。
解决RUN npm install卡死:安装与build.Dockerfile相同版本的Node,本机或服务器环境执行npm install,生成node_modules文件夹(需要拷贝node_modules),此文件夹将应用到docker的build环境。
Ubuntu安装指定版本的Node(小版本号)
1 | // Download |
服务器环境RUN npm install运行时间超长:在本地结合WebStorm构建项目,build出输出目录,修改build.Dockerfile,注释install+build过程,直接使用nginx和build目录构建镜像。
项目目录下新建docker目录,拷贝explorer-backend的docker-compose.yml文件,修改为:
1 | version: "3.9" |
docker启动cm_explorer_web服务。
修正区块链浏览器数据
部署完成后,区块链浏览器展示的节点数只有3个,本应该有4个,另外一个连接数据库,手动增加。
1 | # node_id 去 crypto-config/wx-org1.chainmaker.org/node/consensus1/consensus1.nodeid 获取 |
查询 node_id
组织与节点的关系也不对,手动绑定关系
区块链浏览器二次启动
原本在区块链浏览器可视化的Web界面重新订阅(修改订阅)即可实现重新连接,修改订阅的参数与创建订阅时的参数一致。
但现在区块链Web界面取消了那个按钮,所以需要调用后端接口API实现重新订阅。
通过curl、ApiFox等执行下面的请求即可实现重新订阅链,请求参数需要和创建订阅时的一致,可到数据库复制出数据,证书中的回车使用\n替换。
1 | curl --location --request POST 'http://59.110.154.31:9997/chainmaker/?cmb=ModifySubscribe' \ |
区块链浏览器发行转移数据缺失
本地调试发现,区块链浏览器发行、转移等数据不记录到数据库是因为数据库数据表cmb_contract_event的字段event_data长度不足导致的,而发行、转移行为在链上是成功的,修改字段event_data的长度即可,最大可设置到longtext。修正后,区块链浏览器数据正常。
链性能优化
chainmaker.yml
1 | txpool: |
bc.yml
1 | # Block proposing related settings |
其他问题
长安链后期大量数据处理方式,是继续增加挂载数据盘,还是冷热切割
建议暂时不处理,长安链后期会进行冷热数据切割分离,到时候直接升级即可。长安链浏览器数据库后期大量数据如何处理,分库分表吗?还是官方浏览器源码自带了某种解决策略?
长安链浏览器数据库暂时没有解决该问题,需要自己进行优化,例如主从复制、读写分离、分表分区。长安链浏览器官方源码部署,怎么增加安全性
由于目前联盟链的区块链浏览器偏向管理者查看,一般对IP有限制,所以长安链浏览器并未做太多安全性限制,如果后期需要,可以考虑使用高防CDN等技术。可以看下官方SDK下JAVA的方法名计算和python的方法名计算结果不一致,有一个发起上链一直失败,如计算:safeTransferFrom
Java SDK在计算safeTransferFrom时存在bug,可以先提issue,使用Python的SDK。SDK使用中建议同时连接4个节点操作,还是连接某一个节点即可
为了避免单点故障,提升性能,交易建议分别往多个节点发。但是需要考虑现实情况,是不是可以连接到别的组织的节点。ERC1155合约建议使用什么身份模式部署?
合约与身份模式无关,我们的方案建议使用证书模式(PermissionedWithCert),可以实现完整的权限设置和保护。一般来说开放联盟链才会使用Public模式。ERC1155合约环境下,密钥对算法推荐哪个?RSA,ecc,sm?
实测性能ECC>SM(gmssl)>SM(tencentsm)>RSA>SM(tjfoc),ECC和SM(gmssl)的整链性能大概差距10%,如果希望拥抱政策,建议使用后者,否则可以使用前者。Django部署生产应该注意的地方
使用Conda虚拟环境、UWSGI-Web服务、ini配置文件启动、虚拟环境安装依赖、调大操作系统通信参数、开启多线程、日志切割、基本脚本(开启、关闭、查看状态)Django部署生产性能优化方式
操作系统优化、listen最大值优化、多线程优化、开启master
IO密集应用,设置log-master在链的从0到1到投入生产的过程中,有什么需要注意的问题,以及有什么建议
充分的测试,最好需要参考官网cmc工具进行压力测试(例如压72小时),如:
nohup ./cmc parallel invoke –loopNum=3600000 –printTime=60 –threadNum=300 –timeout=360000 –sleepTime=100 –climbTime=5 –showKey=false –contract-name=dockerFact –method=invoke_contract –pairs=”” –pairs-file=”./testdata/save_go.json” –hosts=”127.0.0.1:12301” –auth-type=3 –hash-algorithm=SHA256 –user-keys=./testdata/crypto-config/node1/user/client1/client1.key –admin-sign-keys=./testdata/crypto-config/node1/admin/admin1/admin1.key &
代码提交建议使用流水线测试
资源监控,需要安装Prometheus,实时监控节点状态
建议开启pprof
建议启用服务器资源占用报警,及时抓取pprof/trace查看资源消耗情况
条件允许,建议存储分盘读写,提升效率
建议上线从内测开始,一段时间稳定后转正式上线