基于Hyperledger Fabric的学位学历认证管理系统
基于Hyperledger Fabric的学位学历认证管理系统
项目源码:https://github.com/Pistachiout/Academic-Degree-BlockChain
一、选题背景
学历造假、认证造假等是一个全球日益普遍的现象,不仅对社会产生了巨大的负面影响,同时也极大增加了企业和单位的用人成本,造成了无谓的经济消耗;从另一个角度来说,纸质或电子版的证书无论从保存便利性、验证可靠性、可信性等方面,都存在着很大的不足。一种高度可靠、易保存、易证伪同时还顾全隐私保护的学位学历认证管理系统,是一个必然的需求。
区块链是非中心化信任网络,适合作为此类分布式应用的底层架构和基础工具。区块链具有两大核心特点:一是数据难以篡改、二是去中心化。区块链所记录的信息更加真实可靠,可以帮助解决人们互不信任的问题。
二、功能分析
由于系统需要保证人才受教育情况真实性,所以对于系统的用户而言,不可能由用户自己添加相应的学历信息,而是由具有一定权限的用户来完成添加或修改的功能。但普通用户可以通过系统溯源功能来确定信息的真伪。所以我们将系统用户的使用角色分为两种:
- 普通用户
- 管理员用户
普通用户具有对数据的查询功能 ,但实现查询之前必须经过登录认证:
- 用户登录:系统只针对合法用户进行授权使用,所以用户必须先进行登录才能完成相应的功能。
- 查询实现:查询分为两种方式实现
- 根据证书编号与姓名查询:根据用户输入的证书编号与姓名进行查询。
- 根据身份证号码查询:根据用户输入指定的身份证号码进行查询,此功能可以实现溯源。
管理员用户除具有普通用户的功能之外,额外添加了两个功能:
- 添加信息:可以向系统中添加新的学历信息。
- 修改信息:针对已存在的学历信息进行修改。
最后需要达到的要求
- 认证颁发时的数据生成和上链流程;
- 认证验证时的验证方法:核实电子证书文件的哈希值;
- 用户界面:证书生成、证书上链、证书查询、证书核验;
- 安全和隐私保护。
三、架构设计
在此应用中需要编写实现完整的链码并通过业务层调用链码中的各个函数,以实现对数据状态的操作。界面为了方便用户操作使用,使用Web浏览器的方式实现。而且在此应用中我们将 Hyperledger Fabric 默认的状态数据库由 LevelDB 替换为 CouchDB 来实现

Fabric Network 结构包括几个组件,如 CA、MSP、Orderer 等 ,如下图所示
- CA 代表证书颁发机构。它负责颁发和管理数字证书,用于识别 Fabric Network 中的参与者 。
- MSP 代表成员服务提供商。它定义了验证网络参与者身份和角色的规则和策略 。
- Orderer 是一个节点,它将交易排序成区块,并将它们发送给对等节点 。
- Org1 是属于 Fabric Network 的一个组织的例子。它可以有自己的 CA、MSP、策略和通道 。
- Peer0 和 Peer1 是属于 Org1 的两个节点。它们存储账本的副本并执行链码(智能合约)。

四、数据模型设计
由于需要向分类账本中保存数据,所以必须设计相关的结构体用于声明要保存的数据结构,用于方便的在应用中处理数据。
| 名称 | 数据类型 | 说明 |
|---|---|---|
| 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 | 本次历史记录的详细信息 |
五、原型交互设计
https://js.design/v?i=8znNXl&p=R9WgEyOBdM&f=iGC6qsWuq2qnKAa_mCCcF
六、链码API操作


七、数据存储
链上数据是直接或者间接由区块链共识产生的数据,一般包括区块链节点数据与智能合约代码等
区块链节点数据包括区块数据和状态数据两者
1.区块数据描述区块自身信息数据,实际是区块链上面发生的每一笔交易的记录(如添加学历信息,修改学历信息及对应的时间戳)
2.状态数据则是记录了每个账户和智能合约的当前状态(如张三的学历信息)
区块链节点的数据存储最普遍的方式就是存入我们的磁盘中间,而我们的区块链不会直接的访问我们的磁盘,而是通过特定的数据库如LevelIDB,CouchDB等独立和分布式的数据库来操作我们的数据

