文章目录
样题题目(任务1-2,1-3)
任务 1-2:区块链系统部署与运维
围绕区块链航班延误险平台1部署与运维需求,进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护,具体要求如下:
- 根据参数与端口设置要求,部署区块链系统并验证;
- 根据参数与端口设置要求,部署区块链网络管理平台并验证;
- 基于区块链系统相关管理平台,按照任务指南实施系统运维工作并验证;
- 基于区块链系统相关监管工具,按照任务指南对区块链系统进行监管。
子任务 1-2-1:搭建区块链系统并验证
基于给定的虚拟机环境 M1-A、M1-B 以及链环境(地址“/root/tools”), 搭建如下图所示的双机、三机构、二群组、七节点的星形组网拓扑区块链系统。 其中,二群组名称分别为 group1、group2,三个机构名称为 agencyA、agencyB、 agencyC。p2p_port、channel_port、jsonrpc_port 起始端口分别为 30330、20230、 8545,确保搭建的区块链系统能正常运行。
具体工作内容如下:
(1)采用默认配置分别搭建双主机区块链网络;
(2)通过命令分别在 M1-A 和 M1-B 上验证区块链节点进程运行状况;
(3)通过命令分别在 M1-A 和 M1-B 上验证区块链连接状态和共识状态日志 输出。
子任务 1-2-2:搭建区块链系统管理平台并验证
基于给定服务器环境以及软件(地址“/root/tools”),搭建区块链控制 台并开展相关运维工作,具体工作内容如下:
(1)在 M1-A 主机上面配置控制台,修改配置信息,使用 Console 连接 agencyB 中节点,部署 HelloWorld.sol 智能合约;
(3)使用控制台完成 HelloWorld.sol 智能合约中的 set 与 get 方法操作;
(3)使用机器 M1-A 控制台检查区块链中的当前区块高度以及查看部署合约 的交易详情。
子任务 1-2-3:区块链节点运维
基于已完成的区块链系统与管理平台搭建工作,开展区块链节点的加入与退 出运维工作,具体内容如下:
(1)基于服务器中的扩容工具,在机器(M1-B)上进行新节点(Node7)扩 容并加入群组 Group1;
(2)使用机器(M1-B)检查扩容完成的区块链节点(Node7)的连接状况以 及新节点在群组(Group1)中的共识状态;
(3)修改配置文件,指定 node3 输出等级为警告级,并设置日志存储阈值 为 50MB。
子任务 1-2-4:区块链网络运维
根据任务描述要求,完成网络配置与管理运维操作,具体内容如下:
(1) 设置区块链系统黑名单,修改 M1-B 的 node7 配置将 node3 设为黑名 单,并通过命令检查;
(2) 在 M1-A 上将区块链网络中群组 2 的最大交易数量设为 3000;
(3) 在 M1-A 上通过控制台检查群组 2 的区块最大打包交易数量。
任务 1-3:区块链系统测试
设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约进 行系统测试、性能测试等; 根据业务需求,分析并且修复给定智能合约中的安全 漏洞。利用模拟业务和测试工具来完成对区块链系统服务数据的测试。
子任务 1-3-1:系统测试
在 M1-A 登录 linux 服务器,进入指定操作目录(/root/tools/webase)中 完成区块链节点管理器的配置部署,并进行节点接口测试,具体操作任务如下:
(1)完成 webase-node-manager 数据库初始化操作;
(2)修改 application.yml 配置文件,进行 webase-node-manager 服务配 置,包括数据库名称,数据库用户,数据库密码等;
(3)使用命令启动 webase-node-manager 管理平台服务,并检查节点管理 是否正常启动;
(4)进行节点管理服务的 API 接口(创建 front 对象)测试。
子任务 1-3-2:压力测试
基于 M1-A 虚拟机,使用提供的 caliper 素材,进入/root/tools/benchmarks 目录下使用 Caliper 测试工具对 HelloWorld.sol 中 set 和 get 功能进行压力测 试,具体操作任务如下:
(1)修改 fisco-bcos.json 文件,配置连接节点为 agencyA 的 node0 节点, 测试合约为 HelloWorld.sol;
(2)配置进行压测的 js 信息,设置 txNumber=100,tps=1;
(3)提供 set 功能核心测试代码;
(4)提供 get 功能核心测试代码;
(5)执行压测,所有测试通过率为 100%。
教程和答案说明
本文档是笔者完成这些题目时的实录,因此可能琐碎并附有个人理解。文中含有对每一步操作的解释。读者可以跟随本文操作完成题目,同时能够理解每一步操作的原理。笔者认为“理解”比“做完”更为重要。
笔者手中的材料包括:样题的题目(word文档)、样题的虚拟机镜像文件(模块一、模块二、模块三分别有一份)。操作环境为一台windows台式机,装有vmware workstation。样题的虚拟机镜像导入vmware中可创建虚拟机。本文只包含任务1-2和1-3的部分,因此只用到模块一的镜像。
笔者完成这些题目的过程中,除参考官方文档外(这部分参考会在后文中列出),部分地方还参考了其他作者的文章,这里一并感谢:
- 2023年区块链职业技能大赛——区块链应用技术(一)模块一
- 2023年全国职业院校技能大赛高职组“区块链技术应用”赛项赛卷(3卷)解析
- FISCO BCOS离线无网络部署安装系列教程之WeBase v1.4.1部署安装
最后,笔者完成题目过程中还受到deepseek的很多帮助,在这里向deepseek开发团队致敬。事实上如ChatGPT, deepseek这些AI大模型具有很强的能力,善用这些工具能够极大提高我们的学习工作效率。
下面是操作流程实录和解析。
区块链系统部署与运维(任务1-2)
环境准备
虚拟机创建
因为要搭建双机的网络,所以需要两台虚拟机。在vmware workstation里“文件–打开–选择模块一的镜像文件”,创建虚拟机,命名为M1-A。重复一次,再创建一个虚拟机,命名为M1-B
网络配置
需要两台虚拟机能够在同一个子网内,从而可以通信。右击M1-A,“设置–网络适配器”,在网路连接部分,选择“NAT模式”。这样,虚拟机就可以通过主机的网络联网,并且虚拟机在子网中被分配了一个IP地址,这个地址将用于虚拟机之间的通信。
打开虚拟机M1-A,命令行中输入ifconfig
,看到ens33字段内网络IP为192.168.157.129
(我们的环境如此。请以实际情况为准)。
对M1-B重复上述网络设置,看到M1-B的IP为192.168.157.128
至此我们知道,在子网192.168.157/24
中,IP分别为:
- 虚拟机M1-A:
192.168.157.129
- 虚拟机M1-B:
192.168.157.128
可以在一台机器上ping另一台机器检查网络连接情况。例如,在M1-A中,ping 192.168.157.128
(M1-B的地址),收到回复,说明M1-A请求M1-B可以连通。
检查两台虚拟机可以互相连通后,进入下一步。
区块链搭建
创建配置信息
参考:
这里将逐步介绍操作流程。
首先需要启动M1-A和M1-B两个虚拟机。
进入M1-A虚拟机。我们在M1-A虚拟机上进行各种配置和区块链网络启动操作。
sudo su # 进入root
cd /root/tools
# 创建配置信息
# 格式为 ip:num agency_name group_list
# ip是机器IP,num是节点数量,agency_name是机构名称,group_list是该机构所在的群组列表
cat >> ipconf << EOF
> 192.168.157.129:2 agencyA 1
> 192.168.157.129:2 agencyB 2
> 192.168.157.128:3 agencyC 1,2
> EOF
此时,在目录下能看到ipconf
配置文件:
$ cat ipconf
192.168.157.129:2 agencyA 1
192.168.157.129:2 agencyB 2
192.168.157.128:3 agencyC 1,2
接下来使用脚本创建区块链网络配置数据。注意它提供的脚本有一点小bug,这里需要先修改一下脚本:
这里需要修改build_chain.sh,否则它一个ip只会生成一个sdk文件,那么在M1-A中生成了agencyA的sdk文件后,再尝试agencyB的sdk时会发现sdk目录已经存在,于是就跳过了agencyB的sdk文件生成!
cp build_chain.sh build_chain.sh.bak # 先备份一下,方便日后找回原版脚本 vim build_chain.sh # 这里我是用vim,也可以使用其他你们熟悉的文本编辑工具 # 在第1715行(vim中要查看行号,可以使用命令`:set nu`),修改如下: ... 1714 [ -z "$(get_value "${ip//[\.:]/_}_count")" ] && set_value "${ip//[\.:]/ _}_count" 0 1715 # sdk_path="${output_dir}/${ip}/sdk" 1716 sdk_path="${output_dir}/${ip}/sdk-${agency_array[${server_count}]}" 1717 local agency_gm_path="${output_dir}/gmcert/${agency_array[${server_coun t}]}-gm" ... # 左侧1715,1716是行号,即把原本1715行注释掉,加入1716行的内容
现在可以使用脚本创建区块链网络配置了:
注:如果这一步遇到
curl: (6) Could not recolve host: github.com
,说明是环境没有外网连接。考虑到比赛环境中确实是没有外网的,我补充了一个离线使用build_chain.sh
的方案,见此文:【手把手教程】职业学校技能大赛“区块链技术应用”赛项-解决离线环境下build_chain.sh无法连接到github问题
# -p后三个参数分别是p2p_port, channel_port, jsonrpc_port
bash build_chain.sh -f ipconf -p 30330,20230,8545
看到All completed
提示信息,说明配置生成完成。所有配置数据都在./nodes
目录下。查看:
$ tree nodes
nodes
├── 192.168.157.128
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── group.1.genesis
│ │ │ ├── group.1.ini
│ │ │ ├── group.2.genesis
│ │ │ ├── group.2.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── node1
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── group.1.genesis
│ │ │ ├── group.1.ini
│ │ │ ├── group.2.genesis
│ │ │ ├── group.2.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── node2
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── group.1.genesis
│ │ │ ├── group.1.ini
│ │ │ ├── group.2.genesis
│ │ │ ├── group.2.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── sdk-agencyC
│ │ ├── ca.crt
│ │ ├── sdk.crt
│ │ ├── sdk.key
│ │ └── sdk.publickey
│ ├── start_all.sh
│ └── stop_all.sh
├── 192.168.157.129
│ ├── download_bin.sh
│ ├── download_console.sh
│ ├── fisco-bcos
│ ├── node0
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── group.1.genesis
│ │ │ ├── group.1.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── node1
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── group.1.genesis
│ │ │ ├── group.1.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── node2
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── group.2.genesis
│ │ │ ├── group.2.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── node3
│ │ ├── conf
│ │ │ ├── ca.crt
│ │ │ ├── group.2.genesis
│ │ │ ├── group.2.ini
│ │ │ ├── node.crt
│ │ │ ├── node.key
│ │ │ └── node.nodeid
│ │ ├── config.ini
│ │ ├── scripts
│ │ │ ├── load_new_groups.sh
│ │ │ ├── monitor.sh
│ │ │ ├── reload_sdk_allowlist.sh
│ │ │ └── reload_whitelist.sh
│ │ ├── start.sh
│ │ └── stop.sh
│ ├── sdk-agencyA
│ │ ├── ca.crt
│ │ ├── sdk.crt
│ │ ├── sdk.key
│ │ └── sdk.publickey
│ ├── sdk-agencyB
│ │ ├── ca.crt
│ │ ├── sdk.crt
│ │ ├── sdk.key
│ │ └── sdk.publickey
│ ├── start_all.sh
│ └── stop_all.sh
└── cert
├── agencyA
│ ├── agency.crt
│ ├── agency.key
│ ├── agency.srl
│ ├── ca.crt
│ └── cert.cnf
├── agencyB
│ ├── agency.crt
│ ├── agency.key
│ ├── agency.srl
│ ├── ca.crt
│ └── cert.cnf
├── agencyC
│ ├── agency.crt
│ ├── agency.key
│ ├── agency.srl
│ ├── ca.crt
│ └── cert.cnf
├── ca.crt
├── ca.key
├── ca.srl
└── cert.cnf
30 directories, 138 files
拷贝配置信息
每个节点的配置信息需要放到对应的机器上。使用scp
# 同步nodes信息到M1-B(另一台机器)上,用scp复制过去
scp -r nodes/ root@192.168.157.128:/root/tools/
此时,在M1-A和M1-B的/root/tools
目录下均可见nodes
目录:
# M1-A(本机)
ls # 可见nodes目录
# M1-B
ssh root@192.168.157.128 "ls /root/tools" # 可见nodes目录
启动区块链网络
仍然在M1-A中,通过ssh启动区块链节点。
# 启动本机(M1-A)上的节点
bash /root/tools/nodes/192.168.157.129/start_all.sh
# 看到node0到node3共四个节点start successfully
# 启动M1-B上的节点
ssh root@192.168.157.128 "bash /root/tools/nodes/192.168.157.128/start_all.sh"
# 看到node0到node2共四个节点start successfully
至此,区块链已经成功启动。子任务1-2-1(1)完成
检查节点和链状态
我们仍然在M1-A上,通过命令行检查各个机器上的节点和链状态
检查节点进程运行情况
M1-A上运行情况:
$ ps aux | grep fisco | grep -v grep
root 8274 0.6 0.2 627644 25984 pts/0 Sl 17:57 0:02 /root/tools/192.168.157.129/node0/../fisco-bcos -c config.ini
root 8276 0.6 0.2 627640 28060 pts/0 Sl 17:57 0:02 /root/tools/192.168.157.129/node1/../fisco-bcos -c config.ini
root 8279 0.5 0.2 627644 28188 pts/0 Sl 17:57 0:02 /root/tools/192.168.157.129/node2/../fisco-bcos -c config.ini
root 8281 0.5 0.2 627640 26136 pts/0 Sl 17:57 0:02 /root/tools/192.168.157.129/node3/../fisco-bcos -c config.ini
可见节点运行正常。
M1-B上运行情况:
$ ssh root@192.168.157.128 "ps aux | grep fisco | grep -v grep"
root 58738 1.2 0.3 875564 30732 ? Sl 17:59 0:06 /root/tools/192.168.157.128/node1/../fisco-bcos -c config.ini
root 58741 1.2 0.3 875568 31244 ? Sl 17:59 0:06 /root/tools/192.168.157.128/node0/../fisco-bcos -c config.ini
root 58793 1.2 0.2 875568 29892 ? Sl 17:59 0:06 /root/tools/192.168.157.128/node2/../fisco-bcos -c config.ini
可见节点运行正常。
至此,完成1-2-1(2)
检查连接状态
M1-A上节点网络连接状态:
$ tail -f /root/tools/nodes/*/node0/log/* | grep -i connected
info|2025-02-25 18:13:06.763500|[P2P][Service] heartBeat,connected count=6
info|2025-02-25 18:13:16.763991|[P2P][Service] heartBeat,connected count=6
info|2025-02-25