2024年甘肃省职业院校技能大赛 高职组“区块链技术应用“赛项竞赛样题①

2024年甘肃省职业院校技能大赛 高职组"区块链技术应用"赛项竞赛样题①

背景描述
在供应链金融这个万亿级市场中,区块链正在快速商业化落地,助力产业革新。基于区块链的供应链金融业务的理念是:以源自企业的应收账款为底层资产,通过区块链技术实现债券凭证的转让拆分。其中,在原始资产上链时,通过对应收账款进行审核校验,确认贸易关系和身份真实有效,和保证上链资产的真实可信。再者,债权凭证可基于供应链进行层层拆分与流转,都可完整追溯到最底层资产,以实现核心企业和金融机构对供应商的“信用穿透”。 某公司规划开发一个区块链供应链金融平台,包括核心企业、供应商、银行等角色,通过智能合约代码逐步构建区块链供应链金融平台的基本功能,实现银行向核心企业提供授信并发行数字凭证,企业与企业之间转让数字凭证。此外需要完成区块链供应链金融平台的前后端,实现基本的业务逻辑。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9c980b21fe0246389471041087522434.png)

模块一:区块链产品方案设计及系统运维(35分)

任务1-1:区块链系统部署与运维(25分)
围绕供应链金融区块链平台部署与运维需求,进行项目相关系统、节点以及管理工具的部署工作。通过监控工具完成对网络、节点服务的监控。最终根据业务需求规范,完成系统日志、网络参数、节点服务等系统结构的维护。

  1. 根据参数与端口设置要求,部署区块链系统并验证;
  2. 根据参数与端口设置要求,部署区块链网络管理平台并验证;
  3. 基于区块链系统相关管理平台,按照任务指南实施系统运维工作并验证。
  4. 基于区块链系统相关监管工具,按照任务指南对区块链系统进行监管。
    子任务1-1-1: 搭建区块链系统并验证(8分)
    基于给定服务器环境以及软件(地址“/root/tools”),使用Docker以默认配置安装单机4节点的区块链系统,并完成控制台工具的部署:
    (1)完成系统搭建配置与启动。(2分)
    (2)使用基于Docker命令查看区块链系统状态。(2分)
    (3)检查区块链系统节点node0连接状态输出。(2分)
    (4)配置控制台,管理相关证书并启动。(2分)
    子任务1-1-2:区块链管理平台部署与验证(8分)
    基于给定服务器环境以及软件(地址“/root/tools”),按要求部署区块链管理平台,具体工作如下:
    (1)配置Mysql数据库(2分)
    (2)配置管理平台连接区块链系统(2分)
    (3)使用命令启动管理平台服务(2分)
    (4)验证管理平台启动情况(2分)
    子任务1-1-3:区块链系统节点运维(5分)
    基于已完成的区块链系统与管理平台搭建工作,开展相关节点运维工作:
    (1)生成新节点(node4),启动并检查(2分)
    (2)修改新节点配置,并查看节点的nodeid(2分)
    (3)将新节点作为观察节点加入group1当中,并检查是否加入成功(1分)
    子任务1-1-4:区块链系统管理平台运维(4分)
    基于已部署的区块链系统管理平台,进行系统相关运维工作:
    (1)基于管理平台功能页面,添加新主机(2分)
    (2)基于管理平台功能页面,修改新节点(node4)节点状态,并监控。(2分)
    任务1-2:区块链系统测试(10分)
    设计对区块链系统的测试流程;结合实际业务需求,调用部署的智能合约中进行系统测试、性能测试等;根据业务需求,分析并且修复给定智能合约中的安全漏洞。利用模拟业务和测试工具来完成对区块链系统服务数据的测试。
    1.基于区块链系统的中间件服务的部署脚本完成中间件服务环境搭建以及搭建结果验证,最后将执行结果截图保存。(3分)
    (1)实现区块链系统中间件服务平台部署。(1分)
    (2)实现区块链系统中间件服务签名功能启动情况验证。(1分)
    (3)区块链中间件服务节点管理进程启动情况验证和浏览器验证。(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();
    }
}

如上代码主要实现功能为规定了转账冻结时间,在冻结时间内用户不能提取存款的金额。
(1)分析智能合约中存在问题,并说明危害。(2分)
(2)根据测试工具中的代码文件,编写测试用例,复现智能合约中存在的漏洞。(3分)
(3)创建新的智能合约,修复其中问题,说明修复内容并测试。(2分)

模块二:智能合约开发与测试(30分)

任务2-1:智能合约开发(20分)
使用Solidity语言完成智能合约开发、部署和调用,要求如下:
1.供应链金融实体信息编码(6分)
(1)编写供应链金融智能合约的实体接口,完成实体通用数据的初始化,实现企业和票据实体信息上链的功能;(2分)
表2.2.2.1 SupplyChain实体说明

*名称**类型**说明*
companyNamestring公司名称
companyAddressaddress公司地址
creditAssetuint信用资产
acceptReceiptIndexuint[]接收的凭证
sendReceiptIndexuint[]发送的凭证
senderAddressaddress发送票据的地址
accepterAddressaddress接收票据的地址
receiptTypeuint8凭证类型
transferTypeuint8交易类型
amountuint交易数量

//公司信息结构体
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.合约编译、部署和调用(4分)
(1)解决代码错误和警告,正确编译并部署合约,成功获取部署的合约地址和abi。(1分)
(2)调用食品溯源智能合约的接口,完整验证业务流程。(3分)

任务2-2:智能合约测试(10分)
编写智能合约单元测试代码并完成合约功能测试、性能测试,具体要求如下:
1.配置区块链网络(2分)
启动区块链网络,创建新的Workspace,配置对外访问的RPC接口为7545,配置项目的配置文件config.js实现与新建Workspace的连接。
2.补充给定基础代码中注释提示的部署逻辑(2分)
基于VSCODE加载的测试项目,补全位于test文件夹中HelloWorld.js文件预操作的方法。在测试文件中添加预定义的方法(在其他方法启动前使用)。
3.补充代码中注释提示的测试逻辑(2分)
基于VSCODE加载的测试项目,补全位于test文件夹中HelloWorld.js文件,添加测试用例,测试智能合约的get方法。
4.测试hello.get()方法(2分)
基于VSCODE加载的测试项目,补全位于test文件夹中HelloWorld.js文件,添加测试用例,测试智能合约的hello.get()方法。
5.测试.should.equal进行对比判断(2分)
基于VSCODE加载的测试项目,补全位于test文件夹中HelloWorld.js文件,添加测试用例,测试智能合约的equal字符串比较方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺仔Sec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值