首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【手把手教程】职业学校技能大赛“区块链技术应用”赛项-样题-区块链部署&运维&测试部分(任务1-2,1-3)

  • 25-04-25 09:44
  • 3944
  • 5675
blog.csdn.net

文章目录

  • 样题题目(任务1-2,1-3)
    • 任务 1-2:区块链系统部署与运维
      • 子任务 1-2-1:搭建区块链系统并验证
      • 子任务 1-2-2:搭建区块链系统管理平台并验证
      • 子任务 1-2-3:区块链节点运维
      • 子任务 1-2-4:区块链网络运维
    • 任务 1-3:区块链系统测试
      • 子任务 1-3-1:系统测试
      • 子任务 1-3-2:压力测试
  • 教程和答案说明
  • 区块链系统部署与运维(任务1-2)
    • 环境准备
      • 虚拟机创建
      • 网络配置
    • 区块链搭建
      • 创建配置信息
      • 拷贝配置信息
      • 启动区块链网络
    • 检查节点和链状态
      • 检查节点进程运行情况
      • 检查连接状态
      • 检查共识状态日志输出
    • 搭建控制台
      • 准备环境
      • 拷贝证书
      • 修改控制台配置
      • 启动控制台
    • 控制台使用
      • 部署HelloWorld合约
      • 调用合约get和set函数
      • 检查区块链中当前区块高度
      • 查看部署合约的交易详情
    • 区块链节点运维
      • 配置新节点node7
      • 启动新节点
      • 检查新节点连接状况
      • 将新节点加入group1
      • 查看新节点在group1中的共识状态
      • 修改node3(M1-A)输出等级和日志存储阈值
    • 区块链网络运维
      • 为node7设置黑名单
      • 修改group2的最大交易数量为3000
      • 检查group2的区块最大打包交易数量
  • 区块链系统测试(子任务1-3-1)
    • 部署webase-node-manager平台
      • 解决mysql问题
      • 修改webase.sh配置文件
      • 修改application.yml配置文件
      • 启动webase-node-manager服务
    • 检查节点管理是否正常启动
    • 节点管理服务的API接口(创建front对象)测试
      • 启动webase-front服务
      • 创建front对象
  • 压力测试(子任务1-3-2)
    • 补充

样题题目(任务1-2,1-3)

任务 1-2:区块链系统部署与运维

围绕区块链航班延误险平台1部署与运维需求,进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护,具体要求如下:

  1. 根据参数与端口设置要求,部署区块链系统并验证;
  2. 根据参数与端口设置要求,部署区块链网络管理平台并验证;
  3. 基于区块链系统相关管理平台,按照任务指南实施系统运维工作并验证;
  4. 基于区块链系统相关监管工具,按照任务指南对区块链系统进行监管。

子任务 1-2-1:搭建区块链系统并验证

基于给定的虚拟机环境 M1-A、M1-B 以及链环境(地址“/root/tools”), 搭建如下图所示的双机、三机构、二群组、七节点的星形组网拓扑区块链系统。 其中,二群组名称分别为 group1、group2,三个机构名称为 agencyA、agencyB、 agencyC。p2p_port、channel_port、jsonrpc_port 起始端口分别为 30330、20230、 8545,确保搭建的区块链系统能正常运行。

img

具体工作内容如下:

(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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

此时,在目录下能看到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
  • 1
  • 2
  • 3
  • 4

接下来使用脚本创建区块链网络配置数据。注意它提供的脚本有一点小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行的内容

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

现在可以使用脚本创建区块链网络配置了:

注:如果这一步遇到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
  • 1
  • 2

看到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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172

拷贝配置信息

每个节点的配置信息需要放到对应的机器上。使用scp

# 同步nodes信息到M1-B(另一台机器)上,用scp复制过去
scp -r nodes/ [email protected]:/root/tools/
  • 1
  • 2

此时,在M1-A和M1-B的/root/tools目录下均可见nodes目录:

# M1-A(本机)
ls		# 可见nodes目录

# M1-B
ssh [email protected] "ls /root/tools"	# 可见nodes目录
  • 1
  • 2
  • 3
  • 4
  • 5

启动区块链网络

仍然在M1-A中,通过ssh启动区块链节点。

# 启动本机(M1-A)上的节点
bash /root/tools/nodes/192.168.157.129/start_all.sh
# 看到node0到node3共四个节点start successfully

# 启动M1-B上的节点
ssh [email protected] "bash /root/tools/nodes/192.168.157.128/start_all.sh"
# 看到node0到node2共四个节点start successfully
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

至此,区块链已经成功启动。子任务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
  • 1
  • 2
  • 3
  • 4
  • 5

可见节点运行正常。

M1-B上运行情况:

$ ssh [email protected] "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
  • 3
  • 4

可见节点运行正常。

至此,完成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 18:13:26.764565|[P2P][Service] heartBeat,connected count=6
  • 1
  • 2
  • 3
  • 4

M1-B上节点网络连接状态:

$ ssh [email protected] "tail -f /root/tools/nodes/*/node0/log/* | grep -i connected --line-buffered"
[email protected]'s password: 
info|2025-02-25 18:59:58.741809|[P2P][Service] heartBeat,connected count=6
info|2025-02-25 19:27:28.806986|[P2P][Service] heartBeat,connected count=6
  • 1
  • 2
  • 3
  • 4

注:这里加入了–line-buffered,用于实时输出匹配行,这样我们才能在M1-A的终端中看到M1-B那边运行的输出

检查共识状态日志输出

M1-A上的共识状态:

$ tail -f /root/tools/nodes/*/node0/log/* | grep -i +++
info|2025-02-25 19:31:03.465891|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=2,hash=0963a24c...
info|2025-02-25 19:31:08.506660|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=2,hash=87c142da...
info|2025-02-25 19:31:13.549160|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=2,hash=483b3058...
info|2025-02-25 19:31:18.585441|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=2,hash=91ab11b6...
  • 1
  • 2
  • 3
  • 4
  • 5

不断输出日志,表明共识正常。

M1-B上的共识状态:

$ ssh [email protected] "tail -f /root/tools/nodes/*/node0/log/* | grep -i +++ --line-buffered"
[email protected]'s password: 
info|2025-02-25 17:59:59.644878|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=6fc779c5...
info|2025-02-25 17:59:59.665898|[g:2][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=d9fd0c17...
info|2025-02-25 19:32:53.160984|[g:2][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=644318d4...
info|2025-02-25 19:32:53.204610|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=70c9fae5...
info|2025-02-25 19:32:58.190796|[g:2][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=2a478a67...
info|2025-02-25 19:32:58.229968|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=1,tx=0,nodeIdx=1,hash=db27c6a6...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

不断输出日志,表明共识正常。

至此,完成1-2-1(3)。子任务1-2-1全部完成。

搭建控制台

要求在M1-A中搭建控制台,所以以下操作都是在M1-A中完成。

参考:搭建多机区块链–使用控制台

参考:控制台使用

sudo su
cd /root/tools
  • 1
  • 2

准备环境

控制台,不需要按照教程下载,因为虚拟机里已经下载好了。只需解压缩console.tar.gz

tar -xzvf console.tar.gz	# 这样就多出了一个console目录
  • 1

拷贝证书

cp -r nodes/192.168.157.12*/sdk-agency* ./console/conf
cd console/conf
cp sdk-agencyA/* .	# 先拿agencyA的sdk配置来试一下
  • 1
  • 2
  • 3

修改控制台配置

cp config-example.toml config.toml
sed -i 's/peers=\["127.0.0.1:20200", "127.0.0.1:20201"\]/peers=["192.168.157.129:20230", "192.168.157.129:20231", "192.168.157.129:20232", "192.168.157.129:20233", "192.168.157.128:20230", "192.168.157.128:20231", "192.168.157.128:20232"]/g' ./config.toml	# 这里填入全部的7个节点的channel_port
  • 1
  • 2

启动控制台

cd ..
bash start.sh
  • 1
  • 2

看到

=============================================================================================
Welcome to FISCO BCOS console(2.8.0)!
Type 'help' or 'h' for help. Type 'quit' or 'q' to quit console.

________ ______  ______   ______   ______       _______   ______   ______   ______

|        |      \/      \ /      \ /      \     |       \ /      \ /      \ /      \ 
| $$$$$$$$\$$$$$|  $$$$$$|  $$$$$$|  $$$$$$\    | $$$$$$$|  $$$$$$|  $$$$$$|  $$$$$$\
| $$__     | $$ | $$___\$| $$   \$| $$  | $$    | $$__/ $| $$   \$| $$  | $| $$___\$$
| $$  \    | $$  \$$    \| $$     | $$  | $$    | $$    $| $$     | $$  | $$\$$    \ 
| $$$$$    | $$  _\$$$$$$| $$   __| $$  | $$    | $$$$$$$| $$   __| $$  | $$_\$$$$$$\
| $$      _| $$_|  \__| $| $$__/  | $$__/ $$    | $$__/ $| $$__/  | $$__/ $|  \__| $$
| $$     |   $$ \\$$    $$\$$    $$\$$    $$    | $$    $$\$$    $$\$$    $$\$$    $$
 \$$      \$$$$$$ \$$$$$$  \$$$$$$  \$$$$$$      \$$$$$$$  \$$$$$$  \$$$$$$  \$$$$$$

=============================================================================================
[group:1]> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

说明控制台启动成功。要查看控制台用法,使用命令help。要退出控制台,使用命令quit或q。

控制台使用

参考:控制台使用

这里完成子任务1-2-2部分。连接agencyB中的节点并部署HelloWorld.sol合约;调用合约set和get方法;检查当前区块高度和部署合约的交易详情。

要使用agencyB中的节点,需要使用agencyB的sdk文件:

cp conf/sdk-agencyB/* conf
  • 1

启动控制台。注意agencyB是在group2里,所以要启动group2(没有参数的化默认是启动group1)

./start.sh 2
  • 1

部署HelloWorld合约

合约代码在contracts/solidity目录下

查看部署合约的用法:

[group:2]> deploy --help
Deploy a contract on blockchain.
Usage: 
deploy contractNameOrPath

* contractNameOrPath -- The name of a contract or the path of a contract (Default load contract from the "contracts/solidity" path when using contractName).
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

部署合约:

[group:2]> deploy HelloWorld
transaction hash: 0x94a4942056acbcb685459fd30387209db291334fedf40a387ed013dee45265ef
contract address: 0x261793accf369b8392c6938b0f5fa4b47c528664
currentAccount: 0x3b4187a8b37f2050dc4d64a4653d5a390f311d13
  • 1
  • 2
  • 3
  • 4

调用合约get和set函数

[group:2]> call --help
Call a contract by a function and paramters.
Usage: 
call contractNameOrPath contractAddress function parameters

* contractNameOrPath -- The name of a contract or the path of a contract, when set to "latest", the contract address is the latest contract address (Default load contract from the "contracts/solidity" path when using contractName).
* contractAddress -- 20 Bytes - The address of a contract.
* function -- The function of a contract.
* parameters -- The parameters(splited by a space) of a function.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

调用set,传入参数是一个string(可以在contracts/solidity/HelloWorld.sol中查看函数参数列表):

[group:2]> call HelloWorld 0x261793accf369b8392c6938b0f5fa4b47c528664 set "Bonjour!"
transaction hash: 0xc4549ba1c02838940e6928059cec37cea71b840600db1afa3b7ed02a7e85ad81
---------------------------------------------------------------------------------------------
transaction status: 0x0
description: transaction executed successfully
---------------------------------------------------------------------------------------------
Receipt message: Success
Return message: Success
Return values:[]
---------------------------------------------------------------------------------------------
Event logs
Event: {}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

调用get,看到return value是刚才set进去的"Bonjour!":

[group:2]> call HelloWorld 0x261793accf369b8392c6938b0f5fa4b47c528664 get
---------------------------------------------------------------------------------------------
Return code: 0
description: transaction executed successfully
Return message: Success
---------------------------------------------------------------------------------------------
Return value size:1
Return types: (STRING)
Return values:(Bonjour!)
---------------------------------------------------------------------------------------------
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

检查区块链中当前区块高度

[group:2]> getBlockNumber
2
  • 1
  • 2

查看部署合约的交易详情

从前面看到,部署合约交易的tx hash是0x94a4942056acbcb685459fd30387209db291334fedf40a387ed013dee45265ef

[group:2]> getTransactionByHash 0x94a4942056acbcb685459fd30387209db291334fedf40a387ed013dee45265ef
{
    blockHash='0xcd6bd07753a8bbc363495a00b2343143ae6c48a1b649e5c984d25dc2570b6413',
    blockNumber='0x1',
    from='0x3b4187a8b37f2050dc4d64a4653d5a390f311d13',
    gas='0x419ce0',
    hash='0x94a4942056acbcb685459fd30387209db291334fedf40a387ed013dee45265ef',
    input='0x608060405234801561001057600080fd5b506040805190810160405280600d81526020017f48656c6c6f2c20576f726c6421000000000000000000000000000000000000008152506000908051906020019061005c929190610062565b50610107565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b61010491905b808211156101005760008160009055506001016100e8565b5090565b90565b6102d7806101166000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680634ed3885e146100515780636d4ce63c146100ba575b600080fd5b34801561005d57600080fd5b506100b8600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061014a565b005b3480156100c657600080fd5b506100cf610164565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010f5780820151818401526020810190506100f4565b50505050905090810190601f16801561013c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b8060009080519060200190610160929190610206565b5050565b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101fc5780601f106101d1576101008083540402835291602001916101fc565b820191906000526020600020905b8154815290600101906020018083116101df57829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024757805160ff1916838001178555610275565b82800160010185558215610275579182015b82811115610274578251825591602001919060010190610259565b5b5090506102829190610286565b5090565b6102a891905b808211156102a457600081600090555060010161028c565b5090565b905600a165627a7a72305820e32c234959759785da20746da4dd6fd062f151034e74512bc1bc1c181c0c810f0029',
    nonce='0x32945304be51967aac8cc31898034f291caba0ca2aea8ff75b406235410e906',
    to='0x0000000000000000000000000000000000000000',
    transactionIndex='0x0',
    value='0x0',
    gasPrice='0x51f4d5c00',
    blockLimit='0x1f4',
    chainId='0x1',
    groupId='0x2',
    extraData='0x',
    signature={
        r='0x65f0d3a8e73f76766fedc85ee2dd151af4a8a16a5c2ff2ecddb3ada2cddcbac1',
        s='0x2a403f73c4a66e7aa1667d3e04feb011254441f85d8d87a043dc0b5a9e47076a',
        v='0x1',
        signature='0x65f0d3a8e73f76766fedc85ee2dd151af4a8a16a5c2ff2ecddb3ada2cddcbac12a403f73c4a66e7aa1667d3e04feb011254441f85d8d87a043dc0b5a9e47076a01'
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

区块链节点运维

这是子任务1-2-3部分。

参考:扩容一个新节点

在M1-B机器上操作

sudo su
cd /root/tools/
ls
  • 1
  • 2
  • 3

这里的gen_node_cert.sh脚本用于生成新节点的私钥证书。

配置新节点node7

要生成新的节点证书,需要明确该节点加入的机构(agency),并获取到agency的证书。这里我们设计新节点加入agencyC,且运行在M1-B上(是整个系统中的node.7,但在M1-B上是第四个节点,为美观起见,命名为node3)

$ bash gen_node_cert.sh -c ./nodes/cert/agencyC -o nodes/192.168.157.128/node3
==============================================================
[INFO] Cert Path   : ./nodes/cert/agencyC
[INFO] Output Dir  : nodes/192.168.157.128/node3
==============================================================
[INFO] All completed. Files in nodes/192.168.157.128/node3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

准备节点的启动、停止脚本,节点配置文件和群组配置文件。

# 从已有的节点中复制启动、停止脚本和节点配置文件模板
# start.sh, stop.sh各个节点都是一样的,只有config.ini需要修改
cd nodes/192.168.157.128
cp node0/config.ini node0/start.sh node0/stop.sh  node3

# 修改config.ini
cd node3
vim config.ini
### 修改的部分如下:[rpc]channel_listen_port, jsonrpc_listen_port, [p2p]listen_port需要修改。并且nodes to connect里面增加这个新节点node.7
[rpc]
    channel_listen_ip=0.0.0.0
    channel_listen_port=20233	# 改
    jsonrpc_listen_ip=127.0.0.1
    jsonrpc_listen_port=8548	# 改
[p2p]
    listen_ip=0.0.0.0
    listen_port=30333			# 改
    ; nodes to connect
    node.0=192.168.157.129:30330
    node.1=192.168.157.129:30331
    node.2=192.168.157.129:30332
    node.3=192.168.157.129:30333
    node.4=192.168.157.128:30330
    node.5=192.168.157.128:30331
    node.6=192.168.157.128:30332
    node.7=192.168.157.128:30333	# 新增

# 复制群组配置信息(这些信息对群组中所有节点都是一样的,不需要进一步修改)
# 题目要求加入群组1,所以只复制了group1的配置信息
cd ..
cp node0/conf/group.1.* node3/conf/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

启动新节点

cd nodes3
bash stop.sh
bash start.sh
 node3 start successfully
  • 1
  • 2
  • 3
  • 4

检查新节点连接状况

$ ps aux | grep fisco | grep node3 | grep -v grep
root      141735  0.7  0.2 624188 25256 pts/0    Sl   17:02   0:01 /root/tools/nodes/192.168.157.128/node3/../fisco-bcos -c config.ini
  • 1
  • 2

可见node3进程正常运行

$ tail -f /root/tools/nodes/192.168.157.128/node3/log/* | grep -i connected
info|2025-02-26 17:08:07.120373|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:08:17.121033|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:08:27.121492|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:08:37.121980|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:08:47.122439|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:08:57.122712|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:09:07.122820|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:09:17.122990|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:09:27.123264|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:09:37.123472|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 17:09:47.123667|[P2P][Service] heartBeat,connected count=7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

可见新节点和其他7个节点都成功建立连接

将新节点加入group1

查看新节点的nodeid

$ cd /root/tools/
$ cat nodes/192.168.157.128/node3/conf/node.nodeid
e2eae9689694bfe17152a2c44d2d8cbef38d99e7222f9309d5fed0b6d24387ee5c63a418260679624e5b45f6bba93fc186648ce9ac1080c972ff39d197c25665
  • 1
  • 2
  • 3

使用控制台把node3加入group1。首先配置控制台并启动

cd /root/tools/
tar -xzvf console.tar.gz
cp -r nodes/*/sdk-agency* console/conf
cd console/conf
cp sdk-agencyC/* .
cp config-example.toml config.toml
sed -i 's/peers=\["127.0.0.1:20200", "127.0.0.1:20201"\]/peers=["192.168.157.129:20230", "192.168.157.129:20231", "192.168.157.129:20232", "192.168.157.129:20233", "192.168.157.128:20230", "192.168.157.128:20231", "192.168.157.128:20232", "192.168.157.128:20233"]/g' ./config.toml	# 全部8个节点
cd ..
./start.sh 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

把新节点作为共识节点加入group1

[group:1]> getSealerList
[    1e975b1c033129f1c03d001bf36827e19c7237fac920d4da9abe427c9d70ff4e7894ff23b406a0c1d857177a15502db9616727c158bfb46da83b48983796b98b, 52e266b8f78d73028bc44e3364d00ea832ab8c7b04042a912134195d8fc58b42ccfc6c0db8bf95cd9b2644bb909ebcc07076f8f0345f0910131abb45763a4b59,    54408730a1ad30885b49b5cd823865b9b7ee7c51ebe535a4e6a9132680ef8bfb285c34cffd125e9eb5e1a9283f9ca50807c87f4929d557f1ba5ac11dd80c7012,    d9ee7c3a27d15594f59e9a4a20e125f31711804daf6559e2407c77ff6fd958f4fc853771f2a77c17a150ac53bfe352d0c6b830611691a13ab3469dd8b1c63901,    f35d930a3777fe0d6d64c48d7bfc48108db2b61a7c2938f1b8c0c69e32a8c9b9e27cc9aef748785f18d3c8534009a999239c97c0fe6fcc7bed945cad095d4fdf
]

[group:1]> addSealer e2eae9689694bfe17152a2c44d2d8cbef38d99e7222f9309d5fed0b6d24387ee5c63a418260679624e5b45f6bba93fc186648ce9ac1080c972ff39d197c25665
{
    "code":1,
    "msg":"Success"
}

[group:1]> getSealerList
[    1e975b1c033129f1c03d001bf36827e19c7237fac920d4da9abe427c9d70ff4e7894ff23b406a0c1d857177a15502db9616727c158bfb46da83b48983796b98b,    52e266b8f78d73028bc44e3364d00ea832ab8c7b04042a912134195d8fc58b42ccfc6c0db8bf95cd9b2644bb909ebcc07076f8f0345f0910131abb45763a4b59,    54408730a1ad30885b49b5cd823865b9b7ee7c51ebe535a4e6a9132680ef8bfb285c34cffd125e9eb5e1a9283f9ca50807c87f4929d557f1ba5ac11dd80c7012,    d9ee7c3a27d15594f59e9a4a20e125f31711804daf6559e2407c77ff6fd958f4fc853771f2a77c17a150ac53bfe352d0c6b830611691a13ab3469dd8b1c63901,    f35d930a3777fe0d6d64c48d7bfc48108db2b61a7c2938f1b8c0c69e32a8c9b9e27cc9aef748785f18d3c8534009a999239c97c0fe6fcc7bed945cad095d4fdf,    e2eae9689694bfe17152a2c44d2d8cbef38d99e7222f9309d5fed0b6d24387ee5c63a418260679624e5b45f6bba93fc186648ce9ac1080c972ff39d197c25665
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

可见新节点已经出现在sealer list里

查看新节点在group1中的共识状态

退出控制台。终端中运行:

tail -f /root/tools/nodes/192.168.157.128/node3/log/* | grep -i +++
info|2025-02-26 17:35:44.306183|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=2,tx=0,nodeIdx=4,hash=654daaca...
info|2025-02-26 17:35:50.344993|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=2,tx=0,nodeIdx=4,hash=d59572fd...
info|2025-02-26 17:35:56.388509|[g:1][CONSENSUS][SEALER]++++++++++++++++ Generating seal on,blkNum=2,tx=0,nodeIdx=4,hash=ba104013...
  • 1
  • 2
  • 3
  • 4

至此完成1-2-3(1)(2)

修改node3(M1-A)输出等级和日志存储阈值

vim scp://[email protected]//root/tools/nodes/192.168.157.129/node3/config.ini

[log]
    enable=true
    log_path=./log
    ; enable/disable the statistics function
    enable_statistic=false
    ; network statistics interval, unit is second, default is 60s
    stat_flush_interval=60
    ; info debug trace
    level=warning
    ; MB
    max_log_file_size=50
    flush=true
### 修改这里的level和max_log_file_size字段

# 重启节点使配置生效
ssh [email protected] "cd /root/tools/nodes/192.168.157.129/node3/ && bash stop.sh && bash start.sh"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

至此完成了子任务1-2-3

区块链网络运维

为node7设置黑名单

首先检查当前node7和其他节点的连接情况:

$ tail -f /root/tools/nodes/192.168.157.128/node3/log/* | grep -i connected
info|2025-02-26 19:37:27.952123|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 19:37:37.952512|[P2P][Service] heartBeat,connected count=7
info|2025-02-26 19:37:47.953641|[P2P][Service] heartBeat,connected count=7
  • 1
  • 2
  • 3
  • 4

可见它和其他7个节点都连接正常。现在我们在node7(M1-B node3)中把node3(M1-A)设为黑名单。

获取node3(M1-A)的nodeid

$ cat /root/tools/nodes/192.168.157.129/node3/conf/node.nodeid 
fd06a62d520fd3e214b1fca5990b71ae65a3c1801d73fda1b3a5d0f9d8711fe2aea84c13f5364ec4de141c9777f1c11067f60154431f305618c9cedd327cda71
  • 1
  • 2

修改node7(即当前M1-B上的node3)配置,把node3(M1-A中的node3)设为黑名单

$ cd /root/tools/nodes/192.168.157.128/node3
vim config.ini

[certificate_blacklist]
    ; crl.0 should be nodeid, nodeid's length is 128
    crl.0=fd06a62d520fd3e214b1fca5990b71ae65a3c1801d73fda1b3a5d0f9d8711fe2aea84c13f5364ec4de141c9777f1c11067f60154431f305618c9cedd327cda71

### 修改这个字段,把node3(M1-A)加入到黑名单
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

重启node7(M1-B node3)

bash stop.sh && bash start.sh
  • 1

通过命令行检查

$ tail -f /root/tools/nodes/192.168.157.128/node3/log/* | grep -i connected
info|2025-02-26 19:42:39.719245|[P2P][Service] heartBeat,connected count=6
info|2025-02-26 19:42:49.719813|[P2P][Service] heartBeat,connected count=6
  • 1
  • 2
  • 3

可见只有6个节点连接,已经屏蔽了node3的连接

至此完成了1-2-4(1)。接下来的1-2-4(2)(3)在M1-A机器上进行。

在M1-A机器上。

sudo su
cd /root/tools/console
vim conf/config.toml
### 修改peers部分为:
[network]
peers=["192.168.157.129:20230", "192.168.157.129:20231", "192.168.157.129:20232", "192.168.157.129:20233", "192.168.157.128:20230", "192.168.157.128:20231", "192.168.157.128:20232", "192.168.157.128:20233"]    # The peer list to connect

cp conf/sdk-agencyB/* ./conf
./start.sh 2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

修改group2的最大交易数量为3000

[group:2]> setSystemConfigByKey --help
Set a system config.
Usage: 
setSystemConfigByKey key value

* key   -- The name of system config(tx_count_limit/tx_gas_limit/rpbft_epoch_block_num/rpbft_epoch_sealer_num/consensus_timeout supported currently).
* value -- The value of system config to be set.
      -- The value of tx_count_limit from 1 to 2147483647(default 1000).
      -- the value of tx_gas_limit from 100000 to 2147483647(default 300000000).
      -- the value of  rpbft_epoch_block_num from 1 to 2147483647(default 1000).
      -- the value of  rpbft_epoch_sealer_num from 1 to 2147483647
      -- the value of  consensus_timeout (seconds)from 3 seconds to 2147482 seconds(default 3s).

[group:2]> getSystemConfigByKey tx_count_limit
1000

[group:2]> setSystemConfigByKey tx_count_limit 3000
{
    "code":1,
    "msg":"Success"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

检查group2的区块最大打包交易数量

[group:2]> getSystemConfigByKey tx_count_limit
3000
  • 1
  • 2

至此,完成任务1-2全部内容。

区块链系统测试(子任务1-3-1)

在M1-A上进行。

部署webase-node-manager平台

参考:离线部署webase服务

sudo su
cd /root/tools/webase-deploy/webase-node-mgr
mysql -u root -p
  • 1
  • 2
  • 3

遇到报错:

mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
  • 1
  • 2
  • 3

解决mysql问题

注:这里可能走了弯路,或许直接注册一个用户root并设置密码为456321就可以了。读者可以自己尝试这种方法是否可行

询问chatgpt和deepseek,解决办法如下:

# 在一个终端中(T1)
# 停止MySQL服务
sudo systemctl stop mysql
# 以安全模式启动 MySQL(权限验证,允许您无密码登录)
sudo mysqld_safe --skip-grant-tables &
# 如果报错如下:
[1] 5827
root@admin:~/tools# 2025-02-26T15:01:30.517807Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2025-02-26T15:01:30.518645Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.
# 则说明没有/var/run/mysqld,手动创建一下:
mkdir /var/run/mysqld
chown mysql:mysql /var/run/mysqld/
# 然后再启动
sudo mysqld_safe --skip-grant-tables &
# 应该可以正确启动了

# 在另一个终端中(T2)
mysql -u root
# 进入了mysql中
mysql> USE mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> DROP USER 'root'@'localhost';
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY '456321';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

这样,我们就创建了root@localhost用户,并设置密码为456321。现在可以退出安全模式用root@localhost登录了

在T1中回车,退出安全模式。

另外,要增加端口以支持tcp,具体如下:

vim /etc/mysql/mysql.conf.d/mysqld.cnf

# 修改这里,port=3306
[mysqld]
port            = 3306


systemctl restart mysql

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

检查端口是否配置成功

mysql -u root -p
Enter password: 
Welcome to the MySQL monitor...

mysql> SHOW GLOBAL VARIABLES LIKE 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.00 sec)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

可见配置好了3306端口

解决完mysql问题,现在回到webase-node-mgr

mysql -u root -p
Enter password: 
Welcome to the MySQL monitor...

mysql> create database nodemgr;
Query OK, 1 row affected (0.01 sec)

mysql> exit
Bye
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

修改webase.sh配置文件

sudo su
cd /root/tools/webase-deploy/webase-node-mgr/script
vim webase.sh

# 修改这一部分
#dbUser
DBUSER="root"
#dbPass
PASSWD="456321"
#dbName
DBNAME="nodemgr"

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

执行脚本

$ bash webase.sh 127.0.0.1 3306

 init start....
mysql: [Warning] Using a password on the command line interface can be insecure.
init success... 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

修改application.yml配置文件

cd ..
vim conf/application.yml

# 修改数据库连接部分的配置(IP,端口,数据库名,用户名,密码),另外修改isUseSecurity部分为false,这样默认用admin用户登录,之后就不需要每次使用webase-node-mgr服务都登录了
# database connection configuration
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/nodemgr?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
    username: "root"
    password: "456321"
    initialSize: 10
    minIdle: 5
    maxActive: 30

#constants
constant:
  ###http request
  # login's authorization whether enable, if false, default login as `admin` account
  isUseSecurity: false

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

启动webase-node-manager服务

cd /root/tools/webase-deploy/webase-node-mgr
bash start.sh 
===============================================================================================
Server com.webank.webase.node.mgr.Application Port 5001 ...PID(17296) [Starting]. Please message check through the log file (default path:./log/).
===============================================================================================

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

检查节点管理是否正常启动

bash status.sh 
===============================================================================================
Server com.webank.webase.node.mgr.Application Port 5001 is running PID(17296)
===============================================================================================

  • 1
  • 2
  • 3
  • 4
  • 5

节点管理服务的API接口(创建front对象)测试

这里没搞懂什么意思。所以问deepseek,后面的操作在他指导下完成的。

因为webase-node-mgr没有前端,所以我们在浏览器中打开http://localhost:5001是会看到404的。我们使用curl命令来和webase-node-mgr服务交互

先测试一下服务是否通畅

# 应该返回节点信息(我们还没有节点接入到webase-node-mgr服务中,所以现在什么信息都没有)
$ curl http://localhost:5001/WeBASE-Node-Manager/front/find
{"code":0,"message":"success","data":[],"totalCount":0} 

# 另外检查服务的log,看到没有报错信息,据此判断服务运行正常
# 注:这里现在报not found any group是正常的,因为我们的节点还没注册到服务中
$ tail -f log/WeBASE-Node-Manager.log
2025-02-27 15:55:56.149 [node-mgr-task-12] WARN  TransMonitorTask() - monitor jump over, not found any group
2025-02-27 15:55:56.345 [node-mgr-task-29] INFO  NodeStatusMonitorTask() - start checkAllNodeStatusForAlert startTime:1740642956345
2025-02-27 15:55:56.347 [node-mgr-task-29] WARN  NodeStatusMonitorTask() - checkNodeStatusForAlert jump over: not found any group
2025-02-27 15:55:56.349 [node-mgr-task-19] WARN  PullBlockTransTask() - pullBlock jump over: not found any group
2025-02-27 15:56:00.001 [node-mgr-task-28] WARN  DeleteInfoTask() - DeleteInfoTask jump over, not found any group
2025-02-27 15:56:00.002 [node-mgr-task-11] WARN  StatisticsTransdailyTask() - updateTransdailyData jump over: no group information exists

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

启动webase-front服务

创建front对象要求webase-front服务已经启动,因此我们还要先启动webase-front服务才行。

sudo su
cd /root/tools/webase-deploy/webase-front
cp -r ../../nodes/*/sdk-agency* ./conf
# 先用agencyA的节点node0搞一下
cp ./conf/sdk-agencyA/* ./conf
vim conf/application.yml

# 修改sdk里的ip和channelPort;constant里的nodePath和monitorDisk
sdk:
  corePoolSize: 50
  maxPoolSize: 100
  queueCapacity: 100
  ip: 192.168.157.129
  channelPort: 20230
  certPath: conf  # cert path of relative or absolute

constant:
  keyServer: 127.0.0.1:5004 # webase-sign服务的IP:Port(单个)
  nodePath: /root/tools/webase-deploy/nodes/192.168.157.129/node0  # node's absolute path to read configuration and monitor node's log
  aesKey: EfdsW23D23d3df43
  transMaxWait: 30
  monitorDisk: /root/tools/webase-deploy/nodes/192.168.158.129

# 启动
bash start.sh 
===============================================================================================
Server com.webank.webase.front.Application Port 5002 ...PID(14866) [Starting]. Please check message through the log file (default path:./log/).
===============================================================================================
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

创建front对象

我们这里用agencyA的node0来创建

$ curl -X POST "http://localhost:5001/WeBASE-Node-Manager/front/new" -H "Content-Type: application/json" -d '{
>   "groupId": 1,
>   "nodeId": "node0",
>   "nodeIp": "192.168.157.129",
>   "nodePort": 20230,
>   "frontIp": "127.0.0.1",
>   "frontPort": "5002",
>   "agency": "agencyA",
>   "frontPeerName": "frontPeer-M1-A-node0",
>   "description": "This is a front peer for node0 on M1-A"
> }'

{"code":0,"message":"success","data":{"frontId":1,"nodeId":"52e266b8f78d73028bc44e3364d00ea832ab8c7b04042a912134195d8fc58b42ccfc6c0db8bf95cd9b2644bb909ebcc07076f8f0345f0910131abb45763a4b59","frontIp":"127.0.0.1","frontPort":5002,"agency":"agencyA","groupList":null,"clientVersion":"2.8.0","supportVersion":"2.8.0","frontVersion":null,"signVersion":null,"createTime":null,"modifyTime":null,"status":1,"runType":0,"agencyId":null,"agencyName":null,"hostId":null,"hostIndex":null,"imageTag":null,"containerName":null,"jsonrpcPort":null,"p2pPort":null,"channelPort":null,"chainId":0,"chainName":"default"},"attachment":null}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注意这里必须已经启动好前端(webase-front)服务,否则它会报错{"code":202051,"message":"wrong host ip or wrong port: connect failed","data":null,"attachment":null}

看到上述命令的结果是"message":"success",说明front启动成功。

压力测试(子任务1-3-2)

这部分在虚拟机中没有找到任何benchmarks, Caliper, fisco-bcos.json相关的文件(如下所示),因此没做(偷懒了哈哈哈哈)

root@admin:~# cd /root
root@admin:~# ls
Desktop  project  snap  tools
root@admin:~# find . -name benchmarks
root@admin:~# find . -name benchmark
root@admin:~# find . -name Caliper
root@admin:~# find . -name caliper
root@admin:~# find . -name fisco-bcos.json
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

补充

网上找到了Caliper安装和使用的教程。如果比赛环境中机器可以连接外网,那么还是可以做的。请感兴趣的读者自行参考。


  1. 或者其他什么平台,根据样题不同而不同。但区块链操作的部分(即本文内容部分)是一样的 ↩︎

注:本文转载自blog.csdn.net的Rivergod_的文章"https://blog.csdn.net/m0_46413442/article/details/145911889"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

136
区块链
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top