资源简介 2023年全国职业院校技能大赛高职组“区块链技术应用”赛项赛卷(1卷)任务书参赛队编号:背景描述随着消费需求的不断变化,消费者对食品安全的关注度越来越高,希望能参与食品供应链管理,让每个环节都透明化。但传统的供应链管理依靠纸张记录,保存数据具有随意性,消费者无法确认其真实性。此外,传统管理模式中心化,多数环节间信息流通不畅,影响供应链管理效率。因此,供应链管理面临效率和安全透明的双重挑战,迫切需要有效变革,促进食品供应链更高效、透明和安全。从技术层面来看,区块链技术具有去中心化、公开透明、不可篡改等优点,可解决食品供应链短板,与现行管理相结合,不仅可提升透明度,还可提升管理效率。通过构建基于区块链技术的食品安全溯源平台,有效将包括生产日期、生产产地、生产商、流通企业等食品安全溯源相关信息通过区块链去中心化的方式存储,有效保证了数据真实以及不可篡改。另一方面,借助区块链智能合约技术,灵活设计食品安全溯源相关业务,在确保数据安全的前提下实现透明公开,在此基础上引入监管机制有效保证业务良性开展。模块一:区块链产品方案设计及系统运维(35分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块一提交结果.docx】中对应的任务序号下。任务1-1:区块链产品需求分析与方案设计本任务需要依据项目背景完成需求分析与方案设计,具体要求如下:1. 依据给定区块链食品溯源系统的业务架构图,对考题进行业务分析,尽可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和处理流程,要求分为区块链食品溯源业务平台和支撑平台两个部分;2. 根据食品溯源系统设计,在系统中分别包括用户管理以及订单追溯功能,在订单追溯中需要包括生产商、分销商、经销商订单的追溯管理功能。根据描述,设计区块链系统的总体功能概览图;3. 整合上述设计内容,完善“01区块链食品溯源系统概要设计说明书.doc”,具体工作内容如下:(1)将设计内容根据说明书中模块需求进行补充,并完善概要设计说明书中的“需求概要”;(2)完善说明书中接口说明部分内容。完成后提交“区块链食品溯源系统概要设计说明书.doc”文档至【区块链技术应用赛\重命名为工位号】下。任务1-2:区块链系统部署与运维围绕食品安全溯源区块链平台部署与运维需求,进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护,具体要求如下:根据参数与端口设置要求,部署区块链系统并验证;根据参数与端口设置要求,部署区块链网络管理平台并验证;基于区块链系统相关管理平台,按照任务指南实施系统运维工作并验证;基于区块链系统相关监管工具,按照任务指南对区块链系统进行监管。子任务1-2-1: 搭建区块链系统并验证基于给定服务器环境以及软件(地址“/root/tools”),搭建一条4节点的区块链系统并验证,具体工作内容如下:(1)采用默认配置搭建区块链网络;(2)通过命令验证区块链节点进程运行状况;(3)通过命令验证区块链连接状态和共识状态日志输出。子任务1-2-2:搭建区块链系统管理平台并验证基于给定服务器环境以及软件(地址“/root/tools”),搭建区块链控制台并开展相关运维工作,具体工作内容如下:(1)配置控制台,管理相关证书并启动;(2)使用控制台安装HelloWorld智能合约;(3)使用控制台完成HelloWorld智能合约的set与get操作;(4)使用控制台查看区块链中区块高度。子任务1-2-3:区块链节点运维基于已完成的区块链系统与管理平台搭建工作,开展区块链节点的加入与退出运维工作,具体内容如下:(1)获取指定区块链节点输出等级为警告级,并设置日志存储阈值位100MB并验证;(2)通过给定工具(地址/root/tools)完成新节点(node4)配置;(3)启动新节点加入区块链系统并验证。子任务1-2-4:区块链网络运维根据任务描述要求,完成网络配置与管理运维操作,具体内容如下:(1)设置区块链系统黑名单,将node3设为黑名单禁止连接,并验证;(2)设置系统中区块打包最大交易数量设为2000;(3)验证区块最大打包交易数量情况。任务1-3:区块链系统测试设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约进行系统测试、性能测试等;根据业务需求,分析并且修复给定智能合约中的安全漏洞。利用模拟业务和测试工具来完成对区块链系统服务数据的测试。使用命令启动区块链系统可视化一体平台并验证启动情况;通过可视化平台生成包括生产商(Producer)、经销商(distributor)、零售商(retailer)账户,并将账户以p12加密形式导出后倒入指定前置可视化平台,验证地址一致性;使用Postman对上述功能接口进行验证,并将验证结果截图提交工程文档。对食品溯源系统服务端“添加食品”(/produce)功能接口进行验证。请求路由: /produce请求方法: POST输入项说明: 输入项类型说明traceNumberString追踪编号foodNameString食品名称traceNameString存证人地址qualityInteger食品质量输出项说明: 输出项类型说明retInteger返回值msgString返回消息,"Success"表示操作成功参照工程项目(地址:“/root/projects”)使用Caliper测试工具对食品安全溯源系统智能合约生成新食品(newFood)功能进行压力测试。具体要求如下:提供核心测试代码;设置txNumber=10,tps=1,所有测试通过率为100%。智能合约安全漏洞测试。有如下问题智能合约: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 contractfunction 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 contractfunction getBalance() public view returns (uint) {return address(this).balance;}}分析智能合约中存在问题,并说明危害;根据truffle工具中的代码文件,编写测试用例,复现智能合约中存在的漏洞;创建新的智能合约,修复其中问题,说明修复内容并测试。完成本任务后将相关命令、代码以及运行结果截图填写至工程文档,并提交。模块二:智能合约开发与测试(30分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块二提交结果.docx】中对应的任务序号下。任务2-1:智能合约设计根据区块链食品溯源应用需求分析和方案设计文档的描述,编写该区块链产品的智能合约功能需求文档,以及设计该智能合约UML图。具体要求如下:1.编写区块链食品溯源智能合约功能需求文档根据区块链食品溯源产品项目背景和需求分析,编写该区块链食品溯源产品的智能合约功能需求文档。2.完成区块链食品溯源智能合约的设计图设计区块链食品溯源智能合约接口,画出区块链食品溯源智能合约的角色UML用例图,以及画出区块链食品溯源各智能合约关系的时序图。任务2-2:智能合约开发使用Solidity语言完成智能合约开发、部署和调用,要求如下:1.食品信息(FoodInfoItem)的接口编码(1)编写食品信息实体的接口,完成可溯源食品信息初始化,实现可追溯的原始生产商食品信息上链功能;表2-2-1 FoodInfoItem实体说明名称 类型 说明_currentTraceName string 当前用户名_name string 食品名称_owner address 合约的创建者_quality uint8 质量_status uint8 状态_traceName string[] 用户名_timestamp uint[] 流转时间戳_traceAddress address[] 用户地址_traceQuality uint8[] 食品质量contract FoodInfoItem{//①保存食品流转过程中各个阶段的时间戳//②保存食品流转过程各个阶段的用户名//③保存食品流转过程各个阶段的用户地址信息(和用户一一对应)//④保存食品流转过程中各个阶段的质量//⑤食品名称//⑥当前用户名称//⑦质量(0=优质 1=合格 2=不合格)//⑧状态(0:生产 1:分销 2:出售)//⑨初始化owner(2)编写分销商食品上链信息接口,根据食品溯源智能合约地址获取分销商上链食品的信息;function addTraceInfoByDistributor(①, uint8 quality) public returns(bool) {require(_status == 0 , "status must be producing");//②_timestamp.push(now);_traceName.push(traceName);_currentTraceName = traceName;//③//④_traceQuality.push(_quality);_status = 1;return true;}(3)编写超市进行食品上链信息的接口,根据食品溯源智能合约地址获取超市上链食品信息。function addTraceInfoByRetailer(①, uint8 quality) public returns(bool) {require(_status == 1 , "status must be distributing");//②_timestamp.push(now);_traceName.push(traceName);_currentTraceName = traceName;//③//④_traceQuality.push(_quality);_status = 2;return true;}2.食品溯源(Trace)的接口编码(1)编写食品溯源智能合约生产商Producer添加食品接口,必须生产商才能添加可溯源的食品,实现溯源功能;function newFood(①, string traceName, uint8 quality)public ② returns(③){//④//⑤//⑥//⑦//⑧}(2)编写食品溯源智能合约分销商Distributor添加食品接口,必须分销商才能添加可溯源的食品,实现溯源功能;function addTraceInfoByDistributor(①, uint8 quality)public ② returns(bool) {//③return FoodInfoItem(foods[traceNumber]).④, quality);}(3)编写食品溯源智能合约超市Retailer添加食品接口,必须超市才能添加可溯源的食品,实现溯源功能。function addTraceInfoByRetailer(①, uint8 quality)public ② returns(bool) {require(③, "traceNumber does not exist");return FoodInfoItem(foods[traceNumber]).④, quality);}3.角色(Role)管理的接口编码(1)编写食品溯源增加角色接口,必须是未增加的角色才能被添加,实现添加角色的功能;function add(①, address account) ② {require(!③, "Roles: account already has role");role.④ = true;}(2)编写食品溯源移除角色接口,必须是已增加的角色才能被移除,实现移除角色的功能;function remove(①, address account) ② {require(③, "Roles: account does not have role");role.④ = false;}(3)编写食品溯源角色授权接口,必须是授权的角色地址,实现角色权限管理功能。function has(①, address account) ② returns (bool) {require(③, "Roles: account is the zero address");return role.④;}4.合约编译、部署和调用(1)解决代码错误和警告,正确编译并部署合约,成功获取部署的合约地址和abi;(2)调用食品溯源智能合约的接口,完整验证业务流程。任务2-3:智能合约测试编写智能合约单元测试代码并完成合约功能测试、性能测试,具体要求如下:1.配置区块链网络启动Ganache软件,创建新的Wordspace,配置对外访问的RPC接口为7545,配置项目的truffle-config.js实现与新建Workspace的连接。2.设置producerId和sellederId两个变量基于VSCODE加载的Truffle项目,补全位于test文件夹中foodTraceNew.js文件预操作的方法。在测试文件中添加预定义的方法(在其他方法启动前使用),在方法中分别设置producerId和sellederId两个变量,具体要求如下:(1)producerId设置为1;(2)sellderId设置为4。3.补全createMember和getMember方法基于VSCODE加载的Truffle项目,补全位于test文件夹中foodTraceNew.js文件,添加测试用例,测试智能合约的createMember和getMember方法。4.测试createOrder和getOrder方法基于VSCODE加载的Truffle项目,补全位于test文件夹中foodTraceNew.js文件,添加测试用例,测试智能合约的createOrder和getOrder方法。5.测试createFood和getFood方法基于VSCODE加载的Truffle项目,补全位于test文件夹中foodTraceNew.js文件,添加测试用例,测试智能合约的createFood和getFood方法。模块三:区块链应用系统开发(30分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块三提交结果.docx】中对应的任务序号下。任务3-1:区块链应用前端功能开发1.请基于前端系统的开发模板,在登录组件login.js、组件管理文件components.js中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下:具体要求如下:(1)有明确的提示,提示用户选择角色;(2)用户可看到四个不同的角色可选(生产商、中间商、超市、消费者);(3)每个用户所对应的组件请在components中找寻并填入;(4)页面顶部要有食品溯源平台的网站标题和logo。Login.js:代码片段1:template: `选手填写部分选手填写部分代码片段2:// 用户身份users: [{name: 选手填写部分,userName: 'producer',component: 选手填写部分,},{name: 选手填写部分,userName: 'distributor',component: 选手填写部分,},{name: 选手填写部分,userName: 'retailer',component: 选手填写部分,},{name: 选手填写部分,userName: 'consumer',component: 选手填写部分,},],currentUser: 选手填写部分, // 当前用户components.js:代码片段3:// 头部组件const Header = {// 接受传入的登录状态、用户信息props: ['login', 'user'],template: `选手填写部分{{ 选手填写部分 }}`}2.请基于前端系统的开发模板,在登录组件login.js、组件管理文件components.js中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下:具体要求如下:(1)点击角色进入相应角色登录页面;(2)登录界面提示用户的地址(消费者不显示),有登录操作的相关提示;(3)登录界面有5秒倒计时;(4)登录界面有“直接登录”按钮,点击可直接跳转到相应角色首页。login.js:代码片段1:登录中......(倒计时:{{ 选手填写部分}} 秒)角色:{{ 选手填写部分}}角色地址:{{ 选手填写部分}}直接登录代码片段2:// 登录时有个5秒的倒计时,这里是在点击直接登录时,清楚倒计时,直接跳到相关页面clearTimer() {clearInterval(选手填写部分);this.$emit(选手填写部分, {component: this.ponent,user: this.loginItem.name,});},// 倒计时countdownInterval({ component, name: user }) {this.timer = setInterval(() => {if(this.countdown <= 0){选手填写部分;}选手填写部分;}, 选手填写部分);},代码片段3:// 点击用户登录,获取用户地址handleClick(item) {this.loginItem = item;// 处理消费者角色,其他三个角色都有一个角色地址if (item.userName !== 选手填写部分) {axios({method: 'get',url: `/userinfo userName=${item.userName}`,}).then(ret => {this.address = 选手填写部分;this.currentUser = 选手填写部分;this.countdownInterval(选手填写部分);}).catch(err => {console.log(err)})} else {this.currentUser = item.name;this.countdownInterval(item);}}任务3-2:区块链应用后端功能开发1.请基于已有的项目,开发完善IndexController类,编写添加食品生产信息的方法,实现食品信息的添加功能,并测试功能完整性。本任务具体要求如下:(1)开发文件IndexController.java中的produce方法,请求接口为/produce;(2)开发文件IndexController.java中的produce方法,要求对前端传入的参数进行二次验证;(3)开发文件IndexController.java中的produce方法,要求封装返回值为String,但不返回视图页面。produce方法:/*** 添加食品生产信息* traceNumber: 食品溯源id,食品溯源过程中的标识符* foodName: 食物名称* traceName: 用户名,食品流转过程各个阶段的用户名* quality: 当前食品质量(0=优质 1=合格 2=不合格)* @return:添加食品生产信息结果*/@选手填写部分@PostMapping(选手填写部分, produces=MediaType.APPLICATION_JSON_VALUE)public String produce(@RequestBody JSONObject jsonParam) {//声明返回对象JSONObject _outPutObj = new JSONObject();//生产商生产食品if(jsonParam == null){选手填写部分}int trace_number = 选手填写部分;String food_name = 选手填写部分;String trace_name = 选手填写部分;int quality = 选手填写部分;JSONArray params = JSONArray.parseArray("[\""+food_name+"\","+trace_number+",\""+trace_name+"\","+quality+"]");JSONObject _jsonObj = new JSONObject();_jsonObj.put("contractName",CONTRACT_NAME);_jsonObj.put("contractAddress",CONTRACT_ADDRESS);_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));_jsonObj.put("user",PRODUCER_ADDRESS);_jsonObj.put("funcName",选手填写部分);_jsonObj.put("funcParam",选手填写部分);String responseStr = httpPost(URL,选手填写部分);JSONObject responseJsonObj = JSON.parseObject(responseStr);String msg = responseJsonObj.getString("message");if (msg.equals("Success")){_outPutObj.put("ret",选手填写部分);_outPutObj.put("msg",msg);}else{_outPutObj.put("ret",选手填写部分);_outPutObj.put("msg",msg);}return 选手填写部分;}2.开发完善IndexController类,编写中间商添加食品流转信息的方法,实现中间商添加食品流转信息的功能,并测试功能完整性。具体要求如下:(1)开发文件IndexController.java中的add_trace_by_distrubutor方法,请求接口为/adddistribution;(2)开发文件IndexController.java中的add_trace_by_distrubutor方法,要求对前端传入的参数进行二次验证;(3)开发文件IndexController.java中的add_trace_by_distrubutor方法,要求封装返回值为String,但不返回视图页面;add_trace_by_distrubutor方法:/*** 中间商添加食品流转信息* traceNumber: 食品溯源id,食品溯源过程中的标识符* traceName: 用户名,食品流转过程各个阶段的用户名* quality: 当前食品质量(0=优质 1=合格 2=不合格)* @return:中间商添加食品流转信息结果*/@选手填写部分@PostMapping(选手填写部分, produces=MediaType.APPLICATION_JSON_VALUE)public String add_trace_by_distrubutor(@RequestBody JSONObject jsonParam) {//声明返回对象JSONObject _outPutObj = new JSONObject();if(jsonParam == null){选手填写部分}String trace_number = 选手填写部分;String trace_name = 选手填写部分;int quality = 选手填写部分;JSONArray params = JSONArray.parseArray("["+trace_number+",\""+trace_name+"\","+quality+"]");JSONObject _jsonObj = new JSONObject();_jsonObj.put("contractName",CONTRACT_NAME);_jsonObj.put("contractAddress",CONTRACT_ADDRESS);_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));_jsonObj.put("user",DISTRIBUTOR_ADDRESS);_jsonObj.put("funcName",选手填写部分);_jsonObj.put("funcParam",选手填写部分);String responseStr = httpPost(URL,选手填写部分);JSONObject responseJsonObj = JSON.parseObject(responseStr);String msg = responseJsonObj.getString("message");if (msg.equals("Success")){_outPutObj.put("ret",选手填写部分);_outPutObj.put("msg",msg);}else{_outPutObj.put("ret",选手填写部分);_outPutObj.put("msg",msg);}return 选手填写部分;}3.请基于已有的项目,开发完善IndexController类,编写获取某个食品的溯源信息的方法,实现获取某个食品的溯源信息的功能,并测试功能完整性。具体要求如下:(1)开发文件IndexController.java中的trace方法,请求接口为/trace,该接口调用私有方法get_trace,不直接与合约交互,提高系统的安全性;(2)开发文件IndexController.java中的trace方法,对传入数据进行二次验证;(3)开发文件IndexController.java中的get_trace方法,要求通过合约进行溯源信息的查询,且外部无法直接调用;(4)开发文件IndexController.java中的trace方法,要求封装返回值为String,但不返回视图页面。trace方法:/*** 获取某个食品的溯源信息* @param traceNumber 食品溯源id,食品溯源过程中的标识符* @return 对应食品的溯源信息*/@选手填写部分@GetMapping(选手填写部分, produces=MediaType.APPLICATION_JSON_VALUE)public String trace(String traceNumber){JSONObject _outPut = new JSONObject();if (Integer.parseInt(traceNumber) <= 0){选手填写部分}List res = get_trace(traceNumber);JSONArray o = new JSONArray(res);return 选手填写部分;}get_trace方法:/*** 从链上获取某个食品的溯源信息* @param traceNumber 食品溯源id,食品溯源过程中的标识符* @return 对应食品的溯源信息*/选手填写部分JSONArray get_trace(String traceNumber){//获取食品基本信息JSONArray params = JSONArray.parseArray("["+traceNumber+"]");JSONObject _jsonObj = new JSONObject();_jsonObj.put("contractName",CONTRACT_NAME);_jsonObj.put("contractAddress",CONTRACT_ADDRESS);_jsonObj.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));_jsonObj.put("user","");_jsonObj.put("funcName",选手填写部分);_jsonObj.put("funcParam",选手填写部分);String responseStr = httpPost(URL,选手填写部分);JSONArray food = JSON.parseArray(responseStr);//获取食品溯源信息JSONObject _jsonObj2 = new JSONObject();_jsonObj2.put("contractName",CONTRACT_NAME);_jsonObj2.put("contractAddress",CONTRACT_ADDRESS);_jsonObj2.put("contractAbi",JSONArray.parseArray(CONTRACT_ABI));_jsonObj2.put("user","");_jsonObj2.put("funcName",选手填写部分);_jsonObj2.put("funcParam",选手填写部分);String responseStr2 = httpPost(URL,选手填写部分);JSONArray traceInfoList = JSON.parseArray(responseStr2);JSONArray time_list = 选手填写部分;JSONArray name_list = 选手填写部分;JSONArray address_list = 选手填写部分;JSONArray quality_list = 选手填写部分;JSONArray _outPut = new JSONArray();for (int i=0;iif (i==0){JSONObject _outPutObj = new JSONObject();_outPutObj.put("traceNumber",选手填写部分);_outPutObj.put("name",选手填写部分);_outPutObj.put("produce_time",选手填写部分);_outPutObj.put("timestamp",选手填写部分);_outPutObj.put("from",选手填写部分);_outPutObj.put("quality",选手填写部分);_outPutObj.put("from_address",选手填写部分);_outPut.add(_outPutObj);}else{JSONObject _outPutObj = new JSONObject();_outPutObj.put("traceNumber",选手填写部分);_outPutObj.put("name",选手填写部分);_outPutObj.put("produce_time",选手填写部分);_outPutObj.put("timestamp",选手填写部分);_outPutObj.put("from",选手填写部分);_outPutObj.put("to",选手填写部分);_outPutObj.put("quality",选手填写部分);_outPutObj.put("from_address",选手填写部分);_outPutObj.put("to_address",选手填写部分);_outPut.add(_outPutObj);}}return _outPut;}全国职业院校技能大赛赛项规程赛项名称: 区块链技术应用英文名称:Application of Blockchain Technology赛项组别: 高等职业教育组赛项编号: GZ036一、赛项信息赛项类别每年赛 隔年赛(单数年/双数年)赛项组别□中等职业教育 高等职业教育学生赛(□个人/团体) □教师赛(试点) □师生同赛(试点)涉及专业大类、专业类、专业及核心课程专业大类 专业类 专业名称 核心课程电子信息 计算机类 510212区块链技术应用 区块链核心技术虚拟化及容器技术区块链部署与运维区块链应用设计与开发智能合约开发510202计算机网络技术 Linux操作系统管理网络自动化运维510201计算机应用技术 前端设计与开发系统部署与运维510203软件技术 软件建模与设计软件测试510205大数据技术 大数据平台部署与运维510206云计算技术应用 容器云服务架构与运维510207信息安全技术应用 操作系统安全信息安全产品配置与应用电子数据取证技术应用510208虚拟现实技术应用 软硬件系统搭建和维护510209人工智能技术应用 人工智能系统部署与运维510213移动应用开发 面向对象建模与设计服务端框架技术510216密码技术应用 信息安全技术与实施公钥基础设施应用信息安全工程与管理对接产业行业、对应岗位(群)及核心能力产业行业 岗位(群) 核心能力信息传输、计算机服务和软件业 区块链应用开发岗 具有区块链产品需求分析与方案设计的能力具有计算机软件需求文档和设计文档撰写的能力具有区块链应用开发环境搭建与系统配置的能力具有区块链应用设计与开发的能力具有计算机软件前端与后端代码编写和调试的能力智能合约开发岗 具有区块链应用需求分析与方案设计的能力具有计算机软件需求文档和设计文档撰写的能力具有智能合约开发环境搭建与配置的能力具有区块链智能合约设计与开发的能力具有计算机软件前端与后端代码编写和调试的能力区块链测试岗 具有测试文档撰写的能力具有区块链系统测试设计、执行与分析的能力具有计算机软件前端与后端代码编写和调试的能力区块链运维岗 具有区块链应用需求分析与方案设计的能力具有运维文档撰写的能力具有区块链系统部署、维护和监控的能力具有计算机软件前端与后端代码编写和调试的能力区块链运营岗 具有区块链应用需求分析与方案设计的能力具有需求文档和设计文档撰写的能力具有区块链系统部署、维护和监控的能力二、竞赛目标党的二十大提出了“强化国家战略科技力量、坚决打赢关键核心技术攻坚战”战略部署,国家“十四五”规划提出了“加快推动数字产业化”要求。区块链作为新兴数字产业,在产品溯源、数据流通、供应链管理等领域具有广泛的应用前景,在推动国家经济体系实现技术变革、重构数字产业体系中发挥了重要作用。区块链技术应用赛项围绕区块链技术在产业应用中的工作岗位技能要求而设计,赛项内容覆盖区块链产业主流的技术方向。通过大赛培养参赛选手在企业真实项目环境下进行区块链平台框架搭建、区块链产品需求分析与方案设计、区块链系统部署、区块链系统运维与监测、智能合约开发、区块链应用软件前端与后端开发、区块链系统测试及调优等方面的能力,形成良好的职业素养,全面提升学生自主解决综合问题的能力,达到“以赛促教、以赛促学、以赛促改、赛课融通、赛训结合”目的。通过赛项的设置,加强职业院校与区块链产业的衔接,引导院校与企业共同开发区块链课程和资源,促进教师开展区块链关键应用技术研究,推进区块链技术技能人才培养,实现产业链、创新链与教育链协同创新,促进产教融合和科教融汇,服务国家“网络强国、数字中国”战略。三、竞赛内容(一)选手需具备的能力区块链技术应用赛项根据《全国职业院校技能大赛执行规划(2023—2027年)》,结合高职区块链技术应用专业简介,针对区块链新兴数字产业所需的技术技能,面向区块链应用开发、智能合约开发、区块链测试、区块链运维、区块链运营等岗位,区块链应用设计与开发、区块链平台部署与运维、智能合约开发与测试、区块链应用软件开发等典型工作任务,基于企业实际项目,要求选手在规定时间内完成指定任务的区块链应用开发。赛项主要考查选手对区块链系统应用需求分析与方案设计,区块链应用及智能合约设计与开发,区块链系统测试设计、执行与分析,区块链系统部署、维护和监控,基于区块链系统的应用软件前端与后端开发等专业核心能力及职业素养,全面检验学生在区块链技术应用的工程实践能力和创新能力,展现高职区块链人才培养成果。竞赛技能要求及成绩比例见表1。表1 竞赛技能要求及成绩比例竞赛内容 技能要求 成绩比例区块链产品需求分析与方案设计 1.能完成区块链产品需求分析,会撰写需求分析文档2.能使用软件工具设计方案,会撰写区块链应用系统功能设计文档 10%区块链系统部署与运维 1.熟悉Linux操作系统运维2.熟练使用Docker容器3.熟悉常见的区块链技术架构及运行机制,能搭建和配置区块链平台及网络4.熟练使用MySQL等主流数据库,完成业务系统数据库的创建和管理5.熟练使用脚本、编程语言和日志分析工具快速定位问题6.熟悉区块链访问接口、数据格式,能快速分析区块链节点状态和系统运行状态 15%区块链系统测试 1.具备测试需求分析及测试用例设计能力2.熟练使用常见的测试工具3.能对区块链系统进行防篡改测试和签名测试4.具备全链路压力测试设计和执行能力 10%智能合约设计 1.具备编写智能合约功能需求文档的能力2.具备编写智能合约设计文档的能力 5%智能合约开发 1.熟悉Solidity基本语法2.具备智能合约编程的能力3.具备智能合约部署和调用的能力 20%智能合约测试 1.熟悉智能合约的运行机制2.具备智能合约测试的能力 5%区块链应用前端开发 1.熟悉常用前端开发技术2.具备UI设计能力3.具备页面逻辑编程能力 10%区块链应用后端开发 1.熟悉Java等后端开发语言及框架技术2.具备后端编程调用智能合约能力3.具备后端编程访问数据库能力 20%职业素养 1.具有良好的文档写作能力,代码编写规范2.具有团队合作精神和创新意识 5%(二)竞赛模块表2 竞赛模块内容模块 主要内容 比赛时长 分值模块一 区块链产品方案设计与系统运维 根据项目背景描述完成区块链产品的需求分析与方案设计,在Linux环境下完成区块链系统的部署、运维及测试 3小时 35分模块二 智能合约开发与测试 根据给定的区块链业务需求编写功能需求文档和智能合约设计文档;使用Solidity编程语言开发智能合约,设计符合需求的合约接口,完成合约功能的开发,对智能合约进行编译、部署和调用;进行智能合约测试 2.5小时 30分模块三 区块链应用系统开发 利用前端开发语言及框架完成页面逻辑设计和展示;利用Java等后端开发语言及框架,实现应用程序接口,完善区块链应用系统,调用智能合约实现链上信息的查询和结果展示 2.5小时 30分职业素养 团队分工合理、操作规范、文明竞赛 5分合计 8小时 100分1.模块一:区块链产品方案设计与系统运维(1)依据给定的项目背景,分析业务需求,编制业务流程图、活动图、类图、时序图、系统结构图、系统架构图等,编写项目概要设计说明书,完成产品原型及软件功能的设计。(2)基于给定的环境和区块链系统,完成系统部署及节点部署。使用监控工具完成对网络、节点服务的监控。根据业务需求,完成系统日志、网络参数、节点服务等系统结构的维护。(3)设计区块链系统的测试流程,调用智能合约进行单元测试、集成测试、系统测试和性能测试;根据业务需求,分析并修复给定智能合约中的安全漏洞。2.模块二:智能合约开发与测试(1)根据区块链业务需求,编写功能需求文档和智能合约设计文档。(2)使用Solidity语言进行智能合约开发,完成智能合约的部署和调用。(3)编写智能合约单元测试代码并完成智能合约的功能测试和性能测试。3.模块三:区块链应用系统开发(1)根据业务需求,使用前端开发框架完成页面设计,使用已提供的服务端接口获取业务数据,并进行部署与展示。(2)依据功能需求,使用Java等后端开发语言及常用框架进行后端代码开发,访问数据库、实现应用程序接口、调用智能合约,完善区块链应用系统,完成后端代码的部署。4.职业素养要求参赛选手文档写作科学规范,具有团队合作精神和创新意识,比赛操作严谨,代码编写规范,文明竞赛。竞赛方式(一)竞赛形式线下比赛。(二)组队方式1.竞赛以团体赛方式进行,以院校为单位参赛,每支参赛队由2名选手组成,不得跨校组队,同一学校参赛队不超过1队。参赛队可配指导教师,指导教师须为本校专兼职教师,每队限报2名指导教师,竞赛期间不允许指导教师进入赛场进行现场指导。指导教师负责参赛选手的报名、训练指导、服务和比赛期间参赛选手的日常管理。2.参赛选手须为高等职业学校专科、高等职业学校本科全日制在籍学生(以报名时的学籍信息为准)、五年制高职(四、五年级)在籍注册学生。参赛选手年龄须不超过25周岁,年龄计算的截止时间以竞赛当年规定为准。凡在往届全国职业院校技能大赛中获一等奖的选手,不能再参加同一项目同一组别的比赛。五、竞赛流程(一)竞赛日程表表3 竞赛日程表日期 时间 事项 参加人员竞赛前一天 09:00-12:00 专家、裁判、监督仲裁报到 专家组、裁判组、监督仲裁组成员09:00-12:00 参赛队报到 各参赛队领队、选手、指导老师13:00-14:00 赛前工作会议 赛项执委会成员、专家组、裁判组、监督仲裁组14:00-15:00 裁判培训会议 专家组、裁判组15:00-16:00 开赛式及领队会议 赛项执委会成员、专家组长、裁判长、参赛队领队、选手、指导老师16:00-17:00 参赛队熟悉赛场 各参赛队选手、指导老师17:00-18:00 检查封闭赛场 裁判长、监督仲裁组长、工作人员竞赛日 07:00-07:30 参赛队检录 各参赛队选手、工作人员07:30-08:00 参赛队两次加密 各参赛队选手、加密裁判08:00-08:30 参赛队进入赛场赛前设备检查 各参赛队选手、现场裁判08:30-11:30 模块一比赛 各参赛队选手、现场裁判11:30-12:00 模块一结果提交及环境设置 各参赛队选手、现场裁判12:00-14:30 模块二比赛 各参赛队选手、现场裁判14:30-15:00 模块二结果提交及环境设置 各参赛队选手、现场裁判15:00-17:30 模块三比赛 各参赛队选手、现场裁判12:00-14:30 模块一成绩评定 评分裁判15:00-17:30 模块二成绩评定 评分裁判17:30-19:30 模块三成绩评定 评分裁判17:30-19:30 申诉受理 监督仲裁19:30-21:30 成绩核定及公示 裁判长、评分裁判、监督仲裁竞赛后一天 09:00-11:00 闭赛式(裁判长点评、宣布成绩及颁奖) 赛项执委会成员、专家组长、裁判长、参赛队领队、选手、指导老师(二)竞赛流程图六、竞赛规则1.大赛以省、自治区、直辖市、计划单列市、新疆生产建设兵团为单位组织报名参赛,各省市教育行政部门按照大赛执委会确定的报名时间和名额,通过全国职业院校技能大赛网络报名系统组织完成本省市的参赛报名工作。2.参赛队可于正式比赛1天前,由主办方统一组织熟悉场地。比赛赛位通过抽签决定,参赛选手在赛前10分钟领取比赛任务,并进入比赛赛位,比赛正式开始后方可进行相关操作。比赛期间参赛选手原则上不得离开比赛场地。选手分工、工作程序和时间安排由参赛队自行决定。4.竞赛所需的硬件、软件和辅助工具统一提供,参赛队不得使用自带的任何具有存储和通信功能的设备。5.竞赛过程中,选手须严格遵守操作规程,确保人身及设备安全,并接受裁判员的监督和警示。选手如有疑问,应举手示意,现场裁判应按要求及时予以答疑。如遇设备或软件故障,参赛选手应举手示意,现场裁判、技术人员等应及时予以解决。若因非参赛选手个人因素造成设备或软件故障,由裁判长视具体情况做出裁决。若因选手因素造成设备故障或损坏,无法继续竞赛,裁判长有权决定终止该队竞赛。6.竞赛结束后,参赛队要确认已成功提交所有竞赛文档,裁判员与参赛队队长一起签字确认,参赛队在确认后不得再进行任何操作。7.最终竞赛成绩经复核无误及裁判长、监督仲裁长签字确认后,在指定地点,以纸质形式向全体参赛队进行公布,并在闭赛式上予以宣布。8.本赛项各参赛队最终成绩由承办单位信息员录入赛务管理系统。承办单位信息员对成绩数据审核后,将赛务管理系统中录入的成绩导出打印,经赛项裁判长审核无误后签字。承办单位信息员将裁判长确认的电子版赛项成绩信息上传赛务管理系统,同时将裁判长签字的纸质打印成绩单报送大赛执委会。9.赛项结束后专家工作组根据裁判判分情况,分析参赛选手在比赛过程中对各个知识点、技术的掌握程度,并将分析报告报备大赛执委会办公室,执委会办公室根据实际情况适时公布。10.赛项每个比赛环节的裁判判分原始材料和最终成绩等结果性材料经监督仲裁组人员和裁判长签字后装袋密封留档,并由赛项承办院校封存,委派专人妥善保管。七、技术规范按照《全国职业院校技能大赛赛项规程编制要求》,结合企业职业岗位对人才培养需求,并参照相关国家职业标准制定。参赛代表队在实施竞赛项目中要求遵循的规范见表4。表4 竞赛模块内容序号 标准号 内容1 GB/T 11457-2006 信息技术、软件工程术语2 LD/T81.1-2006 职业技能实训和鉴定设备技术规范3 GB/T 25069-2010 信息安全技术 术语4 ISO 22739-2020 Blockchain and distributed ledger technologies — Vocabulary(区块链和分布式账本技术 词汇)5 GBZ2-02-10-15 区块链工程技术人员国家职业技术技能标准6 GBZ4-04-05-06 区块链应用操作员国家职业技术技能标准7 CBD-Forum-001-2017 区块链参考架构8 CBD-Forum-002-2017 区块链数据格式规范9 T/SIA 007-2018 区块链平台基础技术要求10 CIET-2018-04 区块链技术人才培养标准八、技术环境(一)竞赛环境1.竞赛场地:竞赛场地分为竞赛现场、裁判员休息区、指导老师休息区,竞赛现场设置竞赛区、现场裁判工作区和技术支持区,以上区域应保证采光、照明和通风良好。竞赛现场配置无盲点录像设备,实时录制和显示赛场内竞赛情况。2.竞赛设备:场内竞赛区按照参赛队数量准备比赛所需的软硬件平台,为参赛队提供统一竞赛设备和备用设备,选手无需自带任何工具及材料。3.竞赛工位:竞赛现场每个参赛队工作区间面积合理,确保参赛队之间互不干扰,每个参赛队工作区上标明编号,各参赛队工作区配备独立电源。4.技术支持区:为技术支持人员提供固定工位、电源保障。技术支持保障人员在技术支持服务区候场,有需要时在现场裁判的带领下到相关的工位进行赛场技术支持保障。5.竞赛现场符合消防安全规定,现场消防器材和消防栓合格有效,应急照明设施状态合格,赛场明显张贴紧急疏散图,赛场地面张贴疏散指示箭头,赛场出入口专人负责,随时保证安全通道的畅通无阻。(二)竞赛设备表5 硬件设备设备名称 备注服务器 高性能工作站处理器i7/64G内存/固态硬盘1T及以上、USB3.0接口、千兆及以上网卡交换机 二、三层可控交换机(千兆、带电源)PC 通用台式机处理器i5/32G内存/固态硬盘512G及以上、USB3.0接口、千兆及以上网卡表6 服务端软件序号 软件 备注1 区块链平台 国产主流的区块链平台及其管理工具表7 PC工具软件序号 名称 版本 用途1 WPS Version 2019及以上 编制文档2 Putty Version 0.7 远程工具3 WinSCP Version 5.15及以上 文件传输4 Chrome Version 100及以上 浏览器5 Java JDK Version 11及以上 Java开发6 Visual Studio Code Version 1.75及以上 开发工具7 ItelliJ IDEA Version CE 2023 开发工具8 Gradle Version 6及以上 构建工具9 Maven Version 3.6及以上 构建工具10 Office Visio Version 2013及以上 绘图工具11 竞赛管理平台 Version 1.0及以上 竞赛管理九、竞赛样题专家组按照《全国职业院校技能大赛题库编制说明》《全国职业院校技能大赛赛项题库建设规范》中有关规定,科学合理编制赛卷库,经大赛执委会审核同意后公开。竞赛赛题由公开题和应变题组成,公开题分值不低于70%。赛前由裁判长指定相关人员从赛卷库中抽取其中一套,并由专家组在抽取的赛卷上完善不超过30%分值的应变题作为正式赛卷。公开题于赛前(1个月)予以公开,应变题用于考查参赛选手的临场发挥能力,赛前不予公开。赛项比赛结束后,正式赛卷(包括评分标准)经大赛执委会审核同意后公开。(一)背景描述图1 区块链航班延误险系统业务流程2022年8月,XXX保险公司正在使用区块链为航空旅客提供自动航班延迟赔偿。保险公司将区块链用于记录保险产品购买以及通过使用区块链上的智能合约来触发自动支付。该智能合约与记录飞行状态的飞行和空中交通数据库相连。当航班延误超过规定时间,赔偿机制将会自动执行,自动赔付到投保人的信用卡账户中,无需申领即可获得。这种涵盖航班延误的保险,保险条款清晰,报销程序自动,客户不必亲自去保险公司索赔,也不需要出示任何文件。业务过程所有需要的信息已经在保险订阅期间进行记录。现在要求使用区块链技术实现航班延误险系统,将乘机人、航空公司、保险公司加入到区块链网络中,同时将购买记录、航班、保险、保单等信息存储在区块链的分布式网络中,达到永久有效和无法篡改的目的。区块链航班延误险系统业务流程如图1所示,在机票延误险场景中,乘机人购买机票之后在系统上预存10元保费,保险公司再系统上预存相应的赔偿金1000元。如果保险公司没有按时预存赔偿金,系统会直接将保费退还给用户。如果保险公司预存了赔偿金,若航班没有延误或延误时间少于4小时,系统会将乘机人预存的保费转账给保险公司,同时退还保险公司预存的赔偿金;如果航班延误超过4小时,系统会将保费转账给保险公司,但同时会将保险公司预存的赔偿金赔偿给乘机人。图2展示了区块链航班延误险系统的架构。图2 区块链航班延误险系统架构(二)任务要求模块一:区块链产品方案设计及系统运维(35分)任务1-1:区块链产品需求分析与方案设计依据给定的区块链航班延误险系统的业务流程图以及用例表,编制系统业务用例图,用例图中要求包含系统参与角色以及用例。……任务1-2:区块链系统部署与运维部署区块链网络底层环境,按要求准备编译运行的环境,并通过区块链底层源码脚本文件编译区块链网络。……模块二:智能合约开发与测试(30分)任务2-1:智能合约设计根据航班延误险系统需求用例文档,设计合约接口,绘制各需求用例的时序图。任务2-2:智能合约开发使用Solidity语言进行智能合约开发,要求如下:根据需求用例文档在待补充的源码中完成程序接口功能的编码。解决代码错误和警告,正确编译合约,完成功能调试。运行合约进行业务功能验证,获取合约的ABI,将合约部署至Geth中的私有链,并获取部署的合约信息,子任务2-2-1:航班延误保险购买合约编码根据需求用例文档在待补充的源码中完成航班延误购买合约的编码,要求解决代码错误和警告,正确编译合约,完成功能调试,正确执行合约中的保险购买和退保功能。编写航班保险购买上链接口,实现以下功能:仅限购买了机票、购买保险的时间不晚于购买机票后半小时,且保费金额缴纳正确的用户才能成功购买保险。对于成功购买保险的用户,需将用户购买保险状态上链。……模块三:区块链应用系统开发(30分)任务3-1:区块链应用前端开发按要求编写前端代码调用航班管理接口,将获取的航班号、计划起飞时间、实际起飞时间、到达时间、是否延误等信息传递给前端模板。要求按照航班管理原型图的长度、宽度、行高、间距、文字样式、颜色等规格,完成航班信息管理页面的开发。……任务3-2:区块链应用后端开发使用Java语言编写后端代码进行交互,获取区块链的最新高度和最新交易Hash。……十、赛项安全1.赛前组织专人对比赛现场、住宿场所和交通保障进行考察,并对安全工作提出明确要求。赛场的布置,赛场内的器材、设备,应符合国家有关安全规定。承办院校赛前须按照赛项执委会要求排除安全隐患。2.赛场周围要设立警戒线,防止无关人员进入,发生意外事件。在具有危险性的操作环节,裁判员要严防选手出现错误操作。3.制定开放赛场和体验区的人员疏导方案。赛场环境中如存在人员密集、车流与人流交错的区域,除了设置齐全的指示标志外,须增加引导人员,并开辟备用通道。4.大赛期间,承办院校须在赛场设置医疗医护工作站。在管理的关键岗位,增加力量,建立安全管理日志。5.参赛选手、赛项裁判、工作人员严禁携带通讯、摄录设备和未经许可的记录用具进入比赛区域;如确有需要,由赛项承办单位统一配置,统一管理。赛项可根据需要配置安检设备,对进入赛场重要区域的人员进行安检,可在赛场相关区域安放无线屏蔽设备。6.比赛期间发生意外事故时,发现者应在第一时间报告赛项执委会,同时采取措施,避免事态扩大。赛项执委会应立即启动预案予以解决并向赛区执委会报告。出现重大安全问题的赛项可以停赛,是否停赛由赛区组委会决定。事后,赛区执委会应向大赛执委会报告详细情况。十一、成绩评定(一)评分原则1.竞赛评分严格遵守公开、公平、公正、独立、透明的原则,区块链技术应用赛项评分采用赛项结果评分方法,赛项最终得分按百分制计算,贯彻落实大赛坚持的公平、公正和公开原则。2.赛项合作企业不得直接或者间接地参与赛项评分。3.赛项评分依据选手固化在实操任务中的成果,通过评分裁判对比赛成果再现的方法评分,并兼顾团队协作精神和职业素养综合评定。4.为了确保赛事评判的客观性,制定详细的评分标准,细化评分项目,尽可能量化每一评分项目的评分标准,减少主观判断比例,确保赛事客观公正。5.评分过程全程可追溯。(二)评分标准表8 评分标准赛项模块 竞赛内容 考核的知识点、技能点 相应得分点 分值模块一区块链产品方案设计与系统运维 区块链产品需求分析与方案设计 依据给定的项目背景,分析业务需求,编制业务流程图、活动图、类图、时序图、系统结构图、系统架构图等,编写项目概要设计说明书,完成产品原型及软件功能的设计 1.掌握区块链系统基本设计概念,合理划分角色及业务功能2.文档编制规范,各模型图绘制正确3.模块及功能划分完整、合理4.正确撰写应用系统功能设计文档 10区块链系统部署与运维 基于给定的环境和区块链系统,完成区块链系统部署及节点部署。通过监控工具完成对网络、节点服务的监控。根据业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护 1.按要求正确部署区块链网络,并能验证运行状态2.正确安装管理工具及监控工具3.正确完成业务系统数据库的创建和管理4.搭建的区块链符合业务需求,按要求进行扩容和网络配置等维护操作 15区块链系统测试 设计区块链系统的测试流程,调用智能合约进行单元测试、集成测试、系统测试和性能测试;根据业务需求,分析并修复给定智能合约中的安全漏洞 1.对测试需求分析正确,合理设计测试用例2.正确对区块链系统进行防篡改测试、签名测试等3.正确使用测试工具修复合约中的漏洞4.正确对已部署的智能合约进行性能测试、系统测试和执行分析 10模块二智能合约开发与测试 智能合约设计 根据区块链业务需求,编写功能需求文档和智能合约设计文档 1.合约模块划分合理2.合约能完整描述业务对象,正确表达业务对象、实体等之间的关系3.正确编写智能合约设计文档 5智能合约开发 使用Solidity语言进行智能合约开发,完成智能合约部署和调用 1.合约编写功能覆盖全面、逻辑正确2.正确部署和调用合约 20智能合约测试 编写智能合约单元测试代码并完成合约功能测试、性能测试 1.对已有合约正确构建单元测试2.正常使用工具完成合约功能及性能测试 5模块三区块链应用系统开发 区块链应用前端开发 根据业务需求,使用前端开发框架完成页面设计,使用已提供的服务端接口获取业务数据,并进行部署展示 1.正确编写前端代码,完成服务端接口调用2.正确完成前端数据展示及页面逻辑 10区块链应用后端开发 依据功能需求,使用Java等后端开发语言及常用框架进行后端代码开发,访问数据库、实现应用程序接口、调用智能合约,完善区块链应用系统,完成后端代码的部署 1.正确使用后端开发语言和框架,完成数据库调用等功能,实现应用程序接口2.正确编写后端接口程序,调用智能合约,实现链上信息的查询和结果展示3.正确编写后端接口程序,进行区块链应用操作4.正确部署后端程序 20职业素养 文档写作科学规范,具有团队合作精神和创新意识,比赛操作严谨,代码编写规范,文明竞赛 1.分工合理2.操作规范3.文明竞赛 5(三)评分方式1.参与赛项成绩管理的组织机构包括裁判组、仲裁组和监督组,裁判组实行“裁判长负责制”,设裁判长1名,全面负责赛项的裁判与管理工作,裁判组包含评分裁判、加密裁判和现场裁判。2.评分裁判负责对参赛队的竞赛成果按赛项评分标准进行评定。在比赛进行的过程中评分裁判不到比赛现场,参赛选手退出赛场后,评分裁判进入现场对各工位进行评分。3.赛项采取两次加密原则,加密裁判负责对参赛选手抽签进行加密并且保密,不得将任何信息透露给其他人员,否则按照相关规定予以处理。4.现场裁判负责对整个赛场进行巡查和监督,必须严格按照现场裁判要求做好相应工作。5.监督组对裁判组的工作进行全程监督,并对竞赛成绩抽检复核。仲裁组负责接受由参赛队领队提出的书面申诉,组织复议并及时反馈复议结果。6.赛项成绩解密后,经裁判长、监督组签字后,在赛项执委会指定的地点,以纸质形式向全体参赛队进行公布。成绩公布2小时无异议后,将赛项总成绩的最终结果录入赛务管理系统。十二、奖项设置本赛项设参赛选手团体一、二、三等奖。奖项设定以赛项实际参赛队总数为基数,一、二、三等奖获奖比例分别为10%、20%、30%(小数点后四舍五入)。获得一等奖的参赛队指导教师获“优秀指导教师奖”。奖项获得根据参赛队最终成绩由高到低进行排序,如出现参赛队最终成绩并列的情况,按照模块一、二、三顺序的得分高低排序,即总成绩相同的情况下比较模块一的成绩,模块一成绩高的排名优先,如果模块一成绩也相同,则按模块二的成绩进行排名,以此类推完成相同成绩的排序。十三、赛项预案(一)竞赛环境突发应急预案1.赛场备用工位:赛场提供占总参赛队伍10%的备用工位。2.竞赛系统可靠性:竞赛系统使用的服务器应进行冗余,数据库、存储应使用高可用架构。3.服务器资源问题:若服务器在比赛过程中出现卡顿、死机等情况,在现场裁判与技术人员确定情况后,可更换服务器资源。4.PC机问题:若PC机在比赛过程中出现死机、蓝屏等现象(重启后无法解决),在现场裁判与技术人员确定情况后,可启用备用工位或更换PC机。(二)参赛选手突发情况应急预案竞赛期间,承办校须安排2名医生现场值班,安排好车辆随时待命,一旦参赛选手出现发病、受伤、意外伤害或者食品安全事故,需及时对选手进行现场救治或送医治疗。(三)停水停电及火情突发应急预案1.承办校后勤部门须保证竞赛期间供电、供水正常遇停电及时启用自备电源(或租赁发电机)供电,保证竞赛设备用电正常。2.发现火情时立即根据火情状况,决定是否组织人员疏散,是否切断电源和光源,以及是否需要报警。(四)治安事件突发应急预案规范赛场秩序,加强法制和安全教育,对发现有情绪异常、行为过激的选手,及时与参赛队领队沟通联系,做好劝导和化解工作。十四、竞赛须知(一)参赛队须知1.参赛队名称需统一使用规定的学校代表队名称,不使用其他组织、团体的名称。2.各参赛院校应指定1名负责人任赛项领队,全权负责参赛事务的组织、协调和领导工作。3.参赛队按照赛项赛程安排,凭参赛证、身份证或护照、学生证参加比赛及相关活动。4.主办方统一安排各参赛队在比赛前一天进入赛场熟悉环境和设施情况。5.参赛队选手、领队和指导教师要有良好的职业道德,严格遵守比赛规则和比赛纪律,服从裁判,尊重裁判和赛场工作人员,自觉维护赛场秩序。6.领队应负责赛事活动期间本队所有选手的人身及财产安全,如发现意外事故,应及时向赛项执委会报告。7.各学校组织代表队时,应为参赛选手购买大赛期间的人身意外伤害保险。(二)领队、指导教师须知1.严格遵守赛场的各项规定,服从裁判,文明竞赛。如发现弄虚作假者,取消参赛资格,名次无效。2.领队和指导教师务必带好有效身份证件,在活动过程中佩戴“领队证”“指导教师证”参加竞赛相关活动。3.领队要严格遵守竞赛的各项规定,加强对参赛人员的管理,做好赛前准备工作,督促选手带好证件等竞赛相关材料。4.在比赛期间要严格遵守比赛规则,不得私自接触裁判人员。5.竞赛过程中,未经裁判许可,领队、指导教师及其他人员一律不得进入竞赛现场。6.如对竞赛过程有疑议,由领队负责以书面形式向大赛仲裁组反映,但不得影响竞赛进行。7.对申诉的仲裁结果,领队要带头服从和执行,并做好选手工作。参赛选手不得因申诉或对处理意见不服而停止竞赛,否则以弃权处理。8.领队和指导老师应及时查看有关赛项的通知和内容,认真研究和掌握本赛项竞赛的规程、技术规范和赛场要求,指导选手做好赛前的一切技术准备和竞赛准备。(三)参赛选手须知1.参赛选手应严格遵守赛场规章、操作规程和工艺准则,保证人身及设备安全,接受裁判员的监督和警示,文明竞赛。2.选手应按照规定时间抵达赛场,凭统一发放的参赛证、身份证或护照、学生证完成入场检录、抽签确定竞赛工位号,不得迟到早退。3.参赛选手进入赛场前,须将身份证、学生证交由检录人员统一保管,不得带入场内。参赛证始终佩戴,以备检查。4.参赛选手凭竞赛工位号进入赛场,不允许携带任何书籍和其他纸质资料,竞赛统一提供草稿纸。不允许携带任何电子设备及通信工具和存储设备(如U盘),竞赛统一提供计算机以及应用软件。5.参赛选手应在规定的时间段进入赛场,认真核对竞赛工位号,在指定位置就座。入场后,赛场工作人员与参赛选手共同确认操作条件及设备状况,填写相关确认文件,并由参赛队长确认签字(签竞赛工位号)。6.参赛选手在收到开赛信息前不得启动操作。在竞赛过程中,确因计算机软件或硬件故障,致使操作无法继续的,经裁判长确认,予以启用备用计算机。7.参赛选手应在竞赛规定的时间完成任务书内容,并按要求提交成果物。8.参赛选手需及时保存工作记录。对于因自身原因造成的数据丢失,由参赛选手自行负责。9.参赛队所提交的答卷采用竞赛工位号进行标识,不得出现地名、校名、姓名、参赛证编号等信息,否则取消竞赛成绩。10.竞赛过程中,因严重操作失误或安全事故不能进行比赛的,现场裁判员有权中止该队比赛。11.参赛期间,食品、饮水等由赛场统一提供,选手休息和如厕时间均计算在比赛时间内。12.在参赛期间,选手应注意保持工作环境及设备摆放符合企业生产“5S”(即整理、整顿、清扫、清洁和素养)要求。13.在比赛中如遇非人为因素造成的设备故障,经裁判确认后,可向裁判长申请补足排除故障的时间。14.参赛选手原则上不得提前结束比赛。如确因不可抗因素需要提前结束比赛的,须向现场裁判员举手示意,经裁判长许可并完成记录后,方可离开。15.竞赛时间结束,全体选手应立刻起立,结束操作,将资料和工具整齐摆放在操作平台上,将竞赛成果物按照赛题指定的方式提交,并由现场裁判和参赛队长共同签字确认后方可离开赛场,离开赛场时不得带走任何资料。16.参赛选手未能按时提交竞赛成果物的,竞赛成绩计为零分。17.在竞赛期间,未经赛项组委会批准,参赛选手不得接受其他单位和个人进行的与竞赛内容相关的采访。参赛选手不得将竞赛的相关信息私自公布。18.符合下列情形之一的参赛选手,经裁判组裁定后终止其竞赛:(1)不服从裁判员管理、扰乱赛场秩序、干扰其他参赛选手比赛,裁判员应对其提出警告。二次警告后无效,或情节特别严重造成竞赛中止的,经裁判长确认,终止其比赛,并取消竞赛资格和竞赛成绩。(2)竞赛过程中,如选手人为造成计算机、仪器设备及工具等严重损坏,负责赔偿其损失,裁判长有权裁定其结束竞赛、取消竞赛成绩或取消竞赛资格。(3)竞赛过程中,造成重大安全事故,或产生重大安全事故隐患,经裁判员提示没有采取措施的,裁判员可暂停其竞赛,由裁判长裁定其结束竞赛、取消竞赛成绩或取消竞赛资格。(四)工作人员须知1.树立服务观念,注意文明礼貌,全程佩带证件,保持良好形象。2.认真学习赛项指南,以高度负责的精神、严肃认真的态度和严谨细致的作风,认真履行岗位职责。3.在赛项执委会的领导下,服从调配和分工,确保比赛工作的顺利进行。4.自觉遵守赛项纪律和规则,保守秘密。5.严守工作岗位,按时到岗,不无故离岗,特殊情况需向赛项执委会请假。6.熟悉应急预案,如遇突发事件,及时组织疏散,确保人员安全。7.工作人员在比赛中若有舞弊行为,立即撤销其工作资格,并按规定严肃处理。8.保持沟通,加强协作,提高工作效率。十五、申诉与仲裁1.各参赛队对不符合大赛和赛项规程规定的仪器、设备、工装、材料、物件、计算机软硬件、竞赛使用工具、用品,竞赛执裁、赛场管理,以及工作人员的不规范行为等持有异议时,由各参赛队领队向赛项监督仲裁工作组提出书面申诉。2.监督仲裁人员的姓名、联系方式、工作地点应该在竞赛期间向参赛队和工作人员公示,确保信息畅通并同时接受大众监督。3.赛项监督仲裁组只接受各省、自治区、直辖市、计划单列市、新疆生产建设兵团领队签字、递交的仅限于本队的书面申诉报告。4.提出申诉的时间应在比赛结束后(选手赛场比赛内容全部完成)2小时内,超过时效不予受理。申诉报告应对申诉事件的现象、发生时间、涉及人员、申诉依据等进行充分、实事求是的叙述。5.赛项监督仲裁工作组在接到申诉报告后的2小时内组织复议,并及时将复议结果以书面形式告知申诉方。申诉方对复议结果仍有异议,可由省、自治区、直辖市、计划单列市、新疆生产建设兵团领队或参赛队领队向赛区仲裁委员会提出申诉。赛区仲裁委员会的仲裁结果为最终结果。6.仲裁结果由申诉人签收,不能代收。如在约定时间和地点申诉人离开,视为自行放弃申诉。7.申诉方可随时提出放弃申诉。8.申诉方必须提供真实的申诉信息并严格遵守申诉程序,提出无理申诉或采取过激行为扰乱赛场秩序的,应给予取消参赛成绩等处罚。十六、竞赛观摩(一)观摩形式1.现场观摩。赛场内设置现场观摩区域,由竞赛工作人员带领现场观摩人员进入现场观摩区,按照指定路线进行观摩。2.直播观摩。赛场外设置直播观摩区域,向媒体、企业代表、院校师生等社会公众开放,通过大屏幕对竞赛现场进行直播。(二)观摩时间1.现场观摩时间为竞赛开始一小时之后、结束一小时之前。2.直播观摩时间为竞赛正式开始到竞赛结束全过程。(三)纪律要求1.现场观摩人员需由赛项执委会批准,佩戴观摩证件在工作人员带领下沿指定路线、在指定区域内到现场观赛。2.现场观摩人员不得同参赛选手、裁判交流,不得传递信息,不得采录竞赛现场数据资料,不得影响比赛的正常进行。3.文明观摩,不得大声喧哗,服从赛场工作人员的指挥,杜绝各种违反赛场秩序的不文明行为。对于各种违反赛场秩序的不文明行为,工作人员有权予以提醒和制止。十七、竞赛直播(一)直播形式1.对赛项赛场准备、开赛式和闭赛式、竞赛期间进行录像。2.从选手进入赛场开始,除抽签加密外,全程进行比赛的实时录像,并同步大屏直播。(二)直播方法1.赛场内部署无盲点录像设备,能实时录制并播送赛场情况。2.赛场外配有大屏,同步直播赛场内竞赛状况,供赛场外的人员观看。十八、赛项成果全国职业院校技能大赛区块链技术应用赛项资源转化工作由赛项执委会负责。赛项资源转化成果对接区块链产业发展、符合行业标准,契合生产或工作过程,突出技能特色,展现竞赛优势,形成满足职业教育教学需求、体现先进教学模式、反映职业教育先进水平的共享性资源成果,具体成果清单参见表9。表9 竞赛成果清单资源名称 表现形式 资源数量 资源要求 完成时间基本资源 风采展示 赛项宣传片 视频 1 15分钟以上 比赛结束后30天内风采展示片 视频 1 10分钟以上 比赛结束后30天内技能概要 技能介绍 文本文档 1 电子文档 比赛结束后60天内技能要点 文本文档 1 电子文档 比赛结束后60天内评价指标 文本文档 1 电子文档 比赛结束后60天内教学资源 专业教材 文本文档 1 电子教材 比赛结束后90天内技能训练指导书 文本文档 1 电子教材 比赛结束后90天内技能操作规程 文本文档 1 电子教材 比赛结束后90天内拓展资源 案例库 代码 5 赛题案例 比赛结束后90天内赛题库 文本文档 10 电子文档 比赛结束后90天内优秀选手访谈 视频 1 15分钟以上 比赛结束后90天内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.功能描述标识符 login功能 用户登录接口2. 接口功能请求路由 /login请求方法请求参数参数名 类型 说明响应参数参数名 类型 说明2.4.2.2用户注册1. 功能描述标识符 register功能 用户注册接口2. 接口功能请求路由 /register请求方法请求参数参数名 类型 说明响应参数参数名 类型 说明3.系统出错处理设计3.1出错信息服务器端可能有Java的异常产生,可用Java中的异常处理方法try…catch处理 ,并记录日志,以备事后分析查找原因。3.2补救措施采用双服务器热备份的方法,一旦服务器崩溃,立即切换到另一台服务器运行。3.3系统维护设计保留本系统的一系列文档,加适当注释,以备维护者维护。每次修改/维护,都做记录。2023年全国职业院校技能大赛高职组“区块链技术应用”赛项赛卷(2卷)任务书参赛队编号:背景描述在供应链金融这个万亿级市场中,区块链正在快速商业化落地,助力产业革新。基于区块链的供应链金融业务的理念是:以源自企业的应收账款为底层资产,通过区块链技术实现债券凭证的转让拆分。其中,在原始资产上链时,通过对应收账款进行审核校验,确认贸易关系和身份真实有效,和保证上链资产的真实可信。再者,债权凭证可基于供应链进行层层拆分与流转,都可完整追溯到最底层资产,以实现核心企业和金融机构对供应商的“信用穿透”。某公司规划开发一个区块链供应链金融平台,包括核心企业、供应商、银行等角色,通过智能合约代码逐步构建区块链供应链金融平台的基本功能,实现银行向核心企业提供授信并发行数字凭证,企业与企业之间转让数字凭证。此外需要完成区块链供应链金融平台的前后端,实现基本的业务逻辑。模块一:区块链产品方案设计及系统运维(35分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块一提交结果.docx】中对应的任务序号下。任务1-1:区块链产品需求分析与方案设计(10分)本环节需要依据项目背景完成需求分析与方案设计,具体要求如下:1.依据给定供应链金融管理系统的业务架构图,对考题进行业务分析,尽可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和处理流程,要求分为区块链供应链业务平台和支撑平台两个部分;(4分)2.根据供应链系统设计,在系统中分别包括用户和凭证票据管理功能,在融资凭证上链过程中需要包括银行、核心企业、供应商公司的基本管理功能。根据描述,设计区块链系统的总体功能概览图。(3分)3.整合上述设计内容,完善“供应链金融管理系统概要设计说明书.doc”,具体工作内容如下:将设计内容根据说明书中模块需求进行补充,并完善概要设计说明书中的“需求概要”(1分)完善说明书中接口说明部分内容。(2分)任务1-2:区块链系统部署与运维(15分)围绕供应链金融区块链平台部署与运维需求,进行项目相关系统、节点以及管理工具的部署工作。通过通过监控工具完成对网络、节点服务的监控。最终利用业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护。1. 根据参数与端口设置要求,部署区块链系统并验证;2. 根据参数与端口设置要求,部署区块链网络管理平台并验证;3. 基于区块链系统相关管理平台,按照任务指南实施系统运维工作并验证。4. 基于区块链系统相关监管工具,按照任务指南对区块链系统进行监管。子任务1-2-1: 搭建区块链系统并验证(4分)基于给定服务器环境以及软件(地址“/root/tools”),使用Docker以默认配置安装单机4节点的区块链系统,并完成控制台工具的部署:完成系统搭建配置与启动。(1分)使用基于Docker命令查看区块链系统状态。(1分)检查区块链系统节点node0连接状态输出。(1分)配置控制台,管理相关证书并启动。(1分)子任务1-2-2:区块链管理平台部署与验证(4分)基于给定服务器环境以及软件(地址“/root/tools”),按要求部署区块链管理平台,具体工作如下:配置Mysql数据库(1分)配置管理平台连接区块链系统(1分)使用命令启动管理平台服务(1分)验证管理平台启动情况(1分)子任务1-2-3:区块链系统节点运维(3分)基于已完成的区块链系统与管理平台搭建工作,开展相关节点运维工作:生成新节点(node4),启动并检查(1分)修改新节点配置,并查看节点的nodeid(1分)将新节点作为观察节点加入group1当中,并检查是否加入成功(1分)子任务1-2-4:区块链系统管理平台运维(4分)基于已部署的区块链系统管理平台,进行系统相关运维工作:基于管理平台功能页面,添加新主机(2分)基于管理平台功能页面,修改新节点(node4)节点状态,并监控。(2分)任务1-3:区块链系统测试(10分)设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约中进行系统测试、性能测试等;根据业务需求,分析并且修复给定智能合约中的安全漏洞。利用模拟业务和测试工具来完成对区块链系统服务数据的测试。1.基于WeBASE的部署脚本完成WeBASE环境搭建以及搭建结果验证,最后将执行结果截图保存。(3分)实现WeBASE平台部署。(1分)实现webase.sgin功能启动情况验证。(1分)webase-node-mgr进程启动情况验证和浏览器验证。(1分)2.智能合约安全漏洞测试。(7分)有如下智能合约:pragma solidity ^0.7.6;contract TimeLock {mapping(address => uint) public balances;mapping(address => uint) public lockTime;function deposit() external payable {balances[msg.sender] += msg.value;lockTime[msg.sender] = block.timestamp + 1 weeks;}function increaseLockTime(uint _secondsToIncrease) public {lockTime[msg.sender] += _secondsToIncrease;}function withdraw() public {require(balances[msg.sender] > 0, "Insufficient funds");require(block.timestamp > lockTime[msg.sender], "Lock time not expired");uint amount = balances[msg.sender];balances[msg.sender] = 0;(bool sent, ) = msg.sender.call{value: amount}("");require(sent, "Failed to send Ether");}}contract Attack {TimeLock timeLock;constructor(TimeLock _timeLock) {timeLock = TimeLock(_timeLock);}fallback() external payable {}function attack() public payable {timeLock.deposit{value: msg.value}();timeLock.increaseLockTime(type(uint).max + 1 - timeLock.lockTime(address(this)));timeLock.withdraw();}}如上代码主要实现功能为规定了转账冻结时间,在冻结时间内用户不能提取存款的金额。分析智能合约中存在问题,并说明危害。(2分)根据truffle工具中的代码文件,编写测试用例,复现智能合约中存在的漏洞。(3分)创建新的智能合约,修复其中问题,说明修复内容并测试。(2分)模块二:智能合约开发与测试(30分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块二提交结果.docx】中对应的任务序号下。任务2-1:智能合约设计(5分)根据区块链供应链金融应用需求分析和方案设计文档的描述,编写该区块链产品的智能合约功能需求文档,以及设计该智能合约UML图,具体要求如下:1.编写区块链供应链金融智能合约功能需求文档(2分)根据区块链供应链金融产品项目背景和需求分析,编写该区块链供应链金融产品的智能合约功能需求文档;2.完成区块链供应链金融智能合约的设计图(3分)设计区块链供应链金融智能合约接口,画出区块链供应链金融智能合约的角色UML用例图,以及画出区块链供应链金融各角色智能合约关系的时序图。任务2-2:智能合约开发(20分)使用Solidity语言完成智能合约开发、部署和调用,要求如下:1.供应链金融实体信息编码(6分)(1)编写供应链金融智能合约的实体接口,完成实体通用数据的初始化,实现企业和票据实体信息上链的功能;(2分)表2.2.2.1 SupplyChain实体说明名称 类型 说明companyName string 公司名称companyAddress address 公司地址creditAsset uint 信用资产acceptReceiptIndex uint[] 接收的凭证sendReceiptIndex uint[] 发送的凭证senderAddress address 发送票据的地址accepterAddress address 接收票据的地址receiptType uint8 凭证类型transferType uint8 交易类型amount uint 交易数量//公司信息结构体struct Company {//①公司名称//②公司地址//③信用资产//④接收的凭证//⑤发送的凭证}//数字发票收据信息struct Receipt {//⑥发送票据的地址//⑦接收票据的地址//⑧凭证类型//⑨交易类型//⑩交易数量}(2)编写企业上链信息接口,实现供应链金融的企业信息上链;(2分)function addCompany(string name, address companyAddress) returns(bool) {//①实例化公司//②添加公司地址//③将实例化的公司添加到公司映射//④返回添加成功标识}(3)基于给定的智能合约代码以及注释,完成银行向企业交易的接口函数;(2分)function bankToCompanyReceipt(address senderAddress, address accepterAddress, uint amount, uint8 receiptType) returns(uint) {①判断接收地址存在②实例化银行③实例化公司if (keccak256(bank.bankName) == keccak256("")) {return 404001;}//确认公司存在if (keccak256(company.companyName) == ④) {return 404002;}if (bank.creditAsset < amount) {return 500001;}2.供应链金融公司与公司接口编码(6分)(1)编写公司与公司之间进行交易的历史存证上链接口,实现公司与公司之间的交易功能;(2分)function companyToCompanyReceipt(①, address accepterAddress, uint amount, uint8 receiptType) returns(uint) {//②接收地址判断Company memory senderCompany = companyMap[③];Company memory ④ = companyMap[accepterAddress];//确认发送公司存在if (keccak256(senderCompany.⑤) == keccak256("")) {return 404001;}//确认接收公司存在if (keccak256(accepterCompany.companyName) == ⑥) {return 404002;}//如果存证接收的公司资产小于存证数额,那么就不能交易发送存证if (accepterCompany.creditAsset ⑦ ⑧) {return 500001;}(2)编写创建存证的接口,实现创建存证的功能;(2分)Receipt memory newReceipt = Receipt(①, accepterAddress, receiptType, 2, amount);receiptIndex += 1;//记录存证(存证Map,公司Map对应地址的发送和接收存证列表)receiptMap[receiptIndex] = ②;companyMap[③].sendReceiptIndex.push(receiptIndex);companyMap[accepterAddress].acceptReceiptIndex.push(④);(3)编写交易金额数量变化的接口,实现凭证交易双方资金的变化功能;(2分)companyMap[①].creditAsset ② amount;companyMap[③].creditAsset ④ amount;return 200;}3.供应链金融公司与银行交易的接口编码(4分)(1)编写公司与银行之间进行交易的历史存证上链接口,实现公司与银行之间的交易功能;(2分)function companyToBankReceipt(address senderAddress, ①, uint amount, uint8 receiptType) returns(uint) {②Bank memory bank = bankMap[senderAddress];Company memory accepterCompany = companyMap[③];//确认发送公司存在if (keccak256(bank.bankName) == ④) {return 404001;}//确认接收公司存在if (keccak256(accepterCompany.companyName) == keccak256("")) {return 404002;}//如果存证接收的公司资产小于存证数额,那么就不能交易发送存证if (accepterCompany.creditAsset < amount) {return 500001;}(2)编写创建存证的接口,实现创建存证的功能;(1分)//创建存证Receipt memory newReceipt = Receipt(senderAddress, accepterAddress, ①, 3, amount);receiptIndex ② 1;receiptMap[③] = newReceipt;bankMap[senderAddress].sendReceiptIndex.push(receiptIndex);companyMap[accepterAddress].④;(3)编写交易金额数量变化的接口,实现凭证交易双方资金的变化功能;(1分)bankMap[senderAddress].① ② amount;companyMap[accepterAddress].③ ④ amount;return 200;}合约编译、部署和调用(4分)(1)解决代码错误和警告,正确编译并部署合约,成功获取部署的合约地址和abi。(1分)(2)调用食品溯源智能合约的接口,完整验证业务流程。(3分)任务2-3:智能合约测试(5分)编写智能合约单元测试代码并完成合约功能测试、性能测试,具体要求如下:1.配置区块链网络(1分)启动Ganache软件,创建新的Wordspace,配置对外访问的RPC接口为7545,配置项目的truffle-config.js实现与新建Workspace的连接。2.补充给定基础代码中注释提示的部署逻辑(1分)基于VSCODE加载的Truffle项目,补全位于test文件夹中HelloWorld.js文件预操作的方法。在测试文件中添加预定义的方法(在其他方法启动前使用)。3.补充代码中注释提示的测试逻辑(1分)基于VSCODE加载的Truffle项目,补全位于test文件夹中HelloWorld.js文件,添加测试用例,测试智能合约的get方法。4.测试hello.get()方法(1分)基于VSCODE加载的Truffle项目,补全位于test文件夹中HelloWorld.js文件,添加测试用例,测试智能合约的hello.get()方法。5.测试.should.equal进行对比判断(1分)基于VSCODE加载的Truffle项目,补全位于test文件夹中HelloWorld.js文件,添加测试用例,测试智能合约的equal字符串比较方法。 模块三:区块链应用系统开发(30分)选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块三提交结果.docx】中对应的任务序号下。任务3-1:区块链应用前端功能开发(10分)1.请基于前端系统的开发模板,在注册组件Register.vue文件中添加对应的注册逻辑代码,实现对后端系统的注册功能,并测试功能完整性(3分):本题目的具体要求如下:界面有明确的注册相关提示语需要填写的项有组织名称、区块链地址、组织类型页面需要有“返回”按钮,可以跳转到登录页面点击“注册”按钮时需要检查区块链地址是否已输入注册成功后跳转登录页面Register.vue:代码片段1:选手填写部分公司银行注册返回代码片段2:register: function () {if (this.address == "") {alert(选手填写部分)}else {let postData = {orgType: 选手填写部分,username: 选手填写部分,address:选手填写部分}// 和后端交互选手填写部分}},代码片段3:goback: function () {this.orgType = ''this.username = ''this.address = ''选手填写部分}2.请基于前端系统的开发模板,在登录组件Login.vue文件中添加对应的登录逻辑代码,实现对后端系统的登录功能,并测试功能完整性(3分):本题目的具体要求如下:界面有明确的登录相关提示语需要填写的项有用户地址、组织类型页面需要有“注册”按钮,可以跳转注册页面点击“登录”按钮时需要检查各个表项是否已输入登录成功后跳转首页,路径为“/home”Login.vue:代码片段1:供应链金融应用选手填写部分公司银行登录注册 代码片段2:login: function () {if (this.address == "") {alert("选手填写部分")}else if (this.orgType == "") {alert("选手填写部分")}else {let postData = {orgType: 选手填写部分,address: 选手填写部分}// 与后端交互选手填写部分}},代码片段3:register: function () {选手填写部分},3.请基于前端系统的开发模板,在公司组件Company.vue文件中添加对应的逻辑代码,实现对后端系统的公司相关业务功能,并测试功能完整性(2分):Company.vue:代码片段1:查询操作代码片段2:{{选手填写部分 }}{{ 选手填写部分 }}{{ 选手填写部分 }}代码片段3:detail: function (queryAddress) {this.dialogVisible = truelet address = 选手填写部分this.axios.get(`选手填写部分 address=${address}&queryAddress=${queryAddress}`).then((response) => {console.log(response)if (response.data.code == 200) {let inAddress = response.data.panyVO.address;let inName = 选手填写部分;let inAmount = response.data.panyVO.amount;panyDetail = {address: 选手填写部分,name: 选手填写部分,amount: 选手填写部分,senderReceiptList: response.data.data.senderReceiptList,accepterReceiptList: response.data.data.accepterReceiptList}} else {alert(`请求内容有误, ${response.data.data}`)}})},4.请基于前端系统的开发模板,在银行组件Bank.vue文件中添加对应的逻辑代码,实现对后端系统的银行相关业务功能,并测试功能完整性(2分):Bank.vue:代码片段1:{{选手填写部分}}{{选手填写部分}}v-for="item in options":key="item.value":label="item.label":value="item.value">确定代码片段2:executeTransaction: function() {let funcName = "companyToBankReceipt";if (this.transDetail.amount ==选手填写部分) {alert('交易额不能为空!')return}if (this.$cookies.get('orgType') == 选手填写部分) {alert('银行不能给银行发送凭证!')return}if (选手填写部分) {alert("凭证发送账户和接收账户不能相一致!")return}this.axios.post(`/finance/transaction/${funcName}`, 选手填写部分).then((response) => {if (response.data.code == 200) {alert('凭证发送成功')this.query()this.transDialogVisible = false}else {alert(`凭证发送失败, ${response.data.data}`)}})},任务3-2:区块链应用后端功能开发(20分)1.开发区块链供应链金融应用中后端系统中用户功能模块对应的用户注册功能,根据前后代码补充最合适的代码,并测试功能完整性。(4分)OrgServiceImpl.java:/*** 注册Service* RegisterBO registerBO* */@Overridepublic Result register(RegisterBO registerBO) {if (StrUtil.isEmpty(选手填写部分) ||StrUtil.isEmpty(选手填写部分) ||registerBO.getOrgType() == 选手填写部分) {return Result.error(ResultVO.PARAM_EMPTY);}List funcParam = new ArrayList();funcParam.add(选手填写部分);funcParam.add(选手填写部分);if(registerBO.getOrgType() == 2){funcParam.add(BigInteger.valueOf(1000));}String funcName;if(registerBO.getOrgType() == 2){funcName =选手填写部分;}else{funcName =选手填写部分;}String _result = weBASEUtils.funcPost(OWNER_ADDRESS,funcName,funcParam);JSONObject _resultJson = JSONUtil.parseObj(_result);if (_resultJson.containsKey("statusOK") == false || _resultJson.getBool("statusOK") != true){ // _resultJson.getInt("code") > 0return Result.error(ResultVO.选手填写部分);}return Result.success("ok");}2.开发区块链供应链金融应用中后端系统中用户功能模块对应的用户登录功能,根据前后代码补充最合适的代码,并测试功能完整性。(4分)OrgServiceImpl.java:/*** 登录Service* LoginBO loginBO**/@Overridepublic Result login(@RequestBody LoginBO loginBO) {if (StrUtil.isEmpty(loginBO.getAddress())) {return Result.error(ResultVO.PARAM_EMPTY);}List funcParam = new ArrayList();funcParam.add(选手填写部分);String funcName;if(loginBO.getOrgType() == 2){funcName =选手填写部分;}else{funcName =选手填写部分;}String _result = weBASEUtils.funcPost(选手填写部分,funcName,funcParam);JSONArray _resultJson = JSONUtil.parseArray(_result);if (StrUtil.isEmpty(_resultJson.get(0).toString())){return Result.error(ResultVO.选手填写部分);}return Result.success("ok");}3.开发区块链供应链金融应用的后端系统中查询功能模块对应的查询所有公司信息功能,根据前后代码补充最合适的代码,并测试功能完整性。(4分)QueryServiceImpl.java:/*** 获取所有公司数据,不包含存证详细信息* */@Overridepublic Result listCompany(String userAddress){String _result = weBASEUtils.funcPost(userAddress,"getAllCompanyAddress",new ArrayList());try {JSONArray respArray = 选手填写部分;String a = respArray.get(0).toString();JSONArray addressArray = 选手填写部分;List companyList = new ArrayList<>();for(Object obj: addressArray) {CompanyVO companyVO = 选手填写部分;companyList.add(companyVO);}return Result.success(选手填写部分);}catch (Exception e) {ResultVO resultVO = ResultVO.CONTRACT_ERROR;resultVO.setData(选手填写部分);return Result.error(选手填写部分);}}4.开发区块链供应链金融应用的后端系统中查询功能模块对应的查询银行凭证列表功能根据前后代码补充最合适的代码,并测试功能完整性。(4分)QueryServiceImpl.java:/*** 获取包括银行详情,银行发送凭证列表,银行接收凭证列表* */@Overridepublic Result getBankEntity(String userAddress, String queryAddress){BankVO bankVO = 选手填写部分;List senderReceiptList = 选手填写部分;List accepterReceiptList = 选手填写部分;BankEntityVO bankEntityVO = new BankEntityVO();bankEntityVO.setBankVO(选手填写部分);bankEntityVO.setSenderReceiptList(选手填写部分);bankEntityVO.setAccepterReceiptList(选手填写部分);return Result.success(bankEntityVO);}5.开发区块链供应链金融应用的后端系统中交易功能模块对应的银行向公司交易凭证功能,根据前后代码补充最合适的代码,并测试功能完整性。(2分)TransactionServiceImpl.java:/*** 公司向银行发送凭证(银行转账给公司)* */public Result bankToCompanyReceipt(TransactionBO transactionBO) {选手填写部分;}6.开发区块链供应链金融应用的后端系统中交易功能模块对应的公司向公司交易凭证功能,根据前后代码补充最合适的代码,并测试功能完整性。(2分)TransactionServiceImpl.java:/*** 公司向公司的凭证发送* */public Result companyToCompanyReceipt(TransactionBO transactionBO) {选手填写部分;}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.3.1 登录业务功能模块2.3.2 食品订单溯源功能模块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. 功能描述标识符 produce功能 生产商创建食品溯源中生产订单相关信息2. 接口功能请求路由 /produce请求方法 POST请求参数参数名 类型 说明响应参数参数名 类型 说明2.4.2.3 分销订单创建1. 功能描述标识符 ditribute功能 分销商创建食品溯源中分销订单相关信息2. 接口功能请求路由 distribute请求方法 POST请求参数参数名 类型 说明响应参数参数名 类型 说明2.4.2.4 销售订单创建1. 功能描述标识符 retail功能 分销商创建食品溯源中分销订单相关信息。2. 接口功能请求路由 retail请求方法 POST请求参数参数名 类型 说明响应参数参数名 类型 说明2.4.2.5 食品信息追溯查询1. 功能描述标识符 trace功能 通过指定订单号追溯食品信息2. 接口功能请求路由 trace请求方法 POST请求参数参数名 类型 说明响应参数参数名 类型 说明3.系统数据库设计通过中心化的方式存储系统中用户信息,包括用户名(username)、密码(password)、角色(role)、地址(address)内容。3.1 User表(user)字段名称 字段类型 含义 是否可为NULL 是否Primary Key4.系统出错处理设计4.1出错信息服务器端可能有Java的异常产生,可用Java中的异常处理方法try…catch处理 ,并记录日志,以备事后分析查找原因。4.2补救措施采用双服务器热备份的方法,一旦服务器崩溃,立即切换到另一台服务器运行。4.3系统维护设计保留本系统的一系列文档,加适当注释,以备维护者维护。每次修改/维护,都做记录。 展开更多...... 收起↑ 资源列表 GZ036 区块链技术应用赛项赛题第1套.docx GZ036 区块链技术应用赛项赛题第2套.docx GZ036区块链技术应用赛项规程.doc 区块链食品溯源系统概要设计说明书.doc 供应链金融管理系统概要设计说明书.doc