FISCO BCOS离线部署问题记录并解决
- 前言
- 步骤一:底层链的部署安装
- 步骤二:配置并使用控制台
- 步骤三:部署及调用HelloWorld合约
- 步骤四:webase 搭建
- 步骤五:合约编译
- 步骤六:分布式存储数据--链下mysql同步链上数据(世界状态库)
- 踩坑1:mysql 版本选择
- 踩坑2:group.1.ini配置文件修改
- 步骤七:数据导出系统组件--链下mysql同步链上数据(历史状态库)
- 踩坑1:脚本执行中需要下载安装gradle
- 踩坑2:配置文件环境更改
- 踩坑2:配置合约
- 附功能提示
- 1:端口检查
- 2.docker启动 mysql 时区选择
- 3.其他博文参考
前言
因项目需求团队要求,部署的服务器都不能访问外网,所以自己尝试了区块链底层网络节点、控制台、Webase 等离线部署,当然也遇到遇到坑,由此记录下来。
步骤一:底层链的部署安装
借鉴参考这个博文思路完成的底层链部署安装,即在一台有网络的服务器先在线安装好,然后将提前预设好的无网络服务器 ip 信息提前设置好,再移动节点信息到无网络的离线服务器上。
没有什么坑,一路还算顺畅。
FISCO BCOS离线无网络部署安装系列教程之底层链的部署安装(思路一)
步骤二:配置并使用控制台
这里参考FISCO BCOS官网步骤即可,受步骤1启发,提前下载好download_console.sh脚本文件,安装官方下载路径即可。
配置并使用控制台
步骤三:部署及调用HelloWorld合约
这里依然参考官网步骤即可。
部署及调用HelloWorld合约
步骤四:webase 搭建
参考官网,需要提前装好 jdk 环境(建议1.8)
webase 搭建
也可以参考这个更全面复杂版本,因我们项目不需要如此复杂的功能,即采用官网版本即可
FISCO BCOS离线无网络部署安装系列教程之区块链浏览器fisco-bcos-browser v2.2.1的部署安装
步骤五:合约编译
当 webase 搭建好后,将项目所需合约文件(即.sol 文件)放到页面(http://x.x.x.x:5002/WeBASE-Front)合约管理页面功能-合约 IDE 中,将主合约编译、部署,即可在合约列表中看到。
合约列表中可看到编译部署后的合约,可通过调用合约测试合约方法是否生效
期间需要先创建一个测试用户才行,后续也会用到这个用户的.pem 文件
步骤六:分布式存储数据–链下mysql同步链上数据(世界状态库)
因项目查询速率需求,我们做了链下 mysql 同步链上数据的扩展需求,分别拉取了世界状态库数据和历史状态库数据,这步为同步世界状态库数据。
参考官网步骤分布式存储
踩坑1:mysql 版本选择
前提需先离线安装 mysql(建议5.7版本)一个小坑,我离线部署时使用 docker 的mysql8版本镜像试过,不能实现分布式存储数据同步,所以建议还是采用官网使用的5.7版本为好。
踩坑2:group.1.ini配置文件修改
根据官网步骤操作到修改group.1.ini配置文件时,除了官方所说的数据库名称、用户名、密码、ip、端口号需要修改的同事,还要注意一个小细节也要修改,就是在storage 下有一个 type 类型,默认的是 rocksdb,但是因为我们项目采用的是 mysql 所以这里也要同步改成 type=mysql 才行,这个真是隐藏的大坑呀,官网教程也是用的 mysql 却一点没有提及修改此处。
步骤七:数据导出系统组件–链下mysql同步链上数据(历史状态库)
除了世界状态库,区块链更多需要溯源、检索等需求的时候就需要查询历史状态了,所以还需要同步历史状态库,同理也是参考官网部署方式数据导出系统组件
基本也是安装官网,将所需的脚本先下载好,再移动到离线服务器上,再通过修改一些配置文件等操作达到目的。
踩坑1:脚本执行中需要下载安装gradle
但是这次的脚本不能直接在离线服务器上运行,因为脚本中涉及到下载gradle wrapper,但是在离线服务器中是没有办法连接外网的,所以此行不通,我也有尝试在服务器中自己安装,但是执行脚本的时候还是会有依赖包等问题,总之就是此行不通了。
解决方式:也是借鉴步骤1的思路,在一个可联网的环境下先执行脚本运行完成,生成脚本运行后的 Data-Export*.jar 包,再移动到离线服务器中即可。
踩坑2:配置文件环境更改
在application.properties文件修改中的 ip应该修改为离线服务器的 ip,替换掉127.0.0.1,不然运行 jar 本会访问底层链不通
踩坑2:配置合约
遇到运行 jar 包后出现合约方法和事件数据没有导出的情况,最终还是根据官方提示,删除config/solidity/下已配置的未成功导出数据的合约,并将config/solidity/bin/(非国密目录/ecc/、国密目录为/sm/)下bin文件的内容替换为合约部署位置(如WeBase)编译得到的binary,然后清理数据库表重新启动即可
附功能提示
1:端口检查
因离线服务器,所有的端口都没有默认开启,所以上述操作中遇到用到的一些常用端口需要自己手动打开防火墙,比如(3306、20200、30300、8485、5002)等
firewall-cmd --list-ports #查看已经开放的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent #开放端口3306
firewall-cmd --reload #重启firewall
firewall-cmd --list-ports #检查3306是否开放
2.docker启动 mysql 时区选择
因我后续更改为 docker 启动 mysql5.7版本,服务器的时区检查(date 命令)后显示是 CST,但是通过 docker启动的 mysql 版本默认时区是 UTC,所以就出现时区不一致,当时启动历史版本库的 jar 包的时候一直创建不了 data-export 库我以为是这个时区的问题,好折腾了一翻,也记录一下吧。
在docker 创建容器时给设置时区如下命令:
docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -e TZ=Asia/Shanghai -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
修改Docker容器中的mysql时区的三种方式
mysql 怎么修改时区文章来源:https://uudwc.com/A/ERrM
3.其他博文参考
CentOS7.5离线安装jdk1.8
centos7下离线安装MySQL5.7文章来源地址https://uudwc.com/A/ERrM