版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
智能合约开发实战单元6设计与开发图书馆合约任务6.1实现图书合约与学生合约任务描述知识准备任务实现任务描述在数字化和去中心化的时代,传统的图书管理系统面临诸多问题,如信息不透明、借阅记录易篡改等。为了提高图书管理的透明性,我们计划通过智能合约实现一个基于区块链的图书管理系统。该系统将通过两个合约模块:图书合约(Book.sol)和学生合约(Student.sol),来实现图书信息的管理和学生借阅记录的追踪。任务要求:1.编写Book.sol合约:-声明书籍信息和借阅状态相关的状态变量(书名、作者、ISBN、状态、借阅历史等)。-实现图书信息的初始化、更新和查询功能。-实现书籍状态的修改和查询功能。-实现借阅记录的添加和查询功能。2.编写Student.sol合约:-声明学生信息和借阅历史相关的状态变量(姓名、学号、借阅历史等)。-实现学生信息的初始化和查询功能。-实现借阅记录的添加和查询功能。知识准备
6.1.1枚举类型(enum)6.1.2事件6.1.1枚举类型(enum)枚举(enum)是一种用户自定义的数据类型,主要用于表示具有有限个可能值的一组常量。枚举可以用来提高代码的可读性和可维护性,因为它能够明确指定变量的取值范围,避免使用普通整数或字符串时可能出现的错误。通过枚举,你可以给一组相关的常量赋予有意义的名字,而不仅仅是数字。例如,假设你正在编写一个智能合约,需要跟踪任务的状态,任务的状态可以是待处理、进行中和已完成。枚举类型正是处理这类有限的状态集合的理想方式。1.什么是枚举类型?6.1.1枚举类型(enum)使用enum关键字来定义枚举类型,基本语法如下:-EnumName:枚举类型的名称。-Value1,Value2,...,ValueN:枚举成员的名称,表示有限的常量值。2.如何定义枚举类型?例如,定义一个简单的枚举类型表示任务的状态:在这个例子中,Status是枚举类型的名称,包含三个值:Pending、Active和Completed。默认情况下,枚举的第一个成员的值为0,第二个成员为1,例如:-Pending的默认值是0-Active的默认值是1-Completed的默认值是26.1.1枚举类型(enum)除了默认从0开始递增外,你也可以为枚举成员指定特定的值。这使得你能够更灵活地控制每个枚举成员的表示。自定义值时,你只需要为枚举成员指定整数值。例如:在这个例子中:-Pending的值是0-Active的值是10-Completed的值是1003.如何自定义枚举成员的值?6.1.1枚举类型(enum)代码示例【例6-1】使用枚举实现状态切换4.枚举类型的使用6.1.2事件事件(Events)是Solidity中的一种机制,用于在区块链上记录日志。事件允许智能合约在发生某些操作时向外界发布信息,外部应用可以通过监听这些事件来响应相应的操作。事件在区块链上存储为日志,并且不影响智能合约的执行逻辑。事件通过event关键字定义,通常放在合约的顶部。事件可以有多个参数,参数可以带indexed修饰符,用于通过参数值索引事件。其语法如下:MyEvent是一个事件,它有两个参数:一个address类型的sender和一个uint256类型的value。indexed关键字允许该字段在日志中被索引,这意味着可以高效地搜索事件。1.定义事件6.1.2事件在函数内部通过emit关键字触发事件,传递相应的参数。其语法如下:当调用doSomething函数时,将触发MyEvent事件,并将当前调用者的地址和函数接收的参数_value作为事件参数。2.触发事件6.1.2事件代码示例【例6-2】使用事件记录用户在合约中存储和取回的资金2.触发事件任务实现步骤1:编写图书合约步骤2:编写学生合约任务实现(1)声明和状态变量在这个合约中,我们首先声明了一些用于管理图书信息的状态变量:-title:表示书籍的名称。-writer:表示书籍的作者。-isbn:书籍的唯一编号(ISBN)。-currentState:表示书籍的状态,使用一个枚举类型Status来表示。Status包含两个值:Available(可借)和Borrowed(已借出)。-borrowingHistory:这是一个地址数组,用于记录所有曾借阅过该书籍的用户地址。步骤1:编写图书合约(Book.sol)任务实现(2)构造函数合约的构造函数用于初始化书籍的基本信息。当合约部署时,我们需要传入书籍的名称、作者和编号来初始化这些信息。同时,书籍的初始状态设为Available,即该书籍一开始是可借的。步骤1:编写图书合约(Book.sol)任务实现(3)修改和获取书籍信息步骤1:编写图书合约(Book.sol)任务实现(4)修改和获取书籍状态步骤1:编写图书合约(Book.sol)任务实现(5)管理借阅记录这段代码包含两个函数,用于管理借阅历史:-addRecord():记录借阅者的地址。每当一个用户借阅该书籍时,我们将其地址添加到borrowingHistory数组中。-getRecords():返回所有借阅过该书籍的地址数组。此函数允许查看所有借阅历史,以便追踪书籍的借阅情况。步骤1:编写图书合约(Book.sol)任务实现(1)初始化学生信息在合约的开始部分,我们声明了学生的基本信息:-name:学生的姓名。-studentId:学生的唯一编号。-borrowingHistory:一个地址数组,用于记录学生借阅过的所有图书的地址。通过构造函数,我们初始化了学生的姓名和学生编号。这些信息在合约部署时提供,并且在整个生命周期内保持不变。步骤2:编写学生合约(Student.sol)任务实现(2)获取学生信息该函数getInfo()用于返回学生的基本信息,包括学生姓名和学生编号。这个函数是view类型的,不会修改区块链状态,只会读取合约的状态变量。步骤2:编写学生合约(Student.sol)任务实现(3)添加借阅记录addRecord()函数用于记录学生借阅的图书。当学生借阅一本书时,图书的地址(_book)会被添加到borrowingHistory数组中。通过这种方式,我们能够追踪每个学生借阅过的所有图书。步骤2:编写学生合约(Student.sol)任务实现(4)获取借阅记录该函数getRecords()返回一个地址数组,记录了学生借阅的所有图书的地址。通过这个函数,任何人都可以查看学生的借阅历史,了解学生曾经借阅过哪些图书。步骤2:编写学生合约(Student.sol)任务6.2实现图书馆合约任务描述知识准备任务实现任务描述基于区块链的图书管理系统中,Librarian.sol作为管理员合约,可调用Book.sol和Student.sol实现图书借阅、归还及记录维护。具体需求如下:图书管理(管理员操作)增/删/改图书(添加时生成唯一ID,删除仅允许“可借”状态图书);查询图书总数、单本信息(ID查标题/作者/ISBN/状态)、所有图书地址、单本图书借阅历史。学生管理(管理员操作)添加学生(记录姓名、学号);支持查询学生借阅历史。借阅归还管理借阅:学生最多借5本,借阅后图书标为“已借出”,记录借阅历史;归还:归还后图书恢复“可借”,更新学生借阅计数;事件:借阅/归还时分别触发BookBorrowed/BookReturned事件记录操作。合约部署与调用部署Librarian合约,统管图书、学生及借阅归还流程;可调用操作:添加/查询图书、添加学生、学生借阅/归还图书、查询学生/单本图书的借阅历史。知识准备
6.2.1import语句6.2.2实例化合约6.2.1import语句import语句用于引入其他Solidity文件中的代码。import语句可以放在合约文件的任何位置,但通常放在文件的开头。其语法包括:(1)绝对路径导入用于从外部URL或者特定路径加载文件。常用于引入官方库或第三方依赖。(2)相对路径导入用于从本地文件系统的相对路径加载文件,适合在项目内部模块之间相互引用。1.导入文件import"/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";//从当前目录导入import"./ERC20.sol";//从上一级目录导入import"../utils/SafeMath.sol";6.2.2实例化合约new关键字用于部署和实例化一个新的合约实例。使用new关键字时,会在区块链上创建一个新的合约实例,并返回该实例的地址。可以通过该地址与新部署的合约进行交互。-ContractType:要实例化的合约类型。-variableName:用于存储实例化合约的变量名。-constructorArguments:构造函数参数(如果有)。1.使用new关键字ContractTypevariableName=newContractType(constructorArguments);6.2.2实例化合约示例项目结构创建两个简单的合约文件:MathContract.sol和Calculator.sol。文件结构如下:1.使用new关键字MathContract.sol的内容如下:MathContract合约提供两个纯函数add和subtract,用于计算两个无符号整数的和和差。6.2.2实例化合约Calculator.sol的内容如下:当部署Calculator合约时,合约会自动使用new关键字部署一个新的MathContract合约实例。部署完成后,可以通过Calculator合约的地址与其进行交互,同时Calculator合约内部通过math变量与MathContract实例进行交互,调用其add和subtract函数来实现加减运算。1.使用new关键字6.2.2实例化合约Calculator.sol的内容如下:Calculator.sol合约展示了如何通过传入现有合约的地址来与另一个合约进行交互。部署Calculator合约时,需要传入一个已经部署好的MathContract合约的地址。部署完成后,可以通过Calculator合约的地址与其进行交互,同时Calculator合约内部通过math变量与传入的MathContract实例进行交互,调用其add和subtract函数来实现加减运算。2.直接引用已知地址的合约任务实现步骤1:编写图书馆合约步骤2:部署合约步骤3:调用合约任务实现(1)合约导入这部分代码声明了合约的编译器版本0.6.10和启用了实验性的ABIEncoderV2,使得合约可以支持复杂数据类型的编码。它还导入了Book.sol和Student.sol合约,以便图书馆合约能够管理图书和学生的相关信息。步骤1:编写图书馆合约任务实现(2)数据结构及变量声明步骤1:编写图书馆合约任务实现(3)图书管理函数这部分代码实现了对图书馆管理的多个功能,包括图书的添加、删除、信息更新、数量查询等操作。各个函数的具体功能如下:①创建新图书并添加到图书馆步骤1:编写图书馆合约任务实现②删除图书步骤1:编写图书馆合约(Librarian.sol)任务实现③修改图书信息步骤1:编写图书馆合约(Librarian.sol)任务实现④获取图书数量⑤获取图书信息步骤1:编写图书馆合约任务实现⑥获取所有图书的地址步骤1:编写图书馆合约任务实现(4)学生管理函数步骤1:编写图书馆合约任务实现(5)借阅和归还图书功能①借阅图书步骤1:编写图书馆合约任务实现②归还图书步骤1:编写图书馆合约(Librarian.sol)任务实现(6)获取借阅记录功能①获取图书的借阅记录步骤1:编写图书馆合约(Librarian.sol)任务实现②获取学生的借阅记录步骤1:编写图书馆合约(Librarian.sol)任务实现(1)初始化Truffle项目首先,我们需要创建一个新的目录并初始化Truffle项目。执行以下命令:(2)编写智能合约在运行truffleinit命令后,Truffle会生成一个标准的项目目录结构。在此基础上,在contracts目录下创建名Logistics.sol、Book.sol、Student.sol和Librarian.sol合约文件,并在migrations目录下生成一个名为1_deploy_Librarian.js的迁移脚本文件。步骤2:部署合约任务实现(3)编写迁移脚本编辑migrations目录下的1_deploy_Librarian
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于非二进制冗余的Pipelined SAR ADC的研究与设计
- 2026年四川汽车职业技术学院单招职业倾向性考试题库带答案详解(满分必刷)
- 2026年四川汽车职业技术学院单招职业技能考试题库含答案详解(培优b卷)
- 2026年四川现代职业学院单招综合素质考试题库及一套答案详解
- 2026年四川现代职业学院单招职业倾向性考试题库带答案详解(巩固)
- 2026年四川现代职业学院单招职业适应性测试题库带答案详解(综合卷)
- 2026年四川电力职业技术学院单招职业倾向性测试题库含答案详解(巩固)
- 2026年四川电力职业技术学院单招职业技能测试题库附答案详解(综合题)
- 2026年四川电子机械职业技术学院单招综合素质考试题库含答案详解(典型题)
- 2025年广西艺术学院公开招聘外籍青年人才备考题库及答案详解(考点梳理)
- 校园宿管员培训课件
- 安全用电培训内容及要求课件
- 危险品全员安全培训方案课件
- 屋顶彩钢瓦施工流程
- (新教材)2026年人教版一年级下册数学 7.2 复习与关联 数与运算(2) 课件
- 询证函复函协议书
- 2025 九年级数学下册二次函数与一次函数交点问题课件
- 2022青鸟消防JBF5131A 型输入模块使用说明书
- 五个带头方面整改措施
- 2026年江苏海事职业技术学院单招职业倾向性测试必刷测试卷含答案
- 2026年内蒙古机电职业技术学院单招职业技能考试题库及答案解析(夺冠)
评论
0/150
提交评论