当前位置: 首页 > article >正文

一带一路区块链赛项样题解析(中)

一带一路区块链赛项样题解析 (模块二)

标题任务一 按要求完成智能合约开发

1、学籍信息合约(Roll)接口编码(6分)

(1)编写学籍信息合约中的RollInfo 实体接口,完成RollInfo实体通用数据的初始化,实现可追溯的学籍信息上链功能;(2分)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// 学籍信息合约
contract Roll {
    // 学籍信息结构体
    struct RollInfo {
        uint256 studentId;    // 学生ID
        string studentName;    // 学生姓名
        string schoolName;     // 学校名称
        uint8 status;          // 学籍状态 (0: 离校, 1: 在籍)
        uint256 uploadTime;    // 上传时间
    }

    // 存储学籍信息的映射
    mapping(uint256 => RollInfo) public rollInfos;

(2)编写学籍信息RollInfo上链信息接口,在其构造函数中设置学籍状态为在籍,设置上传时间为当前时间;(2分)

// 构造函数,初始化学籍信息
    constructor(uint256 _studentId, string memory _studentName, string memory _schoolName) {
        rollInfos[_studentId] = RollInfo({
            studentId: _studentId,
            studentName: _studentName,
            schoolName: _schoolName,
            status: 1, // 默认状态为在籍
            uploadTime: block.timestamp // 当前时间
        });
    }

(3)编写学籍信息上链信息接口,实现学籍中就读学校信息的更新。(2分)

 // 更新学校名称
    function updateSchool(uint256 _studentId, string memory _newSchoolName) public {
        rollInfos[_studentId].schoolName = _newSchoolName;
    }
}

2、用户信息合约(User)接口编码(4分)

(1)编写用户信息合约接口,完善增加用户addUser()函数,实现学籍认证系统用户的添加;(2分)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// 用户信息合约
contract User {
    // 存储用户角色的映射
    mapping(address => bool) private operators;

    // 添加用户
    function addUser(address _user) public {
        operators[_user] = true; // 将用户设置为操作员
    }

(2)编写用户信息合约接口,完善用户角色判断isOperater()函数,实现信息获取的权限控制。(2分)

 // 判断用户是否为操作员
    function isOperater(address _user) public view returns (bool) {
        return operators[_user]; // 返回操作员状态
    }
}

3、学校学籍(SchoolRoll)接口编码(8分)

(1)编写学校学籍管理接口,完善removeRoll()函数实现学籍信息的删除;(2分)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// 导入 Roll 合约
import "./Roll.sol"; 

// 学校学籍管理合约
contract SchoolRoll {
    // 存储学籍信息的映射
    mapping(uint256 => Roll.RollInfo) public rollInfos;
function addRoll(uint256 _studentId, string memory _studentName, string memory _schoolName) public {
        rollInfos[_studentId] = Roll.RollInfo({
            studentId: _studentId,
            studentName: _studentName,
            schoolName: _schoolName,
            status: 1, // 在籍
            uploadTime: block.timestamp // 当前时间
        });
        rollCount++; // 更新学籍数量
    }

(2)编写学校学籍管理接口,完善queryRoll()函数实现学籍信息存在与否的验证;(2分)

  // 查询学籍信息是否存在
    function queryRoll(uint256 _studentId) public view returns (bool) {
        return rollInfos[_studentId].studentId != 0; // 检查学籍ID是否存在
    }

(3)编写学校学籍管理接口,完善transRoll()函数实现学籍的转移;(2分)

 // 转移学籍到新学校
    function transRoll(uint256 _studentId, string memory _newSchoolName) public {
        rollInfos[_studentId].schoolName = _newSchoolName; // 更新学校名称
    }

(4)编写学校学籍管理接口,完善updateStatus()函数实现学籍状态的更新。(2分)

 // 更新学籍状态
    function updateStatus(uint256 _studentId, uint8 _newStatus) public {
        rollInfos[_studentId].status = _newStatus; // 更新学籍状态
    }
}

任务二 按要求完成智能合约的编译、部署与调用

1、启动WeBASE-Front服务,使用浏览器登陆WeBASE-Front管理平台;(1分)

在这里插入图片描述

2、正确编译并部署上题中的智能合约,调用相关接口验证智能合约的业务流程。

要求如下:

(1)使用WeBASE-Front管理平台编译、部署“Roll.sol”、“User.sol”、“SchoolRoll.sol”合约,获取三个合约的abi;(1分)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(2)测试Roll.sol合约,先调用getRollInfo()获取学籍信息,再调用updateRollStatus()更新学籍状态为1并验证是否修改成功;(1分)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(3)测试User.sol合约,先调用addUser()添加用户,再调用isOperater()判断其是否为管理人员;(1分)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(4)测试SchoolRoll.sol合约,调用addRoll()添加学籍信息,调用转移学籍transroll()实现学籍信息的变更,并通过获取学籍信息getRoll()验证是否成功。(1分)

在这里插入图片描述

在这里插入图片描述

任务三 按要求完成智能合约的功能测试

1、在~/fisco目录下创建文件夹truffle_test1文件夹,在该文件夹下完成脚本编写与测试。启动ganache-cli环境,要求配置监听端口为7545,网络ID为5777。使用truffle 编写User、SchoolRoll合约的部署脚本并测试SchoolRoll.sol合约;(2分)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、编写第一个测试用例,通过校验学生账户表的长度来验证SchoolRoll.sol智能合约中addRoll()功能的正确性;在test目录中新建“SchoolRoll.js”文件,完成验证addRoll()功能的正确性;(2分)

// SPDX-License-Identifier: MIT
const {
    expect } = require("chai");
const {
    ethers } = require("hardhat");

describe("SchoolRoll Contract", function () {
   
    let SchoolRoll;
    let schoolRoll;

    // 部署合约前的设置
    before(async function () {
   
        SchoolRoll = await ethers.getContractFactory("SchoolRoll");
        schoolRoll = await SchoolRoll.deploy();
        await schoolRoll.deployed();
    });

    // 测试 addRoll() 方法
    it("should add a student roll and increase the roll count", async function () {
   
        const studentId = 1;
        const studentName = "Alice";
        const schoolName = "XYZ School";

        // 调用 addRoll 方法
        await schoolRoll.addRoll(studentId, studentName, schoolName);

        // 验证学生学籍信息的长度
        const rollInfo = await schoolRoll.rollInfos(studentId);
        expect(rollInfo.studentId).to.equal(studentId);
        expect(rollInfo.studentName).to.equal(studentName);
        expect(rollInfo.schoolName).to.equal(schoolName);
        expect(rollInfo.status).to.equal(1); // 在籍
        expect(rollInfo.uploadTime).to.be.above(0); // 上传时间应该是有效的时间戳
    

http://www.kler.cn/news/319847.html

相关文章:

  • C++——求3*3矩阵对角元素之和。
  • 第164天:应急响应-挖矿脚本检测指南_威胁情报_样本定性_文件清除_入口修复
  • ubuntu系统插入u盘不识别
  • 从一个Vite Vue项目开始 - 整体设计
  • 软件设计模式——工厂模式
  • 招行科技笔试——合并区间,移动零
  • 加入AI新引擎,华为数据中台全面智能化升级
  • Java 发布jar包到maven中央仓库(2024年9月保姆级教程)
  • PPTP、L2TP、SSTP协议和HTTP、SOCKS5代理:全面解析与对比
  • Kafka-Manager安装及操作
  • Linux文件IO-基础知识了解及文件描述符
  • 模拟自然的本质:与IBM量子计算研究的问答
  • 函数组件、Hooks和类组件区别
  • 使用php生成图片
  • 第 1 章:Vue 核心
  • Spring Boot 入门指南
  • C++ 字符串中的第一个唯一字符 - 力扣(LeetCode)
  • linux固定串口别名
  • Java发送Outlook邮件:从设置到发送攻略!
  • Qt 每日面试题 -3
  • mysql学习教程,从入门到精通,SQL FULL JOIN 语句(25)
  • mysql离线脚本安装
  • 【C++算法】哈希表
  • vs2022 程序包管理器控制台中文乱码
  • 100个ChatGPT学术指令—助你高效完成文献综述撰写!
  • 深入理解同步和异步与reactor和proactor模式
  • 【递归】5.leetcode 872 叶子相似的树
  • 南开大学联合同济大学发布最新SOTA Occ OPUS:使用稀疏集进行占据预测,最快实现8帧22FPS
  • 什么是服务器日志,日志有什么作用?
  • 2-103 基于matlab的光电信号下血氧饱和度计算