以太坊智能合约开发(五):Solidity成绩录入智能合约实验

这篇具有很好参考价值的文章主要介绍了以太坊智能合约开发(五):Solidity成绩录入智能合约实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1 编写智能合约

每个学生分别部署合约Student.sol ,保证只有自己可以修改姓名。老师部署合约StudentScore.sol,用于录入学生成绩,查询学生信息。查询学生信息时,需要调用学生部署的合约Student.sol。
student.sol合约,用于学生对自己信息进行管理。

  • 学生的基本信息作为状态变量:
	pragma solidity ^0.4.0;
	contract Student{
	    string studentID;
	    string studentName;
	    address owner;
	}
  • 声明构造函数,在构造函数中将owner设置为调用者的address:
	constructor(string _studentID, string _stdentName) public{
		studentID = _studentID;
		studentName = _stdentName;
		owner = msg.sender;
	}
  • 声明函数修饰器,可以将其加在函数中,在函数执行前进行判断,来检查调用者是否为学生本人,只有本人才能调用该函数:
	modifier onlyOwner(){
    	require(msg.sender == owner,"only owner can call this function");
    	_;
	}
  • get和set方法,其中set方法加入了函数修饰器:
    function getStudentIDandName() public constant returns(string,string) {
    	return (studentID,studentName);
    }

    function setStudentIDandName(string _studentID,string _studentName) public onlyOwner {
    	studentID = _studentID;
    	studentName = _studentName;
    }

Teacher.sol合约,用于录入、查询学生成绩文章来源地址https://www.toymoban.com/news/detail-465875.html

  • 导入Student合约:
	pragma solidity ^0.4.11;
	import "./Student.sol";
  • 学生的相关成绩作为状态变量,totalScore为全班总成绩,studentCount全班学生数量,owner部署合约的账户地址。同时声明映射studentAddrMap,studentScoreMap,将学生ID分别映射为学生地址和学生成绩。事件studentNotExistsEvent用于存储学生ID号
	contract StudentScore{
	    uint totalScore;
	    uint studentCount;
	    address owner;
	    mapping(string => address) studentAddrMap;
	    mapping(string => uint) studentScoreMap;
	    event studentNotExistsEvent(string studentID);
	}
  • 声明自定义修饰符onlyOwner,只有老师地址才能执行这些函数。
	modifier onlyOwner(){
        require(msg.sender == owner,"only owner can call this function");
        _;
    }
  • 函数addStudentScore,modifyScoreByStudentId分别用于老师添加或修改学生成绩:
    function addStudentScore(string studentID, address student, uint score) public onlyOwner {    
        studentAddrMap[studentID] = student;
        studentScoreMap[studentID] = score;
        totalScore += score;
        studentCount ++;
    }
    
    function modifyScoreByStudentId(string studentID, uint score) public onlyOwner{
        if(!studentExists(studentID)) {
            studentNotExistsEvent(studentID);
            return;
        }
        totalScore -= studentScoreMap[studentID];
        studentScoreMap[studentID] = score;
        totalScore += score; 
    }
  • 函数getAvgScore用于查询全班学生平均成绩,函数studentExists用于判断学生ID是否存在,函数getScoreByStudentID用于学生查询自己的成绩。
    function getAvgScore() public view returns(uint){    
        return totalScore / studentCount;
    }
    function studentExists(string studentID) public view returns(bool){
        address student = Student(studentAddrMap[studentID]);
        if(student == 0x00){
            return false;
        }else{
            return true;
        }
    }
    function getScoreByStudentID(string studentID) public constant returns(string, string, uint){
        if(!studentExists(studentID)) {
            studentNotExistsEvent(studentID);
            return;
        }
        Student student = Student(studentAddrMap[studentID]);
        var studentName = student.getStudentName();
        uint score = studentScoreMap[studentID];
        return(studentID, studentName, score);
    }

到了这里,关于以太坊智能合约开发(五):Solidity成绩录入智能合约实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型,重点是值类型,包括布尔类型、整型、地址类型、字节类型、字符串类型和枚举类型。并且通过两个智能合约例子,用于演示这些数据类型的声明与使用方法。 访问 Github 仓库 获取更多资料。 Solidity中关于数据类型的定义如下: Solidity是

    2024年02月02日
    浏览(68)
  • 基于以太坊的智能合约开发Solidity(事件&日志篇)

    (1)事件用于记录在区块链上的特定活动,“emit ValueChanged(newValue);”语句的作用是触发ValueChanged事件(首先需要声明事件)。 ①触发事件后会生成相应日志,上图黄框就是“emit ValueChanged(newValue);”语句产生的日志,其中“form”指的是触发事件的合约账户。 ②事件主要是供

    2024年02月04日
    浏览(44)
  • 基于以太坊的智能合约开发Solidity(内存&结构体篇)

    参考教程:【内存、引用与持久化存储】1、内存与区块链——storage与memory原理_哔哩哔哩_bilibili (1)所有的复杂类型,即数组、结构和映射类型,都有一个额外属性——“数据位置”,用来说明数据是保存在内存memory中还是存储storage中,保存在memory中的数据,在函数执行完

    2024年02月04日
    浏览(57)
  • 以太坊智能合约语言Solidity - 3 数组

    1字节(Byte) = 8位 (bit), bytes32 = 256位,bytes1 实质上就等于 int8 固定长度的数组一旦被定义就无法再更改,并且长度在一开始就会被显式定义 我们再来创建一个新的文件用来编写代码 字节数组无法进行基本运算,但是可以比较 字节数组还支持其他一些逻辑运算,具体计算结果

    2023年04月08日
    浏览(62)
  • 第四章 以太坊智能合约solidity介绍

    Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言,设计的目的是能在以太坊虚拟机上运行。 本章大概介绍合约的基本信息,合约的组成,语法方面不做过多的介绍,个人建议多阅读官方文档效果更佳,后续的章节会开发ERC20代币合约案例以便于更好的学习智

    2024年02月06日
    浏览(51)
  • 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一)

    前面一篇关于 智能合约 翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用 程序语言 去编写 智能合约 了。 而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂 智能合约 代码,或找出其中的漏洞,那么,学习 Solidity 这门高级的智能合约语言是有

    2023年04月16日
    浏览(96)
  • Solidity智能合约开发 — 3.4-抽象智能合约和接口

    假如一个智能合约中至少一个函数缺省实现时,即某个函数缺少{}中的内容,这个智能合约就当做抽象智能合约。 当我们有一个函数没想好怎么写时,必须将该合约标为 abstract ,不然编译会报错;另外,未实现的函数需要加 virtual ,以便子合约重写。抽象智能合约是将智能合

    2024年02月12日
    浏览(46)
  • solidity开发智能合约

    起源于以太坊(Ethereum),设计的目的是能在以太坊虚拟机(EVM)上运行。Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。所以先从智能合约开始。 参考文档 Solidity文档:区块链技术-智能合约Solidity编程语言 solidity官方文档: https://solidity-cn.readthedocs.io/

    2023年04月08日
    浏览(83)
  • 区块链2——Solidity智能合约开发

    区块链 索引目录 智能合约是一种以代码形式编写的自动执行合约,它们运行在区块链上。这些合约定义了在特定条件下发生的事件以及相应的行为。 1.1 智能合约结构 版本声明(Version Declaration): 智能合约通常以声明版本开始,指定合约应该使用的Solidity编译器版本。例如

    2024年02月05日
    浏览(69)
  • Solidity智能合约开发 — 3.2-合约的fallback和函数重载

    每个智能合约有且仅有一个未命名的函数,称为fallback函数,没有参数且没有返回值,可见性必须是 external,且可以是 virtual的(即可以被重载),也可以有修改器 modifier。 fallback执行条件: 如果在一个合约的调用中,没有其他函数与给定的函数标识符匹配时(或没有提供调用

    2024年02月09日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包