基于Hyperledger Fabric的学位学历认证管理系统
项目源码:github.com/Pistachiout…
一、选题背景
学历造假、认证造假等是一个全球日益普遍的现象,不仅对社会产生了巨大的负面影响,同时也极大增加了企业和单位的用人成本,造成了无谓的经济消耗;从另一个角度来说,纸质或电子版的证书无论从保存便利性、验证可靠性、可信性等方面,都存在着很大的不足。一种高度可靠、易保存、易证伪同时还顾全隐私保护的学位学历认证管理系统,是一个必然的需求。
区块链是非中心化信任网络,适合作为此类分布式应用的底层架构和基础工具。区块链具有两大核心特点:一是数据难以篡改、二是去中心化。区块链所记录的信息更加真实可靠,可以帮助解决人们互不信任的问题。
二、功能分析
由于系统需要保证人才受教育情况真实性,所以对于系统的用户而言,不可能由用户自己添加相应的学历信息,而是由具有一定权限的用户来完成添加或修改的功能。但普通用户可以通过系统溯源功能来确定信息的真伪。所以我们将系统用户的使用角色分为两种:
- 普通用户
- 管理员用户
普通用户具有对数据的查询功能 ,但实现查询之前必须经过登录认证:
- 用户登录:系统只针对合法用户进行授权使用,所以用户必须先进行登录才能完成相应的功能。
- 查询实现:查询分为两种方式实现
- 根据证书编号与姓名查询:根据用户输入的证书编号与姓名进行查询。
- 根据身份证号码查询:根据用户输入指定的身份证号码进行查询,此功能可以实现溯源。
管理员用户除具有普通用户的功能之外,额外添加了两个功能:
- 添加信息:可以向系统中添加新的学历信息。
- 修改信息:针对已存在的学历信息进行修改。
最后需要达到的要求
三、架构设计
在此应用中需要编写实现完整的链码并通过业务层调用链码中的各个函数,以实现对数据状态的操作。界面为了方便用户操作使用,使用Web浏览器的方式实现。而且在此应用中我们将 Hyperledger Fabric 默认的状态数据库由 LevelDB 替换为 CouchDB 来实现
Fabric Network 结构包括几个组件,如 CA、MSP、Orderer 等 ,如下图所示
四、数据模型设计
由于需要向分类账本中保存数据,所以必须设计相关的结构体用于声明要保存的数据结构,用于方便的在应用中处理数据。
名称 | 数据类型 | 说明 |
---|---|---|
ObjectType | string | |
Name | string | 姓名 |
Gender | string | 性别 |
Nation | string | 民族 |
EntityID | string | 身份证号(记录的Key) |
Place | string | 籍贯 |
BirthDay | stirng | 出生日期 |
Photo | string | 照片 |
EnrollDate | string | 入学日期 |
GraduationDate | string | 毕(结)业日期 |
SchoolName | string | 所读学校名称 |
Major | string | 所读专业 |
QuaType | string | 学历类别(普通、成考等) |
Length | string | 学制(两年、三年、四年、五年) |
Mode | string | 学习形式(普通全日制) |
Level | string | 层次(专科、本科、研究生、博士) |
Graduation | string | 毕(结)业(毕业、结业) |
CertNo | string | 证书编号 |
Historys | []HistoryItem | 当前edu的详细历史记录 |
为了能够从当前的分类状态中查询出详细的历史操作记录,我们在 Education
中设计了一个类型为HistoryItem
数组的 Historys
成员,表示当前状态的历史记录集。
HistoryItem 结构体设计如下表所示:
名称 | 数据类型 | 说明 |
---|---|---|
TxId | string | 交易编号 |
Education | Education | 本次历史记录的详细信息 |
五、原型交互设计
js.design/v?i=8znNXl&…
六、链码及API操作
education/chaincode/edu.go实现了使用链码相关的API如GetState,PutState,GetQueryResult等对分类账本状态进行具体操作的各个函数:
- PutEdu:实现将指定的对象序列化后保存至分类账本中
- GetEduInfo:根据指定的Key(身份证号码)查询对应的状态,反序列后将对象返回
- getEduByQueryString:根据指定的查询字符串从 CouchDB 中查询状态
- addEdu:接收对象并调用 PutEdu 函数实现保存状态的功能
- queryEduByCertNoAndName:根据指定的证书编号与姓名查询状态
- queryEduInfoByEntityID:根据指定的身份证号码(Key)查询状态
- updateEdu:实现对状态进行编辑功能
七、数据存储
链上数据
是直接或者间接由区块链共识产生的数据,一般包括区块链节点数据
与智能合约代码
等
区块链节点数据
包括区块数据和状态数据两者
1.区块数据描述区块自身信息数据,实际是区块链上面发生的每一笔交易的记录(如添加学历信息,修改学历信息及对应的时间戳)
2.状态数据则是记录了每个账户和智能合约的当前状态(如张三的学历信息)
区块链节点的数据存储最普遍的方式就是存入我们的磁盘中间,而我们的区块链不会直接的访问我们的磁盘,而是通过特定的数据库如LevelIDB,CouchDB等独立和分布式的数据库来操作我们的数据
本项目选用CouchDB作为存储链上数据的数据库
八、Fabric优势
Fabric充分利用了模块化的设计、容器技术和密码学技术,使得系统具有可扩展、灵活和安全等特性。采用传统数据库或许可以实现部分区块链的功能,如设计只写数据库,设计访问权限,共享数据库,分布式协议等,但这不是数据库的功能,只是创造出一个另一种形势的“区块链”,传统数据库无法达到区块链的分布式和信任。
十、功能演示
http://localhost:9000/
输入管理员账号及密码登录验证成功,则进入系统首页面
在首页面中点击 查询范围链接,进入 help页面,
点击添加学历信息链接进入,添加学历信息页面
根据学历证书编号与姓名查询页面
根据身份证号码查询页面
根据身份证号码查询页面查询结果页面
编辑页面
编辑成功自动跳转到根据身份证号码查询结果页面
十一、Hyperledger explorer——Fabric浏览器
http:/localhost:8080/
Hyperledger Explorer是一个简单易用的开源工具,可以用于监视 区块链网络中的活动。Hyperledger Explorer支持Fabric、Iroha等 多种区块链,可以运行在MocOS和Ubuntu下。我们可以在这里看到链上的所有信息,例如交易的时间、区块的哈希值和数据的哈希值等。
浏览器部署教程——该教程仅供了解,本项目已经部署浏览器,不需要再部署,若有其他项目需要部署可参考该教程
十二、分布式数据库
CouchDB 数据库1:peer0节点7051端口 http:/localhost:5984/_utils
CouchDB 数据库2:peer1节点9051端口 http://localhost:7984/_utils
十三、不可篡改性
CouchDB数据库存取链上数据,将学历信息等数据写入到数据库,窜改数据库的数据时链上的数据没有改变,查询时返回数据为链上数据,所以篡改数据库不可修改系统返回数据。
十四、项目部署
部署流程:github.com/Pistachiout…
十五、总结
基于区块链的学历学位认证系统是一个利用区块链技术来防止学历造假的项目。该项目使用了go语言和Hyperledger Fabric超级账本框架,实现了以下功能:
- 增加学历:用户可以通过智能合约向区块链系统中添加自己的学历信息。
- 修改学历:用户可以通过智能合约修改自己在区块链系统中的学历信息,但是修改后的信息会留下痕迹,方 便追溯。
- 查询学历:用户可以通过智能合约查询自己或者其他用户在区块链系统中的学历信息,验证其真伪。
该项目有以下优点和创新点:
该项目遇到了以下困难和挑战:
- Fabric框架涉及多个组件和配置文件,需要花费较多时间来理解和搭建。
- Couchdb数据库需要创建索引来优化查询性能,并且需要考虑数据同步和一致性问题。
- Explorer应用程序需要与Fabric网络进行集成,并且需要适配不同版本和配置。
该项目有以下不足和改进空间:
- 学历信息只能由用户自己添加和修改,没有第三方机构来审核和认证。
- 学历信息没有加密处理,可能存在隐私泄露风险。
- Explorer应用程序没有提供用户认证和权限控制功能。`
通过参加这个项目实训,我不仅学习了go语言和Fabric框架,还深入了解了区块链技术的原理和应用。我感受到了区块链技术在学历认证领域的优势和潜力,也体会到了开发区块链应用的难度和挑战。这个项目让我收获了很多知识和经验,也激发了我对区块链技术的兴趣和热情。