Practical 7
Practical 7
Practical - 7
Aim: Consider a scenario of developing a smart contract between a teacher and a student
for
assignment submission. Implement important functions that you would include in your
smart contract.
Code:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract TeacherStudentAssignment {
address public teacher;
struct Assignment {
uint id;
string title;
string description;
uint deadline;
bool isActive;
}
struct Submission {
string content;
uint submitTime;
uint grade;
bool isGraded;
}
// Assignments storage
uint public Total_assignments;
mapping(uint => Assignment) public assignments;
// Constructor
constructor() {
teacher = msg.sender;
Total_assignments = 0;
}
modifier onlyTeacher() {
require(msg.sender == teacher, "Only teacher can perform this action");
_;
}
assignments[Total_assignments] = Assignment({
id: Total_assignments,
title: _title,
description: _description,
deadline: deadline,
isActive: true
});
Total_assignments++;
}
// Get all available assignments (that haven't been submitted by the calling student)
function S_Available_Assignments() public view returns (
uint[] memory ids,
string[] memory titles,
uint[] memory deadlines
){
// Count active assignments that haven't been submitted by this student
uint availableCount = 0;
for (uint i = 0; i < Total_assignments; i++) {
if (assignments[i].isActive &&
submissions[i][msg.sender].submitTime == 0) {
availableCount++;
}
}
submissions[_assignmentId][msg.sender] = Submission({
content: _content,
submitTime: block.timestamp,
grade: 0,
isGraded: false
});
}
// fill result
uint index = 0;
for (uint i = 0; i < Total_assignments; i++) {
for (uint j = 0; j < assignmentStudents[i].length; j++) {
address student = assignmentStudents[i][j];
if (!submissions[i][student].isGraded) {
assignmentIds[index] = i;
students[index] = student;
assignmentTitles[index] = assignments[i].title;
index++;
}
}
}
submission.grade = _grade;
submission.isGraded = true;
}
// Student views for their own submissions (both graded and ungraded)
function S_MySubmissions() public view returns (
uint[] memory assignmentIds,
string[] memory assignmentTitles,
bool[] memory isGraded,
uint[] memory grades
22012011052 U.V.Patel College of Engineering Karan Yadav
2CEIT6PE10_BLOCKCHAIN TECHNOLOGIES
){
uint submissionCount = 0;
for (uint i = 0; i < Total_assignments; i++) {
if (submissions[i][msg.sender].submitTime > 0) {
submissionCount++;
}
}
uint index = 0;
for (uint i = 0; i < Total_assignments; i++) {
if (submissions[i][msg.sender].submitTime > 0) {
assignmentIds[index] = i;
assignmentTitles[index] = assignments[i].title;
isGraded[index] = submissions[i][msg.sender].isGraded;
grades[index] = submissions[i][msg.sender].grade;
index++;
}
}
Output:
Creating Assignment by Teacher:
Conclusion:
This smart contract creates a transparent and efficient system for managing academic assignments.
Teachers can create and grade assignments while tracking student submissions, and students can
view available tasks and their graded work. The blockchain-based approach ensures submission
timestamps are accurate and grades remain tamper-proof. This demonstrates how smart contracts
can streamline educational workflows while maintaining accountability for both teachers and
students.