资源简介 013[项目名称]——概要设计说明书新能源溯源系统概要设计说明书[V1.0(版本号)]拟 制 人______________________审 核 人______________________批 准 人______________________概要设计说明书1.引言1.1编写目的本概要说明书按照《需求规格说明书》的功能需求,设计本系统的软件结构,供后续软件过程(详细设计等)做依据,预期读者为后续软件过程的设计、开发人员。2. 总体设计//这里补充2.1需求规定按照新能源系统的需求规定,用户可以通过本系统实现能源管理与交易、新能源资产管理与交易、用户管理等功能。2.1.2输入输出要求参照需求文档的说明2.2运行环境本系统必须运行在局域网或互联网中2.2.1硬件设备Web服务器:数量1台配置:IBM x365, 2x Xeon MP 2.0GHz/400MHz, 1MB, 2GB, 6*73.4 GB 10K-rpm,RAID-5,, Rack数据库服务器:数量1台配置:IBM x365, 2x Xeon MP 2.0GHz/400MHz, 1MB, 2GB, 6*73.4 GB 10K-rpm,RAID-5,, Rack客户端PC机:数量若干台,按需要增加配置:联想 开天M4600 P4 2.6G(HT)/512M DDR/80G(7200转)/1.44M/DVD/声卡/集成百兆网卡/MX400 64MB DDR/光电鼠标/Windows XP Professional(17”液晶)2.2.2支持软件客户端:jre1.5.0, winxp服务器端:jdk1.4.3, tomcat5.0, winxp,struts1.1后台数据库:SQLserver, winxp2.3基本设计概念和处理流程本系统软件部分可划分为浏览器页面、服务器端。用户通过浏览器访问相关页面,输入业务请求,发送到服务器端,调用业务系统接口处理后,把业务处理应答发送给客户端用户。系统框架图如下:2.4结构2.4.1 总体框图//这里补充2.4.2 功能模块接口及说明由于在后续设计中,对各功能模块的每个子功能都要详细的加以描述,因此恰当的标识符将有助于文档的阅读和代码的编写。命名规则:1. 数据库表名命名规则由前缀和实际名字组成。前缀:使用小写字母tb,表示表。实际名字采用其英文缩写,且首字母要大写。2. 数据库表中字段命名规则根据其中文名称直接翻译成英文,其首字母要大写;若为多个词的组合,则每个词的首字母都要大写。3. 模块标识符命名规则应本着便于理解和尽量简洁的原则来命名标识符。在本系统中,各模块均以每个词英文的前几个字母来命名,模块下的子功能也以其英文简写来命名,且每个词首字母均为大写。4.程序中变量命名规则每个变量都要以其所在的模块的为前缀,该前缀可以是该模块标识符中大写字母的组合,前缀后面加下划线“_”。后面的字母小写,并且不能包含JAVA的关键字,如果变量是两个单词组成,第二个单词的首字母要大写。5.程序中函数命名规则每个函数名都要以其所在的模块的为前缀,该前缀可以是该模块标识符中大写字母的组合,前缀后面加下划线“_”。首字母小写,多个单词的函数名,从第二个单词开始单词首字母大写。2.4.2.1 用户信息查询1.功能描述标识符 userInfo功能 通过指定用户地址获取获取详细信息2. 接口功能请求路由 /userInfo请求方法 POST请求参数参数名 类型 说明响应参数参数名 类型 说明2.4.2.2创建资产1. 功能描述标识符 SPU_insert功能 新增资产2. 接口功能请求路由 /SPU_insert请求方法 POST请求参数参数名 类型 说明响应参数参数名 类型 说明2.4.2.3 资产交易1. 功能描述标识符 SPU_transfer功能 新增资产2. 接口功能请求路由 distribute请求方法 POST请求参数参数名 类型 说明响应参数参数名 类型 说明3.系统出错处理设计3.1出错信息服务器端可能有Java的异常产生,可用Java中的异常处理方法try…catch处理 ,并记录日志,以备事后分析查找原因。3.2补救措施采用双服务器热备份的方法,一旦服务器崩溃,立即切换到另一台服务器运行。3.3系统维护设计保留本系统的一系列文档,加适当注释,以备维护者维护。每次修改/维护,都做记录。2023年全国职业院校技能大赛高职组“区块链技术应用”赛项赛卷(3卷)任务书参赛队编号:背景描述新能源作为新兴领域,产业呈现碎片化与复杂化的特性,逐渐出现管理困难、供应链金融、可信监管与数据安全等一系列产业发展的阻碍。为了实现高质量发展和能源消纳利用,新能源产业发展需要与产业数字化趋势相融合。作为数字经济时代的前沿产物,区块链以其分布式存储、不可伪造和防篡改、透明可信、高可靠性和可追溯等优势,为破解能源业存在的问题和创新发展模式提供了新的机遇,满足了新能源和分布式能源数字化的需求。区块链与太阳能的融合,可以让新能源治理变得更加高效,让能源流转到更加需要的地方,尤其在能源交易过程中实现原子化交易,太阳能管理系统中除了资产与能源外,还包括了不同主体的管理,资产与太阳能源需要和用户进行深度绑定。总之,基于区块链的太阳能管理系统可以有效提升能源利用效率,同时也可以有效降低能源浪费的现象。模块一:区块链产品方案设计及系统运维(35分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块一提交结果.docx】中对应的任务序号下。任务1-1:区块链产品需求分析与方案设计(10分)本环节需要依据项目背景完成需求分析与方案设计,具体要求如下:根据题干描述使用Visio或是思维导图工具展现本系统的系统架构图,最好分为业务平台和支撑平台两个部分。(2分)根据题干中描述内容,设计总体功能结构图(4分)根据题干中描述内容,完善“系统概要设计说明书.doc”具体工作内容如下:将设计内容根据说明书模块需求进行补充,并完善概要设计说明书中的“需求概要”(2分)完善说明书中接口说明部分内容(2分)任务1-2:区块链系统部署与运维(15分)围绕新能源管理区块链平台部署与运维需求,进行项目相关系统、节点以及管理工具的部署工作。通过通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护,具体要求如下:根据参数与端口设置要求,部署区块链系统并验证;根据参数与端口设置要求,部署区块链网络管理平台并验证;基于区块链系统相关管理平台,按照任务指南实施系统运维工作并验证。基于区块链系统相关监管工具,按照任务指南对区块链系统进行监管。子任务1-2-1: 搭建区块链系统并验证(3分)参照ipconf文件搭建区块链系统,要求在系统中包括3个独立组织以及6个节点,网络拓扑为星型网络,并且在联盟链中需实现2个数据隔离场景(group1、group2),节点可根据具体业务加入不同的业务场景。具体工作内容如下:使用给定工具(地址“/root/tools”),配置区块链系统。(1分)启动区块链系统全部节点并验证启动情况。(1分)检查节点的连接状态以及所属场景的共识状态。(1分)子任务1-2-2:搭建区块链系统管理平台并验证(4分)基于给定服务器环境、软件以及工具(地址“/root/tools”),构建区块链系统相关控制台,并通过控制台实现相关系统管理,具体工作内容如下:使用给定工具,配置控制台证书。(1分)使用给定工具,以pem加密方式创建3个区块链账户(Account1、Account2、Account3)。(1分)使用给定工具,通过Account1登录控制台,并查看区块高度。(1分)使用给定工具,通过Account2登录控制台,并查看共识状态。(1分)子任务1-2-3:区块链节点运维(4分)基于已完成的区块链系统与管理平台搭建工作,开展区块链节点的加入与退出运维工作,具体内容如下:获取node3的节点ID(1分)启动控制台,在group1中移除node3节点(2分)检查node3节点共识状态日志(1分)子任务1-2-4:区块链网络运维(4分)基于已完成的区块链系统与管理平台搭建工作,开展相关节点运维工作,具体内容如下:生成新节点(node4),启动并检查(1分)修改新节点配置,并查看节点的nodeid(1分)将新节点作为观察节点加入group1当中,并检查是否加入成功(1分)将区块打包最大交易数量设为2000笔。(1分)任务1-3:区块链系统测试(10分)设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约中进行系统测试、性能测试等;根据业务需求,分析并且修复给定智能合约中的安全漏洞。利用模拟业务和测试工具来完成对区块链系统服务数据的测试。使用命令启动区块链系统可视化一体平台并验证启动情况(1分)使用可视化一体平台,创建user3用户,部署新能源管理合约,调用合约注册功能(account_register),将user3进行注册为“用户”并获取正确返回。(1分)使用可视化一体平台,调用新能源管理合约judgeUserRole功能,验证注册情况。(1分)参照工程项目(地址:“/root/projects”)使用Caliper测试工具对新能源管理系统智能合约太阳能板能源信息新增(Energy_insert)功能进行压力测试。具体要求如下:提供核心测试代码。(2分)设置txNumber=10,tps=1,所有测试通过率为100%(1分)智能合约安全漏洞测试。(4分)有如下问题智能合约:pragma solidity ^0.8.3;contract EtherGame {uint public targetAmount = 7 ether;address public winner;function deposit() public payable {require(msg.value == 1 ether, "You can only send 1 Ether");uint balance = address(this).balance;require(balance <= targetAmount, "Game is over");if (balance == targetAmount) {winner = msg.sender;}}function claimReward() public {require(msg.sender == winner, "Not winner");(bool sent, ) = msg.sender.call{value: address(this).balance}("");require(sent, "Failed to send Ether");}}contract Attack {EtherGame etherGame;constructor(EtherGame _etherGame) {etherGame = EtherGame(_etherGame);}function attack() public payable {address payable addr = payable(address(etherGame));selfdestruct(addr);}}分析智能合约中存在问题,并说明危害。(1分)根据truffle工具中的代码文件,编写测试用例,复现智能合约中存在的漏洞。(1分)创建新的智能合约,修复其中问题,说明修复内容并测试。(2分)模块二:智能合约开发与测试(30分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块二提交结果.docx】中对应的任务序号下。任务2-1:智能合约设计(5分)子任务2-1-1 编写新能源智能合约功能需求文档(2分)根据区块链新能源管理项目背景和需求分析,编写该区块链新能源管理的智能合约功能需求文档。子任务2-1-2 完成区块链新能源管理智能合约的设计(3分)1. 设计区块链新能源管理智能合约接口,画出区块链新能源管理智能合约的角色UML用例图。(1分)2. 以图文结合的方式描述智能合约各参与实体间的关系。(2分)任务2-2:智能合约开发(20分)使用Solidity语言完成智能合约开发、部署和调用,要求如下:子任务2-2-1:太阳能板管理接口编码(8分)1. 根据文档要求,编写太阳能板新增接口功能,必须将新增太阳能板数据存入指定表中,在存储完成后需触发后事件并返回存储与否的标识。(4分)2. 根据文档要求,编写太阳能板修改接口,必须通过指定表修改完成数据更新,在完成更新后需触发事件并返回更新与否的标识。(4分)子任务2-2-2:能源管理接口编码(8分)1. 根据文档要求,编写能源新增接口功能,必须将新增能源数据存入指定表中,在存储完成后需触发后事件并返回存储与否的标识。(4分)2. 根据文档要求,编写能源修改接口,必须通过指定表修改完成数据更新,在完成更新后需触发事件并返回更新与否的标识。(4分)子任务2-2-3:合约部署和调用(4分)1. 解决代码错误和警告,正确编译并部署合约,成功获取部署的合约地址和abi。(1分)2. 调用太阳能板查询合约接口,完整验证业务流程。(1.5分)3. 调用能源查询合约接口,完整验证业务流程。(1.5分)任务2-3:智能合约测试(5分)根据已完成的智能合约,针对开发功能开展相关合约测试工作,具体工作内容如下:1. 调用太阳能板查询合约接口,完整验证业务流程。(3分)2. 调用能源查询合约接口,完整验证业务流程。(2分)模块三:区块链应用系统开发(30分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块三提交结果.docx】中对应的任务序号下。任务3-1:区块链应用前端功能开发(10分)1.请基于前端系统的开发模板,在注册组件Register.vue、中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下(2分):本任务的具体要求如下:需要填写的项有地址、角色、密码地址项输入框默认内容为“请输入0x开头的用户地址”,若不满足则报错角色使用单选按钮组件,可选项为“用户”和“电力公司”密码项需验证长度大于6位,输入框默认内容为“请输入6位以上的密码”页面需要有“返回”按钮,可以返回登录页面注册成功后返回登录页面Login.js:代码片段1:注册页面选手填写部分show-password/>注册返回代码片段2:goback: function () {选手填写部分},代码片段3:register: function() {// 表单信息检查选手填写部分 this.axios.post('/account/register', this.registerdata).then((response) => {if (response.data.code == 选手填写部分) {alert(选手填写部分)this.$router.push('/login')}else {alert(`选手填写部分, ${response.data.data}`)}})},2.请基于前端系统的开发模板,在登录组件Login.vue文件中添加对应的登录逻辑代码,实现对后端系统的登录功能,并测试功能完整性(1.5分):本任务的具体要求如下:需要填写的项有地址、密码,且密码以密文形式展现地址填写栏默认内容为“请输入0x开头的用户地址”页面需要有“注册”按钮,可以跳转注册页面点击“登录”按钮时需要验证,地址栏内容需以”0x”开头,密码需大于6位对登录密码进行简单加密,传输内容为原内容后增加字符串“pd”登录成功后进入首页参考界面如下:代码片段1:电力能源交易系统登录登录注册代码片段2:loginfun() {// 表单信息检查选手填写部分console.log(this.logindata.password )this.axios.post('/account/login', this.logindata).then((response) => {if (response.data.code == 选手填写部分) {this.$cookies.set("useraddress", response.data.data)console.log(this.$cookies.get('useraddress'))// this.uaddress = response.data.data选手填写部分 }})},代码片段3:register: function () {选手填写部分}3.请基于前端系统的开发模板,编写个人产权组件MyAsset.vue文件,实现对个人能源的管理功能,并测试功能完整性(2分)本任务具体要求如下:界面有明确的资产相关提示语界面需要展现当前用户设备列表,无设备时要给出提示对于每个列出的设备在操作栏增加“出售”按钮,可添加出售订单,点击后应有弹出框提示用户填写相关信息(设备编号、所属权、价格)用于出售,该弹出框有“确认”按钮,点击该按钮有结果提示代码片段1:新增设备出售代码片段2:离开确认代码片段3:saller() {this.axios.post(选手填写部分, this.createOrderPrice).then((res) => {if (res.data.code == 选手填写部分){alert('添加成功')this.dialogFormVisible2 = 选手填写部分this.listinfo()}else('添加失败')})}},代码片段4:goBack() {this.$router.push('/')},// 新增add() {选手填写部分},handleClick() {选手填写部分},getAssert(){let _Address = 选手填写部分this.axios.get(`/get_Address_Assert _Address=${_Address}`).then((res) => {if (res.data.code == 200){选手填写部分}else{alert(`失败,$(res.data.data)`)}})},4.请基于前端系统的开发模板,编写产权市场组件Market.vue文件,实现产权的查询和交易功能,并测试功能完整性(2.5分)本任务具体要求如下:界面有明确的产权市场相关提示语界面有输入框,提示用户输入产权型号,有搜索按钮可供搜索搜索结果展示页面展示该产权的具体信息,包括型号、卖方、额定功率、实际功率、投入时间、所在位置,有“购买”按钮可进行购买操作点击“购买按钮”,提示用户输入设备编号、所属权、当前账号,该弹出框有“确认”按钮,点击该按钮有结果提示参考界面如下:代码片段1:代码片段2:代码片段3:v-for="item2 in imgs":key="item2":src="item2.img"class="image"/>总价:选手填写部分选手填写部分{{ currentDate }}详细信息购买选手填写部分选手填写部分选手填写部分选手填写部分 选手填写部分选手填写部分代码片段4:离开确认代码片段5:transfer() {this.axios.post(`/SSPU_transfer`, this.owner).then((res) => {if (res.data.code == 200){alert(选手填写部分)this.transferorder = false}else{alert(选手填写部分)}})},代码片段6:getData() {let _numid = this.searchsthis.axios.get(`/get_numid_Spu _numid=${_numid}`).then((res) => {console.log(res.data.data)if(res.data.code == 200 ){选手填写部分console.log(res.data.data)}else{alert(`失败,$(res.data.data)`)}})}},5.请基于前端系统的开发模板,编写管理员的区块链浏览器组件Browser.vue文件,实现底层合约的管理,并测试功能完整性(2分)本任务具体要求如下:界面有明确的区块链浏览器相关提示语展示页面展示合约名称、合约地址、部署时间、创建时间、修改时间后端代码完成后截图参考界面如下:代码片段1::data="contracts"style="width: 100%">prop="合约名称"label=选手填写部分width="180">prop="合约地址"label=选手填写部分width="180">prop="部署时间"label=选手填写部分>prop="创建时间"label=选手填写部分>prop="修改时间"label=选手填写部分>代码片段2:created() {this.axios.get(`/list`).then((response) => {if(response.data.result){this.contracts = 选手填写部分 }})}任务3-2:区块链应用后端功能开发(20分)1.请基于已有的项目,基于WeBASEUtils.java工具类,编写注册相关文件,实现注册接口,并测试功能完整性。(5分)本任务具体要求如下:开发注册文件RegisterBO.java实现注册功能实体的定义包含登录页面所传递的三个变量:地址、角色、密码,并补充get、set方法开发账户管理文件AccountService.java中注册部分,再次验证前端传值,合约的交互逻辑,返回值封装成为Result结果类开发账户管理入口文件AccountController.java中注册部分,要求接口地址为/account/registerRegisterBO.java:代码片段1:public class RegisterBO {String 选手填写部分;String 选手填写部分;String 选手填写部分;public String getAddress() {选手填写部分}public void setAddress(选手填写部分) {选手填写部分}public String getRole() {选手填写部分 }public void setRole(选手填写部分) {选手填写部分}public String getPassword() {选手填写部分}public void setPassword(选手填写部分) {选手填写部分}}AccountService.java:代码片段1:public Result RegisterService(RegisterBO registerBO) {List funcParam = new ArrayList();funcParam.add选手填写部分;funcParam.add选手填写部分;funcParam.add选手填写部分;Dict result = monReq(userAddress,选手填写部分, funcParam, ABI, 选手填写部分, contractAddress);JSONObject respBody = JSONUtil.parseObj(result.get("result"));String data = (String)respBody.get("message");if (data.equals("Success")) {return Result.success("ok");}else {return Result.error(ResultVO.PARAM_EMPTY);}}AccountController.java:代码片段1:@AutowiredAccountService accountService;@RequestMapping(选手填写部分, method = RequestMethod.POST)public Result register(@RequestBody RegisterBO registerBO) {return 选手填写部分;}2.请基于已有的项目,基于WeBASEUtils.java工具类,编写登录相关文件,实现登录接口,并测试功能完整性。(5分)本任务具体要求如下:开发注册文件LoginBO.java实现功能实体的定义,包含登录页面所传递的两个变量:地址、密码并补充get、set方法开发账户管理文件AccountService.java中登录部分,实现与合约的交互逻辑,返回值封装成为Result结果类开发账户管理入口文件AccountController.java中登录部分,要求接口地址为/account/loginLoginBO.java:代码片段1:public class LoginBO {String 选手填写部分;String 选手填写部分;public String getAddress() {选手填写部分}public void setAddress(选手填写部分) {选手填写部分}public String getPassword() {选手填写部分 }public void setPassword(选手填写部分) {选手填写部分 }}AccountService.java:代码片段1:public Result LoginService(LoginBO loginBO) {List funcParam = new ArrayList();funcParam.add(选手填写部分);funcParam.add(选手填写部分);Dict result = monReq(userAddress,选手填写部分, funcParam, ABI, 选手填写部分, contractAddress);JSONArray respBody = JSONUtil.parseArray(result.get("result"));String data = (String)respBody.get(0);if (data.equals("true")){return Result.success(loginBO.getAddress());}else {return Result.error(ResultVO.PARAM_EMPTY);}}AccountController.java:@RequestMapping(选手填写部分, method = RequestMethod.POST)public Result login(@RequestBody LoginBO loginBO) {选手填写部分;}3.请基于已有的项目,基于WeBASEUtils.java工具类,编写产权管理相关文件,实现产权管理的相关接口,并测试功能完整性。(4分)本任务具体要求如下:开发文件SPU_sallerBO.java实现功能实体的定义,包含变量用户地址、价格和产权编号,并补充get、set方法开发管理文件NewEnergyService.java中产权出售部分,对前端的数据进行二次验证,要求用户地址为0x开头的数据串,实现与合约的交互逻辑,返回值封装成为Result结果类开发管理入口文件NewEnergyController.java中产权出售部分,要求接口地址为/SPU_saller,接口可接受请求方法为POSTSPU_sallerBO.java:public class SPU_sallerBO {String 选手填写部分;String 选手填写部分;String 选手填写部分;public String get_numid() {return 选手填写部分;}public void set_numid(选手填写部分) {选手填写部分;}public String get_price() {选手填写部分;}public void set_price(选手填写部分) {选手填写部分;}public String getAddress() {选手填写部分;}public void setAddress(选手填写部分) {选手填写部分;}}NewEnergyService.java:public Result SPU_sallerService(SPU_sallerBO spu_sallerBO) {List funcParam = new ArrayList();if(!spu_sallerBO.getAddress().startsWith("0x")){return Result.error(ResultVO.ADDRESS_INVALID);}选手填写部分Dict result = monReq(userAddress,选手填写部分, funcParam, ABI,选手填写部分, contractAddress);JSONObject resBody = JSONUtil.parseObj(result.get("result"));String data = (String) resBody.get("message");if (data.equals("Success")) {return Result.success("ok");}else {return Result.success("failed");}}NewEnergyController.java:@RequestMapping(选手填写部分, method = RequestMethod.POST)public Result SPU_saller(@RequestBody SPU_sallerBO spu_sallerBO) {return 选手填写部分;}4.请基于已有的项目,基于WeBASEUtils.java工具类,编写产权交易相关文件,实现产权交易的相关接口,并测试功能完整性。(6分)本任务具体要求如下:开发文件SpuVO.java实现功能实体的定义,包含变量:设备编号、设备名称、实际功率、额定功率、结束时间、工作地点、单价、所属权,并补充get、set方法开发文件SPU_sallerBO.java实现功能实体的定义,包含变量:产权编号、价格、用户地址,并补充get、set方法开发管理文件NewEnergyService.java中产权交易、查询部分,实现与合约的交互逻辑,返回值封装成为Result结果类开发管理文件NewEnergyController.java中产权交易,要求接口地址为/SSPU_transfer,请求方法为POST;产权查询部分,要求接口为/get_numid_Spu_,请求方法为GETSpuVO.java:public class SpuVO {String 选手填写部分;String 选手填写部分;String 选手填写部分;String 选手填写部分;String 选手填写部分;String 选手填写部分;String 选手填写部分String 选手填写部分;public String get_numid() {选手填写部分 }public void set_numid( 选手填写部分) {选手填写部分}public String getName() {选手填写部分}public void setName( 选手填写部分) {选手填写部分}public String getActual_Power() {选手填写部分}public void setActual_Power( 选手填写部分) {选手填写部分}public String getRated_Power() {选手填写部分 }public void setRated_Power( 选手填写部分) {选手填写部分}public String getInput_Time() {选手填写部分}public void setInput_Time( 选手填写部分) {选手填写部分}public String getPosition() {选手填写部分 }public void setPosition( 选手填写部分) {选手填写部分}public String getPrice() {选手填写部分 }public void setPrice( 选手填写部分) {选手填写部分}public String getAddress() {选手填写部分 }public void setAddress( 选手填写部分) {选手填写部分}}NewEnergyService.java:public Result SPU_transferService(SPU_transferBO spu_transferBO) {List funcParam = new ArrayList();选手填写部分 Dict result = monReq(userAddress,选手填写部分, funcParam,ABI, 选手填写部分, contractAddress);JSONObject resBody = JSONUtil.parseObj(result.get("result"));String data = (String) resBody.get("message");if (data.equals("Success")) {return Result.success("ok");}else {return Result.success("failed");}}public Result get_numid_SpuService(String _numid) {List funcParam = new ArrayList();选手填写部分Dict result = monReq(userAddress,选手填写部分, funcParam, ABI,选手填写部分, contractAddress);JSONArray resBody = JSONUtil.parseArray(result.get("result"));JSONArray res = JSONUtil.parseArray(resBody.get(0));JSONArray array = new JSONArray();选手填写部分return Result.success(array);}NewEnergyController.java:@RequestMapping( 选手填写部分)public Result SSPU_transfer(@RequestBody SPU_transferBO spu_transferBO) {return 选手填写部分);}@RequestMapping( 选手填写部分)public Result get_numid_Spu(@RequestParam("_numid") String _numid) {return 选手填写部分;}2023年全国职业院校技能大赛高职组“区块链技术应用”赛项赛卷(4卷)任务书参赛队编号:背景描述随着消费需求的不断变化,消费者对于食品安全的关注度越来越高,不仅要求生鲜肉品的肥瘦比例、脂肪含量等,更包括产品生产和物流管理过程。传统供应链(如农场、加工厂、配送商、零售商等)条件下这些数据的保存基本依靠纸张记录,具有一定的随意性,消费者无法识别这些数据的真伪。因此,供应链管理正面临着效率和安全透明的双重挑战,迫切需要进行有效变革,促进食品供应链管理更加高效透明和安全。为了解决以上问题,使用新的高效率、高透明和真实性的新型供应链来打破传统食品供应链的研究迫在眉睫。使用区块链技术不仅能够开创食品溯源的新时代、为改善食品安全状况打下基础,还能够帮助企业提高食品追溯体系的运转效率,从而减少浪费,降低成本,促进可持续发展。如通过使用加密技术,写入区块链的数据在不被监测的情况下将无法被更改,提高了数据可信度,有效遏制食品造假问题。区块链与供应链相结合的一个最为重要的特点是使得商品信息在区块链上可追溯。同时,所有参与方的数据均上网可查,增加供应链各方的交互,提高了办事效率。用户在购买商品时,可通过扫描生成的二维码获取食品从源头到培育到运输以及最后摆上货架的所有相关信息。这种透明供应链系统一方面可以保障用户自身利益,也可以提高商店利润率,实现双赢。模块一:区块链产品方案设计及系统运维(35分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块一提交结果.docx】中对应的任务序号下。任务1-1:区块链产品需求分析与方案设计本环节需要依据项目背景完成需求分析与方案设计,具体要求如下:依据给定的食品供应链溯源系统的业务架构图,对赛题进行业务分析,使用Visio或思维导图工具编制所有的用户角色、用户用例以及相应的业务系统功能图;设计区块链系统的架构,画出系统架构图,指明需要的节点个数、名称等信息;结合功能划分,列出表格说明各个主要模块功能;根据需求分析、承诺集设计,完成区块链应用系统业务流程图;整合所有内容,设计接口编写并形成对应的概要设计说明书“01概要设计说明书.doc”,保存至【区块链技术应用赛\重命名为工位号\】目录下。任务1-2:区块链系统部署与运维通过给定区块链项目需求,进行区块链系统的的部署,包括系统部署、控制台部署等。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护。部署区块链管理平台服务器,配置管理平台参数及访问端口;部署项目节点,获取管理平台与节点服务的加密通信;部署应用程序接口服务,应用工具完成接口部署;部署区块链系统,对接应用服务器和数据库。子任务1-2-1:搭建FISCO BCOS区块链系统在本机搭建一条分布式存储的4节点区块链系统,其网络端口要求如下:机构名称 节点数 P2P端口 channel端口 rpc端口机构A 1 30100 20100 8010机构B 1 30200 20200 8020机构C 2 30300 20300 8030搭建完区块链系统后,需检查每个节点的连接数和运行状态。子任务1-2-2:控制台配置与使用为区块链系统配置控制台,使用控制台与区块链系统进行简单交互(配置控制台相关工具和软件在 “/root/Desktop/src” 目录下),交互步骤如下:(1)查询节点版本信息(2)部署HelloWorld合约(3)查看交回执,解释每个字段含义(4)查询部署合约的区块信息子任务1-2-3:区块链系统权限分配为该区块链系统分配权限,大赛平台提供了机构 A、机构 B 和机构 C 管理员账号的私钥文件,现有任务如下:(1)需要将这三个账号分别设置为委员账号;(2)设置机构 A 账号的投票权重为2;(3)新增运维账号D,并部署HelloWorld合约。任务1-3:区块链系统测试设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约中进行系统测试、性能测试等;根据业务需求,分析并且修复给定智能合约中的安全漏洞。利用模拟业务和测试工具来完成对区块链系统服务数据的测试。部署节点前置服务,实现基于浏览器测试启动情况验证;将大赛平台中新建的material、logistics、user账户以p12的形式导出,并导入大赛平台,验证账户地址一致,并做接口测试;分析最近一分钟的节点日志打印,收集日志关键错误打印信息,分析节点的共识消息处理,出块,交易数量等信息,判断节点的健康度。模块二:智能合约开发与测试(30分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块二提交结果.docx】中对应的任务序号下。任务2-1:智能合约设计根据食品供应链溯源的功能需求,完成以下任务:1.设计合约接口,画出各智能合约的UML图;2.理解程序调用逻辑,画出各合约关系的时序图。任务2-2:智能合约开发使用Solidity编程语言开发智能合约,包括存储合约设计开发,接口合约设计开发,最终实现区块链溯源存证功能。针对Solidity智能合约进行代码检查和测试,验证函数执行结果是否与预期结果相符。子任务2-2-1:原材料合约接口编码1.编写原材料接口newMaterial,初始化原材料信息,返回合约地址,并实现原材料信息上链功能,合约部分代码如下:pragma solidity 0.6.10; contract Material { struct Material{ address owner; string name; string id; string memo; uint createdAt; bool exist; } mapping(string => Material) public materials; // 可自行添加形参和返回值 function newMaterial (string memory _name, string memory _id,...) public { // TODO *** } }2.编写获取存原材料接口getMaterial,根据合约地址获取原材料信息,合约部分代码如下:// 可自行添加形参和返回值 function getMaterial(string memory id) public view returns (...) { // TODO *** }子任务2-2-2:食品物流接口编码1.编写食品物流上链接口addLogistic,实现食品物流信息上链功能,合约部分代码如下:pragma solidity 0.6.10; pragma experimental ABIEncoderV2; contract Logistics { struct LogisticsData { address cargo; address orgin; address destination; string memo; uint createdAt; uint queryCount; } LogisticsData[] private _logisticsData; uint public recordCount; uint public queryCount; // 可自行添加形参和返回值 function addLogistics(address cargo, address orgin,...) public { // TODO *** }2.编写获取食品物流信息的接口getLogistics,根据食品产品编号获取物流信息,合约部分代码如下:// 可自行添加形参和返回值 function getLogistics(uint256 _id) public view returns (string memory, ***) { // TODO *** }任务2-3:智能合约测试消除合约代码错误和警告,成功编译智能合约并部署,通过调用合约接口,模拟实际业务流程检查合约状态和数据,发现可能存在的缺陷和漏洞,编写高质量、可复用的测试用例,从而提升开发效率。子任务2-3-1:WeBASE-Front测试1.解决代码错误和警告,正确编译并部署合约,成功获取部署的合约地址和abi。2.调用食品和物流合约接口newMaterial、getMaterial、addLogistic和getLogistics,模拟完整验证业务流程。调用参考图如下:将上述任务中的编写代码及运行截图保存至指定位置。子任务2-3-2:JAVA-SDK测试为食品原材料信息上链(newMateria)和获取食品信息(getMateria)编写测试用例,部分代码如下:@Test public void Materia() throws Exception { // deploy contract Materia materia = Materia.deploy(); Assert.assertNotNull(logistic); // TODO *** }模块三:区块链应用系统开发(30分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块三提交结果.docx】中对应的任务序号下。任务3-1:区块链应用前端开发通过给定区块链业务需求和前端页面示例,使用vue框架完成前端页面编写,实现用户操作页面。首页页面具有如下功能:1.根据输入的食品编号或食品合约地址,查询食品的原材料信息和物流信息;2.物流信息格式为【时间 日期 中转信息 备注信息】部分示例代码如下: 供应链溯源系统 原材料 物流 用户 < /> //TODO ***任务3-2:区块链应用后端开发使用JAVA-SDK与区块链进行交互,通过solc2Java工具将Solidity智能合约转译为可供Java调用的文件,实现区块链编程。子任务3-2-1:获取交易总量使用JAVA语言编写后端代码进行交互,获取区块链的交易总量,要求如下:1.函数返回十进制的整数;2.函数有调用异常处理,若合约交互失败需返回失败原因。部分代码如下:@GetMapping("/txSum") public String getTotalTransactionCount() { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:fisco-config.xml"); BcosSDK bcosSDK = context.getBean(BcosSDK.class); Client client = bcosSDK.getClient(1); // TODO *** }子任务3-2-2:获取区块信息编写后端代码进行交互,获取区块链的最近10个区块的信息,包括时间戳、区块哈希、区块高度,要求如下:1.函数返回最近十个区块的信息;2.函数有调用异常处理,若合约交互失败需返回失败原因。部分代码如下:@GetMapping("/blockByNumber") public List getBlockByNumber() { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:fisco-config.xml"); BcosSDK bcosSDK = context.getBean(BcosSDK.class); Client client = bcosSDK.getClient(1); //TODO *** }子任务3-3-3:首页后端请求编写后端代码,通过Http请求与智能合约进行交互,并将获取区块高度、区块链交易总数、供应链查询次数、供应链总查询次数等信息传递给前端模板。部分代码如下:@GetMapping("/blockByNumber") public List getBlockByNumber() { Client client = bcosService.getClient(); //TODO *** return result; }子任务3-3-4:Server连接保持定义service用来保持与区块链的连接,减少与区块链的请求,连接部分代码如下:@Service public class BcosService { private final Client client; //TODO *** } 展开更多...... 收起↑ 资源列表 GZ036 区块链技术应用赛项赛题第3套.docx GZ036 区块链技术应用赛项赛题第4套.docx 第3套系统概要设计说明书.doc