模块一:区块链产品方案设计及系统运维(35分)
1-1*提醒:使用VISIO或者其它设计工具完成产品方案设计
1.依据给定区块链食品溯源系统的业务架构图,对考题进行业务分析,尽可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和处理流程,要求分为区块链食品溯源业务平台和支撑平台两个部分;
2.据描述,设计区块链系统的总体功能概览图
根据系统整体功能描述,系统中需要包括用户以及对应溯源订单相关的销售、收购、运输、收购以及生产流程。其中用户需要进行权限划分,不同权限的用户针对系统的操作将受限。例如具有生产商角色的用户只能进行生产订单的创建。同时系统需要具备查询功能,所有系统数据在进行脱敏后都可被所有用户查询。
使用本机自带的VISIO(或其它设计类)工具。
- 整合上述设计内容,完善“系统概要设计说明书.doc”,具体工作内容如下:
将设计内容根据说明书中模块需求进行补充,并完善概要设计说明书中的“需求概要”。
完善说明书中接口说明部分内容。
第一部分:将设计内容根据说明书中模块需求进行补充,并完善概要设计说明书中的“需求概要”。
2.3基本设计概念和处理流程
本系统软件部分可划分为浏览器页面、服务器端。用户通过浏览器访问相关页面,输入业务请求,发送到服务器端,调用业务系统接口处理后,把业务处理应答发送给客户端用户。
系统框架图如下:
参考答案:
2.3.1 登录业务功能模块
参考答案:
2.3.2 食品订单溯源功能模块
参考答案:
2.4结构
2.4.1 总体框图
根据系统整体功能描述,系统中需要包括用户以及对应溯源订单相关的销售、收购、运输、收购以及生产流程。其中用户需要进行权限划分,不同权限的用户针对系统的操作将受限。例如具有生产商角色的用户只能进行生产订单的创建。同时系统需要具备查询功能,所有系统数据在进行脱敏后都可被所有用户查询。
第二部分:完善说明书中接口说明部分内容。
在系统概要设计说明中完善接口
2.4.2.1 用户信息查询
1.功能描述
标识符 userInfo
功能 通过指定用户地址获取详细信息
- 接口功能
2.4.2.2 生产订单创建
-
功能描述
标识符 produce
功能 生产商创建食品溯源中生产订单相关信息 -
接口功能
2.4.2.3 分销订单创建
-
功能描述
标识符 ditribute
功能 分销商创建食品溯源中分销订单相关信息 -
接口功能
2.4.2.4 销售订单创建
-
功能描述
标识符 retail
功能 分销商创建食品溯源中分销订单相关信息。 -
接口功能
2.4.2.5 食品信息追溯查询
-
功能描述
标识符 trace
功能 通过指定订单号追溯食品信息 -
接口功能
1-2操作手册
围绕食品安全溯源区块链平台部署与运维需求,进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护。
- 根据参数与端口设置要求,部署区块链系统并验证;
- 根据参数与端口设置要求,部署区块链网络管理平台并验证;
- 基于区块链系统相关管理平台,按照任务指南实施系统运维工作并验证。
- 基于区块链系统相关监管工具,按照任务指南对区块链系统进行监管。
子任务1-2-1: 搭建区块链系统并验证
基于给定服务器环境以及软件(地址“/root/tools”),搭建一条4节点的区块链系统并验证,具体工作内容如下:
1-2-1.* 采用默认配置搭建区块链网络;
(1)配置网络(安装包在/root/tools/目录)
提示:如果已经搭建完成(即有nodes目录),删除rm -rf nodes,继续搭建。
命令: bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -e ./fisco-bcos -v 2.8.0
输出结果:
(2)启动网络节点(搭建完成会生成nodes目录)
命令: bash nodes/127.0.0.1/start_all.sh
输出:
1-2-1.* 通过命令验证区块链节点进程运行状况
检查进程
命令: ps -ef | grep -v grep | grep fisco-bcos
输出:
1-2-3. 通过命令验证区块链连接状态和共识状态日志输出
查看共识状态
命令: tail -f nodes/127.0.0.1/node0/log/log* | grep connected
提示“注意所处目录”
输出:
命令:tail -f nodes/127.0.0.1/node0/log/log* | grep +++++
1-2-2:搭建区块链系统管理平台并验证
基于给定服务器环境以及软件(地址“/root/tools”),搭建区块链控制台并开展相关运维工作,具体工作内容如下:
1.配置可视化平台,管理相关证书并启动。
安装console,解压console.tar.gz文件的命令:tar -zxvf console.tar.gz
(1)配置控制台证书。
命令:cp -n console/conf/config-example.toml console/conf/
命令:cp -r nodes/127.0.0.1/sdk/* console/conf/
操作截图:
(2)启动控制台
命令: cd console && bash start.sh
输出结果:
2.使用控制台部署HelloWorld智能合约。
部署合约
命令: deploy HelloWorld
此处需记录合约地址。
3.使用控制台完成HelloWorld智能合约的set与get操作
(1)调用set方法的操作(注意合约地址要用上一步部署的合约地址)
命令:
call HelloWorld 0x26255782cf37d290a00efaa4ca1201b1ff9be081 set “Hello,BlockChain”
此处合约地址需与上一步骤相同。
(2)调用get操作
命令:
call HelloWorld 0x76100ae3144953271ef0c4ef0933ef00f70cd137 get
- 使用控制台查看区块链中区块高度。
命令:getBlockNumber
1-2-3:区块链节点运维
基于已完成的区块链系统与管理平台搭建工作,开展区块链节点的加入与退出运维工作,具体内容如下:
- 获取区块链节点输出等级为警告级,并设置日志存储阈值为100MB并验证。
(1)修改配置文件: cd /tools/127.0.0.1/ && vim node0/config.ini
(2)重新启动节点node0,使配置文件生效。
命令:bash node0/stop.sh && node0/start.sh
- 通过给定工具(地址/root/tools)完成新节点(node4)配置
生成新节点
注意:如果查询不到连接状态,修改node4的配置文件中的日志级别为info。
(1)使用gen_node_cert.sh生成新节点node4
命令:cd /root/tools/ && bash gen_node_cert.sh -c nodes/cert/agency -o node4
(2)将新节点node4复制到节点群nodes目录下。
命令:cp -r ./node4/ nodes/127.0.0.1/
(3)将新节点node4复制到节点群nodes目录下。
命令:cd nodes/127.0.0.1/ && cp node0/config.ini node0/start.sh node0/stop.sh node4/
(4)修改node4/config.ini
对于[rpc]模块,修改channel_listen_port和jsonrpc_listen_port;
对于[p2p]模块,修改listen_port并在node.中增加自身节点信息;
命令:vi node4/config.ini
(5)复制群组配置信息
命令:cp node1/conf/group.1.genesis node4/conf/ && cp node1/conf/group.1.ini node4/conf/
3.启动新节点加入区块链系统并验证
(1)启动新节点
命令: cd node4 && bash stop.sh && bash start.sh
(2)检查新节点连接情况
1-2-4:区块链网络运维
根据任务描述要求,完成网络配置与管理运维操作,具体内容如下:
- 设置区块链系统黑名单,将node3设为黑名单禁止连接,并验证
设置黑名单
(1)查看node0节点的连接状态日志(现有4个节点连接)
注意:如果查询不到连接状态,修改node0的配置文件中的日志级别为info。
命令:tail -f node0/log/log* | grep connected
(2)编辑节点node0的config.ini文件,将node3设为黑名单禁止连接
命令:vi node0/config.ini
编辑certificate_blacklist,设置node3节点ID为黑名单。
查看node3的节点ID(cat nodes/127.0.0.1/node3/conf/node.nodeid)
注意:crl.0的注释;要删除(即把前置的分号删除)
(3)重新启动节点
命令:bash node0/stop.sh && node0/start.sh
(4)查看node0节点的连接状态日志(现有3个节点连接)
命令:tail -f node0/log/log* | grep connected
(5)重复操作(1)-(4)完成node1节点配置和验证
(6)重复操作(1)-(4)完成node2节点配置和验证
(7)重复操作(1)-(4)完成node4节点配置和验证
- 设置系统中区块打包最大交易数量设为2000。
配置交易限制
(1)启动控制台:命令:bash start.sh
(2)设置区块打包最大交易数量为2000
命令: setSystemConfigByKey tx_count_limit 2000
- 验证区块最大打包交易数量情况。
检查区块最大打包交易数量设置生效
命令:getSystemConfigByKey tx_count_limit
1-3操作手册
- 设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约中进行系统测试、性能测试等;根据业务需求,分析并且修复给定智能合约中的安全漏洞。利用模拟业务和测试工具来完成对区块链系统服务数据的测试。
题型:此处账户信息已经从webase导入到webase-front,已经验证一致(可不操作)。
(1)使用命令启动区块链系统可视化一体平台并验证启动情况(工具在/root/tools/webase-deploy)
提示:登录账号+密码(admin+ZGxt1234)
命令: python3 deploy.py startAll
实现基于浏览器测试启动情况验证(访问地址http://{服务端IP}:5000)
(2). 通过可视化平台生成包括生产商(Producer)、经销商(distributor)、零售商(retailer)账户,并将账户以p12加密形式导出后倒入指定前置可视化平台,验证地址一致性。
A.验证producer地址一致
以下为webase-front(访问地址:IP:5002/WeBASE-Front)
B.验证distributor地址一致
C.验证retailer地址一致
- 使用Postman对上述功能接口进行验证,并将验证结果截图提交工程文档。
需要将完整的合约部署到fisco上以及启动后端的工程项目。(工程目录为/root/project)
在/root/tools/目录下启动webase:
命令:python3 deploy.py startAll
通过127.0.0.1:5002/WeBASE-Front启动webase-front。
在/root/peoject/目录下启动项目,检查配置文件conf.properties中的合约和用户信息是否与webase-front一致。
运行trace的jar包项目,如下图:
如果地址已经被占用,使用pkill -9 nginx
对食品溯源系统服务端“添加食品”(/produce)功能接口进行验证,并将验证结果截图提交工程文档。
使用Postman正确调用情况如下作为参考:(此处的信息可根据情况调整填写)
traceNumber:10,
foodName:”Orange”,
traceName:”test”,
quality:2
3.* 参照工程项目(地址:“/opt/benchmarks”)使用Caliper测试工具对食品安全溯源系统智能合约生成新食品(newFood)功能进行压力测试。具体要求如下:
提醒:
在/root/tools/ webase-deploy目录下启动webase:
命令:python3 deploy.py startAll
vim /opt/benchmark/caliper-benchmark/networks/fisco-bcos/fisco-bcos.json
命令便捷查看网络配置是否是下图所示一致,一致即执行,不一致即修改为如下配置:
在/opt/benchmarks目录下执行命令:
npx caliper benchmark run --caliper-workspace caliper-benchmarks --caliper-benchconfig benchmarks/samples/fisco-bcos/trace/config.yaml --caliper-networkconfig networks/fisco-bcos/test-nw/fisco-bcos.json
运行结果:
浏览器输入 /opt/benchmarks/caliper-benchmarks/report.html 打开报告文件
4.* 智能合约安全漏洞测试。
打开Ganache。运行测试
VScode 打开合约漏洞工程 /home/zgxt/security/ReEntrancy 如下:
有如下问题智能合约:
pragma solidity >=0.8.3;
contract EtherStore {
mapping(address => uint) public balances;
function deposit() public payable {
balances[msg.sender] += msg.value;
emit Balance(balances[msg.sender]);
}
function withdraw() public {
uint bal = balances[msg.sender];
require(bal > 0);
(bool sent, ) = msg.sender.call{value: bal}("");
require(sent, "Failed to send Ether");
balances[msg.sender] = 0;
}
// Helper function to check the balance of this contract
function getBalance() public view returns (uint) {
return address(this).balance;
}
}
contract Attack {
EtherStore public etherStore;
constructor(address _etherStoreAddress) {
etherStore = EtherStore(_etherStoreAddress);
}
// Fallback is called when EtherStore sends Ether to this contract.
fallback() external payable {
if (address(etherStore).balance >= 1) {
etherStore.withdraw();
}
}
function attack() external payable {
require(msg.value >= 1);
etherStore.deposit{value: 1}();
etherStore.withdraw();
}
// Helper function to check the balance of this contract
function getBalance() public view returns (uint) {
return address(this).balance;
}
}
分析智能合约中存在问题,并说明危害。
漏洞说明
此智能合约存在“重入”即“Re-Entrance”问题,由于调用智能合约的转账操作需要通过打包后才会生效,可能出现重复提现从而使得其他合约账户被盗的问题。
根据truffle工具中的代码文件,编写测试用例,复现智能合约中存在的漏洞。
提醒:核心代码编辑已经完成,在对应项目目录下直接执行truffle test test/…js即可。
在/home/zgxt/security/ReEntrancy/migrations文件夹中的3_initial_ReEntrancy.js文件加入代码部署的执行代码:
/home/zgxt/security/ReEntrancy/test/ReEntrancy.js具体测试用例代码如下:
命令:truffle test test/ReEntrancy.js
当有如下执行返回说明复现成功:
创建新的智能合约,修复其中问题,说明修复内容并测试。
如下为具体修改内容,主要修复点为withdraw()的体现方法,具体操作为先将账户清零,再转账
使用同样的测试用例进行操作,如下为测试用例:
命令:truffle test test/ReEntrancyRepair.js
运行结果: