(全国职业技能比赛:高职)GZ036区块链技术应用赛项赛题第9套.docx
《(全国职业技能比赛:高职)GZ036区块链技术应用赛项赛题第9套.docx》由会员分享,可在线阅读,更多相关《(全国职业技能比赛:高职)GZ036区块链技术应用赛项赛题第9套.docx(26页珍藏版)》请在冰豆网上搜索。
2023年全国职业院校技能大赛
高职组
“区块链技术应用”
赛项赛卷(9卷)
任
务
书
参赛队编号:
背景描述
随着异地务工人员的增多,房屋租赁成为一个广阔是市场;目前,现有技术中的房屋租赁是由房主发布租赁信息,租赁信息发布在房屋中介和/或租赁软件,租客获取租赁信息后,现场看房,并签订纸质的房屋租赁合同;房屋租赁费用通过中介或直接给房主;另外,后期的房租还需房主收取。
区块链房屋租赁平台业务流程图
现在利用区块链技术实现房屋租赁系统,将房东、房屋、租客加入到区块链网络中,将发布、租赁、合同、房租等信息存储在区块链的分布式网络中,永久有效,无法篡改。
在房屋租赁场景中,房东将房屋租出后,无法有效控制房屋的使用权,比如租客未履行租赁合约相应内容时,房东无法及时有效限制租客对房屋的使用,造成租金或房屋使用权的回收困难。
现有一个基于区块链的房屋租赁平台S,房东L在平台中发布房源,S可以调用该房屋的电子锁E的密码。
L在S中发放租房合同给租客T。
在租房合同中规定,每个月的16号缴纳房租,房租是3000元,交付形式是押一付一。
在T签署合同后的24小时之内,T需要在S中预存3000元押金、3000元房租,如果T未预存,交易失败。
如果T预存了押金和房租,L需要在24小时内在S中预存3000元保证金,如果L未在规定时间内预存保证金,S将T的保证金与房租退回,如果L在规定时间内预存了保证金,双方达成交易。
S自动将T的一个月房租转账给L,并将房屋E的密码发送给T。
在每月16日,E会自动更换密码,如果T按时缴纳房租,S将房屋密码重新更新给T;当T到期未缴纳,S将T的保证金转账给L代替一个月的租金,S仍会将密码更新给T;如果保证金已被扣除后,T仍然到期未缴纳,平台进入等待补缴状态,T将收不到变更后的密码。
如果未到租期L提前终止合同,S将L的保证金转给T,如果T还有保证金将保证金一并退还给T。
如果未到租期T提前终止合同,如果还有保证金S将T的保证金转给L,T还需赔偿L一个月租金,如果T保证金已被扣除,T需赔偿L两个月租金,S将L的保证金退还L。
当合同正常到期,S将L的保证金退还,T如果还有也退还。
区块链房屋租赁平台系统架构图
模块一:
区块链产品方案设计及系统运维(35分)
选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块一提交结果.docx】中对应的任务序号下。
任务1-1:
区块链产品需求分析与方案设计
房屋租赁平台中涉及到租客、房东、区块链租房平台、房屋等参与方,他们需要在区块链租房平台中完成账户注册、身份上链、出租房屋、生成合同等多种业务活动。
通过对业务活动的功能分析,可以更好的服务系统的开发流程。
基于房屋租赁平台系统架构,以区块链房屋租赁平台为背景,结合账户注册、登录服务、入驻上链、房屋出租、房租缴费等核心功能描述,撰写流程图/功能图、用例图等概要设计。
本环节需要依据项目背景完成需求分析与方案设计,具体要求如下:
1.依据给定区块链房屋租赁平台的业务流程图以及用例表,使用UML工具编制系统业务用例图,用例图中包含系统参与角色以及用例。
表1-1-1用例表
用例编号
用例标题
优先级
测试步骤
预期
结果
测试结果
HK-TEST-01
房东在区块链房屋租赁平台出租房屋
高
在房屋租赁页面,点击出租功能按钮,跳转到维护房屋信息的页面
成功跳转
成功跳转
HK-TEST-02
房东在区块链房屋租赁平台发放合同
高
在租房管理页面获取租客的租房列表信息,在租房列表中点击发放按钮,可以对该租客发放默认的房屋合同
发放成功
发放成功
HK-TEST-03
租客在区块链房屋租赁平台签署合同
高
在租房管理页面获取租房信息列表,在列表中点击签署按钮,弹窗显示租房合同,将个人信息填充到合同中
收到合同
签署成功
收到合同签署成功
HK-TEST-04
租客在区块链房屋租赁平台缴纳费用
高
在房租缴费页面,获取租房合同信息列表,在列表中点击缴费按钮,弹窗显示租金和保证金并显示缴费倒计时,在倒计时内缴费成功
合同记录
缴费成功
合同记录
缴费成功
HK-TEST-05
房东在区块链房屋租赁平台缴纳费用
高
在租房缴费页面,获取租房合同信息列表,在列表中点击缴费按钮,弹窗显示保证金和缴费倒计时,在倒计时内缴费成功
合同记录
缴费成功
合同记录
缴费成功
HK-TEST-06
区块链房屋租赁平台将房租转账给房东
高
租客、房东缴费成功后,平台自动将房租转账给房东。
在房东账户管理界面,显示出收款记录。
同时在租客的租赁记录里自动回显房屋的最新电子锁密码
收款成功
电子锁密码回显成功
收款成功
HK-TEST-07
租客或者房东提前终止合同
高
租客或者房东在合同信息列表页,点击终止按钮,弹窗进行二次确认是否提前终止,确认则进入违约页面
终止成功
终止成功
2.依据给定的背景信息、区块链房屋租赁业务流程图以及区块链房租租赁平台架构图以及给出的房屋租赁业务的核心流程,使用思维导图工具编制业务系统功能图;
表1-1-2房屋租赁平台的核心流程
发布租房合同流程
房东起草租房合同协议,填写房屋信息、租期、房租等。
使用房东的私钥对租房合同进行签名并广播到区块链中进行存证
签署合同流程
租客解密租房协议,验证租房协议的来源。
通过租客节点在租房协议中填写个人信息和签名信息,生成租房合约
租房合约属性文本广播流程
租客对租房合约提炼合约属性文本,使用私钥对合约属性本文以及租房合约进行签名后,广播到区块链中
房东解密合约属性文本流程
房东使用自身私钥对加密后的租房合约进行解密,对解密后的租房合约提炼对照合约属性文本,并使用私钥对对照合约属性文本进行签名后广播到区块链中
缴纳房租流程
区块链房屋租赁平台节点实时房屋到期时间,如果房屋到期时,判断房租缴纳和电子锁密码的更新
3.按照基础层、合约层、接口层以及应用层来设计区块链系统的架构,画出系统架构图,其中在基础层需指明需要的节点、名称、协议、存储等信息;
4.结合案例背景将区块链房屋租赁平台核心功能进行划分,完成下方表格中各个主要模块要实现的功能;
房屋出租模块
请输入要实现的功能
合同发放模块
请输入要实现的功能
合同生效模块
请输入要实现的功能
费用缴纳模块
请输入要实现的功能
租房合约执行模块
请输入要实现的功能
违约判断功能模块
请输入要实现的功能
5.根据用例设计以及下方提供好的承诺集,使用Visio工具完成区块链应用系统业务流程图;
表1-1-3承诺集
房屋出租承诺
判断房东是否在房屋租赁平台发布房屋
缴纳费用承诺
判断租客是否在房屋租赁平台缴纳房租和预存保证金;判断房东是否在房屋租赁平台预存保证金
房租到期缴纳承诺
判断租客是否按时将房租转账给房东,是则发送电子密码锁,否则解锁保证金
合同到期承诺
判断合同是否到期,是则进入判断保证金是否被转账流程,是则结束,否则退还
6.整合所有内容,模块调用接口编写并形成对应的需求用例文档至【区块链技术应用赛\重命名为工位号】下。
任务1-2:
区块链系统部署与运维
通过给定区块链项目需求,进行区块链系统的的部署,包括系统部署、节点部署等。
通过监控工具完成对网络、节点服务的监控。
最终利用业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护。
子任务1-2-1:
区块链网络环境搭建
在本机部署区块链网络底层环境,我们需要准备编译运行的环境,并通过区块链底层源码脚本文件编译区块链网络。
(1)打开区块链源码文件,检查区块链网络基础运行环境,通过输入命令,检查Docker环境,并确定Docker版本;
(2)打开区块链源码文件,通过输入命令,make编译区块链网络,生成区块链网络编译执行文件,请把编译执行文件截图;
(3)成功编译区块链网络后,通过输入命令,启动区块链服务;
(4)启动区块链网络后,通过输入命令,检查区块链网络状态。
子任务1-2-2:
区块链网络服务运行
区块链网络环境成功搭建后,启动区块链网络服务,区块链网络提供了很多的命令行基础功能,满足区块链网络服务的运行。
(1)进入区块链网络执行文件夹(output),通过命令行方式,创建区块链普通钱包账户(userTest),生产区块链钱包地址,私钥,公钥;
(2)进入区块链网络执行文件夹(output),通过命令行方式,获取区块链钱包余额(data/keys);
(3)进入区块链网络执行文件夹(output),通过命令行方式,由data/keys向(userTest)转账10,并查看交易ID;
(4)进入区块链网络执行文件夹(output),通过命令行方式,使用上一步的交易ID,查询交易状态,交易源和目标账号、交易的金额等信息
子任务1-2-3:
部署区块链多节点服务
搭建一个3个节点的区块链网络,需要通过命令行创建多节点网络部署环境,并监听各个节点的RPC监听端口,并查看p2p监听渡口配置,现有任务如下:
(1)进入区块链网络主目录下,通过命令行,创建多节点网络部署环境;
(2)进入多节点网络环境目录下,创建多节点网络部署环境后,通过命令行方式,查看P2P网络配置;
(3)节点加入网络需要通过配置种子节点的网络连接地址netURL,请通过命令行方式,获取node3对应的节点netURL。
子任务1-2-4:
搭建区块链网络监控系统
镜像提供了Prometheus开源框架,用户可以通过Prometheus+Grafana构建自己应用的监控系统。
请按如下步骤,完成对系统的搭建:
(1)进入区块链网络监控系统主目录,通过命令行方式,在节点env.yaml配置中打开metricSwitch;
(2)配置prometheus设置endpoint服务修改prometheus.yml文件,添加如下配置,每个target对应区块链节点的server.yaml中的metricPort端口;
(3)进入到对应目录下,通过命令行启动启动prometheus,打开区块链监控系统项目网址。
任务1-3:
区块链系统测试
设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约中进行系统测试、性能测试等;根据业务需求,分析并且修复给定智能合约中的安全漏洞。
利用模拟业务和测试工具来完成对区块链系统服务数据的测试。
1.启动区块链浏览器系统,找到区块链最新区块列表接口,使用Postman工具对该接口进行HTTP请求测试,并将测试保存;
2.使用测试工具进行测试区块链网络,针对区块链网络吞吐量与时延进行性能指标分析;
3.通过SQL手工注入方法分析区块链系统漏洞,寻找环境注入点,判断注入类型并获取数据库中的信息。
模块二:
智能合约开发与测试(30分)
选手完成本模块的任务后,将任务中设计结果、运行代码、运行结果等截图粘贴至客户端桌面【区块链技术应用赛\重命名为工位号\模块二提交结果.docx】中对应的任务序号下。
任务2-1:
智能合约设计
根据房屋租赁系统需求用例文档,设计合约接口,画出各需求用例的时序图。
任务2-2:
智能合约开发
使用Solidity语言进行智能合约开发,根据需求用例文档在待补充源码中完成程序接口功能的编码,解决代码错误和警告,正确编译合约,功能调试正确,运行合约进行业务功能的验证,成功获取合约的ABI,将合约部署至区块链,获取部署的合约信息,将任务中编写代码、运行截图。
子任务2-2-1:
合同管理合约编码
根据需求用例文档在待补充源码中完成合同管理合约的编码,解决代码错误和警告,正确编译合约,功能调试正确,运行合约中的房东签署合同、租金支付接口功能。
(1)编写房东签署合同接口,完成本合同位置只允许房东签署,通过合同中的信息生成租赁合同的链上哈希,触发协议签署合同的功能,其中合同中的信息包括房东链上账户、租客链上账户、租赁开始时间、租赁结束时间、月租金额、押金金额、交租时间;
(2)编写租金支付接口,完成只允许租客支付租金的规则,检查支付的租金金额是否正确,触发记录租金支付情况的功能。
待补充源码:
contractRentalAgreement{
addresspubliclandlord;//房东的账户
addresspublictenant;//租客的账户
uintpublicrentAmount=3000;//每月租金金额(以wei为单位)
uintpublicdepositAmount=3000;//押金金额(以wei为单位)
uintpublicrentDueDate=16;//租金到期日
uintpublicleaseStartDate;//租赁开始日期
uintpublicleaseEndDate;//租赁结束日期
uintpublicleaseDuration;//租赁期限(以秒为单位)
bytes32publiccontractHash;//租赁协议的哈希值
bytes32publicpropertyHash;//租赁物业信息的哈希值
eventAgreementSigned(addressindexed_signer,bytes32_contractHash);//租赁协议签署事件
eventRentPaid(addressindexed_payer,uint_amount);//租金支付事件
eventDepositPaid(addressindexed_payer,uint_amount);//押金支付事件
eventLeaseTerminated(addressindexed_terminator);//租赁终止事件
constructor(address_landlord,address_tenant,uint_leaseDuration,bytes32_propertyHash){
landlord=_landlord;
tenant=_tenant;
leaseDuration=_leaseDuration;//初始化租赁期限
propertyHash=_propertyHash;
}
/***********房东签署合同接口开发**********/
/**********房东签署合同接口开发***********/
/***********租金支付接口开发**********/
/**********租金支付接口开发***********/
functionpayDeposit()publicpayable{
require(msg.sender==tenant,"Onlythetenantcanpaythedeposit.");//仅允许租客支付押金
require(msg.value==depositAmount,"Incorrectdepositamount.");//检查支付的押金金额是否正确
emitDepositPaid(msg.sender,msg.value);//触发押金支付事件
}
functionterminateLease()public{
require(msg.sender==landlord,"Onlythelandlordcanterminatethelease.");//仅允许房东终止租赁
require(block.timestampleaseEndDate=block.timestamp;//更新租赁结束日期为当前时间
emitLeaseTerminated(msg.sender);//触发租赁终止事件
}
}
子任务2-2-2:
违约管理合约编码
根据需求用例文档在待补充源码中完成违约管理合约的编码,解决代码错误和警告,正确编译合约,功能调试正确,运行合约中的房东终止合同、租客终止合同接口功能。
(1)编写房东终止合同接口,实现房东终止合同判断,如果租客已经终止合同则合同无效,如果合同有效,对合同终止状态进行标记,将剩余押金退还给租客的功能;
(2)编写租客终止合同接口,实现租客终止合同判断,如果房东已经终止合同则合同无效,如果合同有效,对合同终止状态进行标记,将剩余押金退还给房东的功能。
待补充源码:
contractRentalContract{
addresspayablepubliclandlord;//房东地址
addresspayablepublictenant;//租客地址
uintpublicrentAmount;//租金
uintpublicsecurityDeposit;//押金
uintpubliccontractStartDate;//合同开始日期
uintpubliccontractEndDate;//合同结束日期
uintpublicgracePeriod;//宽限期
uintpublicterminationFee;//终止合同费用
boolpubliccontractActive;//合同是否有效
boolpubliclandlordTerminated;//房东是否终止合同
boolpublictenantTerminated;//租客是否终止合同
boolpublictenantDefaulted;//租客是否违约
boolpublicsecurityDepositReturned;//押金是否已退还
constructor(addresspayable_landlord,addresspayable_tenant,uint_rentAmount,uint_securityDeposit,uint_contractStartDate,uint_contractEndDate,uint_gracePeriod,uint_terminationFee){
landlord=_landlord;
tenant=_tenant;
rentAmount=_rentAmount;
securityDeposit=_securityDeposit;
contractStartDate=_contractStartDate;
contractEndDate=_contractEndDate;
gracePeriod=_gracePeriod;
terminationFee=_terminationFee;
contractActive=true;
landlordTerminated=false;
tenantTerminated=false;
tenantDefaulted=false;
securityDepositReturned=false;
}
functionpayRent()publicpayable{
require(msg.sender==tenant,"只有租客可以支付租金。
");//判断是否为租客
require(msg.value==rentAmount,"租金金额不正确。
");//判断支付的租金是否正确
require(contractActive,"合同无效。
");//判断合同是否有效
require(block.timestamp<=contractEndDate,"合同已过期。
");//判断合同是否已过期
if(block.timestamp>contractStartDate+gracePeriod){//如果已经超过宽限期
tenantDefaulted=true;//标记租客违约
if(securityDeposit>=rentAmount){//如果押金足够支付租金
securityDeposit-=rentAmount;//押金减去租金
}else{
securityDeposit=0;//押金清零
}
if(block.timestamp>contractEndDate){//如果合同已经过期
contractActive=false;//合同无效
if(securityDeposit>0){//如果押金还有剩余
tenant.transfer(securityDeposit);//将押金退还给租客
}
if(msg.value>rentAmount){//如果支付的租金超过了租金金额
payable(msg.sender).transfer(msg.value-rentAmount);//将多余的租金退还给租客
}
}else{
landlord.transfer(rentAmount);//将租金转账给房东
}
}else{
landlord.transfer(rentAmount);//将租金转账给房东
}
}
functionterminateContract()public{
require(contractActive,"合同无效。
");//判断合同是否有效