本项目选用CouchDB作为存储链上数据的数据库
八、Fabric优势
- 1.所有上链数据基于密码学数字签名,上链数据不可被第三方篡改,不可抵赖。
- 基于多参与方的共识算法,防止单方面作恶,修改自己链上历史数据。
- Fabric淡化了去中心化(Decentralized),而以分布式 (Distributed)代替,每个节点具有完整全账本,防止单机故障和数据丢失。
- .fabric采用中心化的CA机制来发放证书,只有持有有效证书的节点和用户才可以访问区块链上的账本数据,此外还有TLS加密通讯、通道隔离等技术,保证了数据的传播范围可控,防止数据被窃取。
Fabric充分利用了模块化的设计、容器技术和密码学技术,使得系统具有可扩展、灵活和安全等特性。采用传统数据库或许可以实现部分区块链的功能,如设计只写数据库,设计访问权限,共享数据库,分布式协议等,但这不是数据库的功能,只是创造出一个另一种形势的“区块链”,传统数据库无法达到区块链的分布式和信任。
十、功能演示
http://ip:9000/

输入管理员账号及密码登录验证成功,则进入系统首页面

在首页面中点击 查询范围链接,进入 help页面,

点击添加学历信息链接进入,添加学历信息页面

根据学历证书编号与姓名查询页面

根据身份证号码查询页面

根据身份证号码查询页面查询结果页面

编辑页面

编辑成功自动跳转到根据身份证号码查询结果页面

十一、Hyperledger explorer——Fabric浏览器
http://ip:8080/
Hyperledger Explorer是一个简单易用的开源工具,可以用于监视 区块链网络中的活动。Hyperledger Explorer支持Fabric、Iroha等 多种区块链,可以运行在MocOS和Ubuntu下。我们可以在这里看到链上的所有信息,例如交易的时间、区块的哈希值和数据的哈希值等。






十二、分布式数据库
peer0节点7051端口 http://ip:5984/_utils
peer1节点9051端口 http://ip:7984/_utils



十三、不可篡改性
CouchDB数据库存取链上数据,将学历信息等数据写入到数据库,窜改数据库的数据时链上的数据没有改变,查询时返回数据为链上数据,所以篡改数据库不可修改系统返回数据。


十四、项目部署
1.部署环境
•阿里云主机 Ubuntu 16.04 64 位(root 用户)
•Golang 语言 go1.17
•docker 18.09.7
•docker-compose 1.22.0
2.环境配置
2.1安装 docker 以及 docker-compose
使用 docker 可以方便的解决程序依赖的环境问题;并且后续需要使用到的 Hyperledger Fabric 框架官方也提供了相应的 docker 的容器。
安装 docker 命令:
sudo apt install docker.io
验证 docker 成功安装:docker version,结果如图所示:

为了方便管理多个 docker 容器,还需要安装 docker-compose:sudo apt install docker- compose;验证安装成功:docker-compose version;如图所示:

2.2安装 golang
区块链框架Hyperledger Fabric 目前支持Java、Go 等主流编程语言并提供了相应的SDK,但是支持最全面的还是 Golang,因此采用 Go 语言来进行开发是比较好的选择;
- 安装 Golang: wget https://dl.google.com/go/go1.17.0.linux-amd64.tar.gz
- .使用 tar 命令将压缩文件解压至指定路径/usr/local/下: tar -zxvf go1.17.0.linux-amd64.tar.gz -C /usr/local
- 最后是设置环境变量 GOHOME 以及 GOROOT: sudo vim /etc/profile 添加如下(当前用户为 root 用户,$HOME=/root):
export GOPATH=$HOME/go
export GOROOT=/usr/local/go,
export PATH=$GOROOT/bin:
- $PATH 激活环境变量: source /etc/profile
- 验证安装成功,使用 go version 结果如图所示:

3.项目部署
- 创建保存项目的文件夹: mkdir -p $GOPATH/src
- 进入文件夹: cd $GOPATH/src
- 从 github 仓库克隆项目: git clone https://github.com/bug-away-away/BlockChainCreditSystem.git
- 进入项目目录:cd education
- 添加项目开发需要依赖的 Golang 包:go mod tidy
命令可能会执行失败,此时设置代理即可:go env -w GOPROXY=https://goproxy.cn
4.启动项目
由于每次启动流程相对固定,因此编写脚本来自动清理 docker 然后启动项目在项目的目录下运行 clean_docker.sh 脚本即可启动项目:
./clean_docker.sh
项目启动成功的结果如图所示:

