开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2024.03.03湖北
目录
“区块链技术应用”赛项赛卷(3卷)
模块一:区块链产品方案设计及系统运维(35分)
任务1-1:区块链产品需求分析与方案设计
任务1-2:区块链系统部署与运维
任务1-3:区块链系统测试
模块二:智能合约开发与测试(30分)
任务2-1:智能合约设计
任务2-2:智能合约开发
任务2-3:智能合约测试
模块三:区块链应用系统开发(30分)
任务3-1:区块链应用前端功能开发
任务3-2:区块链应用后端功能开发
2023年全国职业院校技能大赛
高职组
任
务
书
背景描述
区块链与太阳能的融合,可以让新能源治理变得更加高效,让能源流转到急需的领域,尤其在能源交易过程中实现原子化交易。太阳能管理系统中除了资产与能源外,还包括了不同主体的管理,资产与太阳能源需要和用户深度绑定。基于区块链的太阳能管理系统可有效提升能源利用效率,同时也可有效降低能源浪费的现象。
选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块一提交结果.docx】中对应的任务序号下。
本任务需要依据项目背景完成需求分析与方案设计,具体要求如下:
1.根据项目背景描述,将系统分为业务平台和支撑平台两个部分,使用工具展现项目系统架构图;
2.根据项目背景描述内容,设计总体功能结构图;
3.根据项目背景描述内容,设计并形成“系统概要设计说明书.doc”,具体要求如下:
(1)做好概要设计,包括总体设计、基本设计概念和处理流程、结构等基本内容;
(2)完善说明书中接口说明部分内容。
完成后提交“新能源管理系统概要设计说明书.doc”文档至【区块链技术应用赛\重命名为工位号】下。
新能源管理系统概要设计说明书
1.引言
1.1编写目的
本概要说明书按照《需求规格说明书》的功能需求,设计本系统的软件结构,供后续软件过程(详细设计等)做依据,预期读者为后续软件过程的设计、开发人员。
2.总体设计
2.1需求规定
按照新能源系统的需求规定,用户可以通过本系统实现能源管理与交易、新能源资产管理与交易、用户管理等功能。
2.1.2输入输出要求
参照需求文档的说明
2.2运行环境
本系统必须运行在局域网或互联网中
2.2.1硬件设备
Web服务器:数量1台
数据库服务器:数量1台
客户端PC机:数量若干台,按需要增加
2.2.2支持架构
客户端
服务器端
后台数据库
2.3基本设计概念和处理流程
//请将任务1-1第1小题的答案复制至此处;
//在这里补充
2.3.2能源交易功能模块
2.4结构
2.4.1总体框图
//请将任务1-1第2小题的答案复制至此处;
2.4.2功能模块接口及说明
由于在后续设计中,对各功能模块的每个子功能都要详细的加以描述,因此恰当的标识符将有助于文档的阅读和代码的编写。
命名规则:
数据库表名命名规则
由前缀和实际名字组成。前缀:使用小写字母tb,表示表。实际名字采用其英文缩写,且首字母要大写。
数据库表中字段命名规则
根据其中文名称直接翻译成英文,其首字母要大写;若为多个词的组合,则每个词的首字母都要大写。
模块标识符命名规则
应本着便于理解和尽量简洁的原则来命名标识符。在本系统中,各模块均以每个词英文的前几个字母来命名,模块下的子功能也以其英文简写来命名,且每个词首字母均为大写。
程序中变量命名规则
每个变量都要以其所在的模块的为前缀,该前缀可以是该模块标识符中大写字母的组合,前缀后面加下划线“_”。后面的字母小写,并且不能包含JAVA的关键字,如果变量是两个单词组成,第二个单词的首字母要大写。
程序中函数命名规则
每个函数名都要以其所在的模块的为前缀,该前缀可以是该模块标识符中大写字母的组合,前缀后面加下划线“_”。首字母小写,多个单词的函数名,从第二个单词开始单词首字母大写。
//在下方各接口功能处补充完整请求参数、相应参数内容
2.4.2.1用户注册
1.功能描述
标识符
Register
功能
使用用户地址、角色、密码注册
2.接口功能
请求路由
/Register
请求方法
POST
请求参数
参数名
类型
说明
响应参数
2.4.2.2用户信息查询
userInfo
通过指定用户地址获取详细信息
/userInfo
2.4.2.3创建资产
SPU_insert
新增资产
/SPU_insert
2.4.2.4资产交易
SPU_transfer
资产交易
distribute
2.4.2.5能源交易
Energy_transfer
能源交易
/Energy_transfer
3.系统出错处理设计
3.1出错信息
服务器端可能有Java的异常产生,可用Java中的异常处理方法try…catch处理,并记录日志,以备事后分析查找原因。
3.2补救措施
采用双服务器热备份的方法,一旦服务器崩溃,立即切换到另一台服务器运行。
3.3系统维护设计
保留本系统的一系列文档,加适当注释,以备维护者维护。每次修改/维护,都做记录。
子任务1-2-1:搭建区块链系统并验证
区块链系统中包括3个独立组织以及6个节点,网络拓扑为星型网络,并在联盟链中需实现2个数据隔离场景(group1、group2),节点可根据具体业务加入不同的业务场景。具体工作内容如下:
子任务1-2-2:搭建区块链系统管理平台并验证
子任务1-2-3:区块链节点运维
基于已完成的区块链系统与管理平台搭建工作,开展区块链节点的加入与退出运维工作,具体内容如下:
子任务1-2-4:区块链网络运维
基于已完成的区块链系统与管理平台搭建工作,开展节点运维工作,具体内容如下:
设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约中进行系统测试、性能测试等;根据业务需求,分析并且修复给定智能合约中的安全漏洞。利用模拟业务和测试工具来完成对区块链系统服务数据的测试。
有如下问题智能合约:
pragmasolidity^0.8.3;
contractEtherGame{
uintpublictargetAmount=7ether;
addresspublicwinner;
functiondeposit()publicpayable{
require(msg.value==1ether,'Youcanonlysend1Ether');
uintbalance=address(this).balance;
require(balance<=targetAmount,'Gameisover');
if(balance==targetAmount){
winner=msg.sender;
}
functionclaimReward()public{
require(msg.sender==winner,'Notwinner');
(boolsent,)=msg.sender.call{value:address(this).balance}('');
require(sent,'FailedtosendEther');
contractAttack{
EtherGameetherGame;
constructor(EtherGame_etherGame){
etherGame=EtherGame(_etherGame);
functionattack()publicpayable{
addresspayableaddr=payable(address(etherGame));
selfdestruct(addr);
(1)分析智能合约中存在问题,并说明危害;
(2)根据代码文件,编写测试用例,复现智能合约中存在的漏洞;
(3)创建新的智能合约,修复其中问题,说明修复内容并测试。
选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块二提交结果.docx】中对应的任务序号下。
子任务2-1-1编写新能源智能合约功能需求文档。
根据区块链新能源管理项目背景和需求分析,编写该区块链新能源管理的智能合约功能需求文档。
子任务2-1-2完成区块链新能源管理智能合约的设计。
1.设计区块链新能源管理智能合约接口,画出区块链新能源管理智能合约的角色UML用例图;
2.以图文结合的方式描述智能合约各参与实体间的关系。
使用Solidity语言完成智能合约开发、部署和调用,要求如下:
子任务2-2-1:太阳能板管理接口编码
1.根据文档要求,编写太阳能板新增接口功能,必须将新增太阳能板数据存入指定表中,在存储完成后需触发后事件并返回存储与否的标识;
2.根据文档要求,编写太阳能板修改接口,必须通过指定表修改完成数据更新,在完成更新后需触发事件并返回更新与否的标识。
子任务2-2-2:能源管理接口编码
1.根据文档要求,编写能源新增接口功能,必须将新增能源数据存入指定表中,在存储完成后需触发后事件并返回存储与否的标识;
2.根据文档要求,编写能源修改接口,必须通过指定表修改完成数据更新,在完成更新后需触发事件并返回更新与否的标识。
子任务2-2-3:合约部署和调用
1.解决代码错误和警告,正确编译并部署合约,成功获取部署的合约地址和ABI;
2.调用太阳能板查询合约接口,完整验证业务流程;
3.调用能源查询合约接口,完整验证业务流程。
1.调用太阳能板查询合约接口,完整验证业务流程;
2.调用能源查询合约接口,完整验证业务流程。
选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块三提交结果.docx】中对应的任务序号下。
1.请基于前端系统的开发模板,在注册组件Register.vue、中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功能完整性,示例页面如下:
本任务的具体要求如下:
(1)需要填写的项有地址、角色、密码;
(2)地址项输入框默认内容为“请输入0x开头的用户地址”,若不满足则报错;
(3)角色使用单选按钮组件,可选项为“用户”和“电力公司”;
(4)密码项需验证长度大于6位,输入框默认内容为“请输入6位以上的密码”;
代码片段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}`) }) 基本任务的具体要求如下: (1)需要填写的项有地址、密码,且密码以密文形式展现; (2)地址填写栏默认内容为“请输入0x开头的用户地址”; (3)页面需要有“注册”按钮,可以跳转注册页面; loginfun(){ console.log(this.logindata.password) this.axios.post('/account/login',this.logindata).then((response)=>{ this.$cookies.set('useraddress',response.data.data) console.log(this.$cookies.get('useraddress')) //this.uaddress=response.data.data 3.基于前端系统的开发模板,编写个人产权组件MyAsset.vue,实现对个人能源的管理功能,并测试功能完整性 本任务具体要求如下: 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){ alert(`失败,$(res.data.data)`) 4.基于前端系统的开发模板,编写产权市场组件Market.vue文件,实现产权的查询和交易功能,并测试功能完整性。 v-for='item2inimgs' :key='item2' :src='item2.img' class='image'/> 总价: 选手填写部分
选手填写部分
代码片段5:
transfer(){
this.axios.post(`/SSPU_transfer`,this.owner).then((res)=>{
this.transferorder=false
代码片段6:
getData(){
let_numid=this.searchs
this.axios.get(`/get_numid_Spu_numid=${_numid}`).then((res)=>{
console.log(res.data.data)
5.请基于前端系统的开发模板,编写管理员的区块链浏览器组件Browser.vue文件,实现底层合约的管理,并测试功能完整性。
参考界面如下:
:data='contracts' style='width:100%'> prop='合约名称' label=选手填写部分 width='180'> prop='合约地址' label=选手填写部分> created(){ this.axios.get(`/list`).then((response)=>{ if(response.data.result){ this.contracts=选手填写部分 RegisterBO.java: publicclassRegisterBO{ String选手填写部分; publicStringgetAddress(){ publicvoidsetAddress(选手填写部分){ publicStringgetRole(){ publicvoidsetRole(选手填写部分){ publicStringgetPassword(){ publicvoidsetPassword(选手填写部分){ AccountService.java: publicResult ListfuncParam=newArrayList(); funcParam.add选手填写部分; Dictresult=选手填写部分; JSONObjectrespBody=JSONUtil.parseObj(result.get('result')); Stringdata=(String)respBody.get('message'); if(data.equals('Success')){ returnResult.success('ok'); returnResult.error(ResultVO.PARAM_EMPTY); AccountController.java: @Autowired AccountServiceaccountService; @RequestMapping(选手填写部分,method=RequestMethod.POST) publicResult return选手填写部分; LoginBO.java: publicclassLoginBO{ publicResultLoginService(LoginBOloginBO){ funcParam.add(选手填写部分); JSONArrayrespBody=JSONUtil.parseArray(result.get('result')); Stringdata=(String)respBody.get(0); if(data.equals('true')){ returnResult.success(loginBO.getAddress()); publicResult 选手填写部分; SPU_sallerBO.java: publicclassSPU_sallerBO{ publicStringget_numid(){ publicvoidset_numid(选手填写部分){ publicStringget_price(){ publicvoidset_price(选手填写部分){ NewEnergyService.java: publicResult if(!spu_sallerBO.getAddress().startsWith('0x')){ returnResult.error(ResultVO.ADDRESS_INVALID); JSONObjectresBody=JSONUtil.parseObj(result.get('result')); Stringdata=(String)resBody.get('message'); returnResult.success('failed'); NewEnergyController.java: publicResult SpuVO.java: publicclassSpuVO{ String选手填写部分 publicStringgetName(){ publicvoidsetName(选手填写部分){ publicStringgetActual_Power(){ publicvoidsetActual_Power(选手填写部分){ publicStringgetRated_Power(){ publicvoidsetRated_Power(选手填写部分){ publicStringgetInput_Time(){ publicvoidsetInput_Time(选手填写部分){ publicStringgetPosition(){ publicvoidsetPosition(选手填写部分){ publicStringgetPrice(){ publicvoidsetPrice(选手填写部分){ publicResult publicResultget_numid_SpuService(String_numid){ JSONArrayresBody=JSONUtil.parseArray(result.get('result')); JSONArrayres=JSONUtil.parseArray(resBody.get(0)); JSONArrayarray=newJSONArray(); returnResult.success(array); NewEnergyController.java: @RequestMapping(选手填写部分) publicResult return选手填写部分); publicResultget_numid_Spu(@RequestParam('_numid')String_numid){