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

news/2024/9/29 14:23:31/

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

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

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

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;// 学籍信息合约
contract Roll {// 学籍信息结构体struct RollInfo {uint256 studentId;    // 学生IDstring 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.ppmy.cn/news/1531949.html

相关文章

电脑自带dll修复在哪里,dll丢失的6种解决方法总结

在现代科技日新月异的时代,电脑已经成为我们生活中不可或缺的一部分。然而,在使用电脑的过程中,我们常常会遇到一些常见的问题,其中之一就是dll文件丢失或损坏。当这些dll文件丢失或损坏时,可能会导致某些应用程序无法…

Promise从入门到提高实战教程

一、Promiss 介绍 Promise是一门新的技术(ES6规范),是JS中进行异步编程的新解决方案。 从语法上说,他是一个构造函数,Promise对象用来封装一个异步操作并可以获取成功/失败的结果值。(也就是包裹一个异步操作)创造Promise实例时,必须传入一个函数作为参数,一般传递一…

【FastAPI】使用 SQLAlchemy 和 FastAPI 实现 PostgreSQL 中的 JSON 数据 CRUD 操作

在现代 web 开发中,处理 JSON 数据变得越来越普遍。本文将指导你如何使用 FastAPI 和 SQLAlchemy 实现对 PostgreSQL 数据库中 JSON 数据的增删改查(CRUD)操作。 环境准备 首先,确保你已经安装了所需的库。在终端中运行以下命令…

RPA助力企业办公流程自动化:真实应用案例展示

在当今快速变化的商业环境中,企业面临着前所未有的挑战和机遇。数字化转型已成为企业提升竞争力、优化运营效率和增强客户体验的关键策略。RPA数字员工作为这一转型过程中的重要工具,正在帮助企业实现办公流程的自动化,从而加速数字化转型的步…

node后端react前端简单实例

安装node mkdir my-node-server cd my-node-server npm init -y npm install express cors 创建 server.js文件 const express require(express); const cors require(cors); const app express(); const PORT 4000; app.use(cors()); // 允许跨域请求 app.get(/api…

[java][git]git学习

Git 什么是Git? Git是一款源代码管理工具(版本控制工具) 我们写的代码需要使用Git进行管理。 源代码有必要管理起吗?1.02.0 //svn,vss,vcs… git有必要,因为人工的去处理不同的版本,做相应备份会很麻烦。Git是linux之父当年为了维护linux—…

浅谈C++之线程管理

一、基本介绍 C11 提供了强大的多线程支持,涵盖了线程的创建、同步、共享数据管理等,极大简化了多线程编程的复杂性。 线程:一个程序执行流的最小单位。每个线程都有自己的程序计数器、栈、寄存器等。多线程:程序可以同时执行多个…

JIT(Just-In-Time)

JIT(Just-In-Time)即时编译是一种在程序运行时动态编译字节码为机器码的技术,常用于提高代码执行效率。它结合了解释型语言的灵活性与编译型语言的高效性。 JIT 的工作原理 字节码执行:JIT 编译器首先会以字节码的形式执行代码&…