通过浏览器访问 9000 端口即可进入 web 端,结果如图所示:
: 
十五、总结
基于区块链的学历学位认证系统是一个利用区块链技术来防止学历造假的项目。该项目使用了go语言和Hyperledger Fabric超级账本框架,实现了以下功能:
- 增加学历:用户可以通过智能合约向区块链系统中添加自己的学历信息。
- 修改学历:用户可以通过智能合约修改自己在区块链系统中的学历信息,但是修改后的信息会留下痕迹,方 便追溯。
- 查询学历:用户可以通过智能合约查询自己或者其他用户在区块链系统中的学历信息,验证其真伪。
该项目有以下优点和创新点:
- 使用了Fabric与Couchdb数据库,实现了分布式数据库与不可篡改性。Fabric是一个支持多种共识机制和智能合约语言的企业级区块链平台,Couchdb是一个面向文档的数据库,可以存储复杂结构化数据,并支持富查询功能。Fabric账本是有序的、不可篡改的状态转换记录,包括区块链和世界状态两部分。区块链中保存着不可变的顺序记录,包含配置记录和交易记录。世界状态中维护账本的当前状态,方便应用快速查询。
- 使用了HyperledgerExplorer,实现了对区块链网络和数据的可视化监控。Explorer是一个基于web的应用程序,可以展示区块链网络中的节点、通道、交易、合约等信息,并提供图表和统计分析功能。用户可以通过浏览器查看网络中的信息,包括网络拓扑、区块信息、链码信息等等。
该项目遇到了以下困难和挑战:
- Fabric框架涉及多个组件和配置文件,需要花费较多时间来理解和搭建。
- Couchdb数据库需要创建索引来优化查询性能,并且需要考虑数据同步和一致性问题。
- Explorer应用程序需要与Fabric网络进行集成,并且需要适配不同版本和配置。
该项目有以下不足和改进空间:
- 学历信息只能由用户自己添加和修改,没有第三方机构来审核和认证。
- 学历信息没有加密处理,可能存在隐私泄露风险。
- Explorer应用程序没有提供用户认证和权限控制功能。`
通过参加这个项目实训,我不仅学习了go语言和Fabric框架,还深入了解了区块链技术的原理和应用。我感受到了区块链技术在学历认证领域的优势和潜力,也体会到了开发区块链应用的难度和挑战。这个项目让我收获了很多知识和经验,也激发了我对区块链技术的兴趣和热情。
相关文章:
基于Hyperledger Fabric的学位学历认证管理系统
基于Hyperledger Fabric的学位学历认证管理系统 项目源码:https://github.com/Pistachiout/Academic-Degree-BlockChain 一、选题背景 学历造假、认证造假等是一个全球日益普遍的现象,不仅对社会产生了巨大的负面影响,同时也极大增加了企业…...
jq条件判断验证,正则表达式
// 判断是否包含为至少8位及以上字符,大小写字母及特殊字符 jQuery.validator.addMethod("isPwd", function (value, element) { var pwdRegex new RegExp((?.*[0-9])(?.*[A-Z])(?.*[a-z])(?.*[^a-zA-Z0-9]).{8,30}); return this.optional(elemen…...
23.3.9打卡 AtCoder Beginner Contest 259
A题 题解 对于x特判一下就好 代码 void solve() {ll x,d;cin>>n>>m>>x>>t>>d;if(n>m){nmin(n,x);if(n<m){cout<<t;return;}cout<<(m-n)*dt;}else{mmin(m,x);cout<<(m-n)*dt;}return; }B 三角函数全还给高中老师了 题…...
JS - this指向
一 this 指向有哪几种 详细可见:https://juejin.cn/post/6844903805587619854 (文章归类this指向为四大类) https://www.jianshu.com/p/66eb9b21105d this是什么?this 就是一个指针,指向调用函数的对象。 1.默认绑定…...
低代码有哪些典型应用场景?
低代码有哪些典型应用场景? 低代码是一种全新的应用开发方式,它通过可视化的拖拽式界面,将传统的繁琐代码编写转化为简单的拖拽操作,让非技术人员也能够快速地开发出应用程序。 随着数字化转型的不断加速,低代码平台…...
Substrate 基础教程(Tutorials) -- 监控节点指标
Substrate 公开有关网络操作的度量。例如,您可以收集有关您的节点连接了多少个对等节点、您的节点使用了多少内存以及正在生成的块数量的信息。为了捕获和可视化Substrate节点公开的度量,您可以配置和使用Prometheus和Grafana等工具。本教程演示如何使用…...
lua table 详解
文章目录1.table 声明与访问2. table 的两种遍历方式 pairs 和 ipairs2.1 pairs2.2 ipairs2.3 例3.迭代器实现 ipairs 效果4.获取 table 长度4.1 #table 获取长度4.2 自定义函数获取 table 长度注意事项1.table 声明与访问 -- 初始化表 tbl {} -- 不可以是 tbl nil-- 赋值 -…...
Element表单嵌套树形表格的校验问题
普通嵌套 表单和表格是项目中最常见的项目,有时候就会遇到表格嵌套表单的情况,比如 这种形式的其实挺好处理的,如下: <el-form:model"states"ref"tableFormRef"label-width"80px"label-posit…...
1.webpack的基本使用
webpack是做工程化用的,并且可以对代码进行压缩(搞成min.js那样),处理浏览器端JS兼容性,性能优化 vue-cli与webpack作用相同 目录 1 基本使用 1.1 引入场景 1.2 安装webpack 1.3 配置webpack 1.4 使用webpack 2 webpack.config.…...
面试必看:谈谈你所了解的JVM调优,JVM性能调优总结
文章目录从面试角度来谈谈你了解的JVM调优GC调优的步骤1.确定目标:2.优化参数3.验收优化结果GC优化案例一、Major GC和Minor GC频繁优化Minor GC频繁问题:1.可以适当增大新生代的内存二、请求高峰期发生GC,导致服务可用性降低优化标记停顿时间…...
Pytorch优化器Optimizer
优化器Optimizer 什么是优化器 pytorch的优化器:管理并更新模型中可学习参数的值,使得模型输出更接近真实标签 导数:函数在指定坐标轴上的变化率 方向导数:指定方向上的变化率(二元及以上函数,偏导数&am…...
如何在MySQL 8中实现数据迁移?这里有一个简单易用的方案
文章目录前言一. 致敬IT领域的那些女性二. 进制方式安装MySQL2.1 下载软件包2.2 配置环境:2.2.1 配置yum环境2.2.2 配置安全前的系统环境2.3 开始安装2.4 初始化MySQL2.5 修改配置文件2.6 将MySQL设为服务并启动测试三. MySQL数据迁移总结前言 正好赶上IT女神节&am…...
java多线程(二三)并发编程:Callable、Future和FutureTask
一、Callable 与 Runnable 先说一下java.lang.Runnable吧,它是一个接口,在它里面只声明了一个run()方法: public interface Runnable {public abstract void run(); }由于run()方法返回值为void类型,所以在执行完任务之后无法返…...
day4分支和循环作业
基础题 根据输入的成绩的范围打印及格 或者不及格。 score 58 if score > 90:print(及格) else:print(不及格)根据输入的年纪范围打印成年或者未成年,如果年龄不在正常范围内(0~150)打印这不是人!。 age 52 if 0 < age < 18:print(未成年) elif 18 &l…...
轮毂要怎么选?选大还是选小?
随着改装车的越来越火爆,汽车轮毂可选择的款式也越来越多,90%的人换轮毂,首先选的就是外观。大轮毂的款式多,外形大气好看,运动感十足, 那是不是选大轮毂就可以呢?不是的,汽车轮毂要…...
RabbitMq 使用说明
1. 声明交换机和队列,以及交换机和队列绑定 import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.spr…...
Vue(10-20)
1Vue赋值方式 Object.defineProperty <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" conten…...
C++-对四个智能指针:shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解
回答如下: C的智能指针是一种特殊类型的“指针”,其主要目的是自动跟踪内存分配和释放,以避免程序中出现内存泄露或空悬指针等问题,主要采用的技术是:借助于类的生命周期,当超出了类的作用域时,…...
uni-app中使用vue3语法详解
全局创建 app.use(createPina()).mount 全局方法 通过app.config.globalProperties.xxx可以创建 这里我们写了一个字符串翻转的全局方法 main.js里面添加一个全局方法 不要忘了加$ 否则会报错 // #ifdef VUE3 //导入创建app import { createSSRApp } from vue //导入创建ap…...
三十四、MongoDB PHP
PHP 语言可是使用 mongo.so ( Windows 下是 mongo.dll ) 扩展访问 MongoDB 数据库 MongoDB PHP 在各平台上的安装及驱动包下载请查看: PHP 安装 MongoDB 扩展驱动 如果你使用的是 PHP7,请移步: PHP7 MongoDB 安装与使用 PHP 连接 MongoDB 和 选择一个…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
