基于Hyperledger Fabric的个人教育经历共享溯源系统
2021-05-12穆莉莉伍习东
穆莉莉 丰 韦 伍习东
(安徽建筑大学 经济与管理学院,安徽 合肥 230601)
当前社会正处于高度信息化时代,教育建设十分重要。目前对个人受教育情况的查询存在一些弊端,一些盗版网站屡见不鲜[1],现存个人教育经历共享溯源系统基本是基于B/S结构和Web技术:将个人教育经历数据存入数据库中,然后个人通过网站查询获得。但当数据库出现问题或被恶意攻击导致数据被更改和删除时易造成故障,所以,目前这种方法不能保证数据的完整性。考虑到以上情况,采用基于hyperledger fabric技术,该技术为一种开源超级分布式账本,具有透明、公开、去中心化等特点,在溯源和共享系统起到很大作用,能保证信息的真实性,可实现溯源共享平台的创建。将hyperledger技术和个人教育情况溯源共享结合[2],利用区块链的分布式储存实现信息共享[3],利用区块链的共识算法防止信息被恶意更改,打造一个安全,去中心化的可溯源个人教育情况体系。本实验采用虚拟机的Linux系统,docker容器,hyperledger fabric,设计了个人教育经历共享溯源平台。将Hyperledger Fabric技术作为网络底层,在应用程序及业务链码方面利用fabric-sdk-go实现智能合约,并且通过相关API接口实现web业务层。通过账号登录操作,将业务发送给链码,通过对链码的调用,实现对超级账本的操作。
一、 区块链架构
根据节点的类型,区块链可分为三种情况,这三种的范围是不同的。分为公有链,联盟链和私有链。
公有链:公有链就是公开的,所有人都可以登录网络和区块,所有人都可以加入区块链网络。
联盟链:联盟链是指在这个范围内的成员才有权限使用去中心化功能。
私有链:私有链是对单独的个体使用,具有溯源和不能篡改的特性。
二、Hyperledger fabric的认知及系统架构
1.hyperledger fabric平台
hyperledger fabric是一个超级账本,是区块链技术第一个面向企业应用场景的开源分布式账本平台,将区块链技术引入联盟链的应用场景中。支持多通道,增强了隔离的安全性[4]。支持共识组件,权限管理组件。分为peer节点的多种角色,并根据实际情况进行设置。 hyperledger fabric运行时的架构,如图1所示。
图1 fabric运行架构
其中:
CA:对Hyperledger的成员身份进行管理。
Msp:为客户端和peer提供系统抽象组件。
Channel:通道,是一种通信机制,将指定的peer和orderer连接在一起。
Org:代表组织。
Peer:组织中的节点,是用来存储和同步账本数据,用户通过客户端工具对数据进行put操作, 数据写入一个节点里边数据同步是fabric框架实现的。一个Peer节点可以充当多种角色,一个区块链网络中会有多个Peer节点。
Orderer:排序节点,主要是用来排序和分发交易。对交易进行排序,批量打包,生成区块,然后发给Peer节点。一个区块链网络中会有多个Orderer节点,共同提供排序服务。
ChainCode:链码,用来进行交互。
Ledger:账本。
2. Fabric 交易流程
通过SDK提供的API创建客户端业务层,将业务交易打包发送给背书节点。背书节点进行模拟交易,模拟文件的格式是否正确,是否具有重复性已执行权限,并对结果进行签名。将结果返还给客户端。客户端收到了背书节点的验证签名,然后将业务层面的交易发送给orderer点。Orderer节点根据时间进行排序,然后创建区块[5]。之后发送给所有组织的leader节点,leader节点是领导节点,根据其接收到的区块,要进行验证是否重复是否进行背书策略,验证通过后,传播给组织中的其他节点。Leader节点通过同步广播,将区块传播给组织中的其他节点,并且分类账本进行更新,将业务提交到当前状态数据库中。如图2所示为hyperledger fabric交易流程。
图2 fabric交易流程
三、个人教育经历追溯共享系统搭建
1. 系统架构
溯源共享系统架构,第一层为fabric-network网络搭建[6],通过crypto-config.yaml配置相关的组织信息,根据需要添加新的组织信息,根据需要可在组织中指定多个节点。最后hyperledger fabric提供的cryptogen工具可生成组织结构和身份证书密钥。需要注意的是已生成的组织结构无法进行修改,要提前进行计划好。再通过相关的配置文件生成创世区块和通道。
第二层fabric-sdk-go为业务层,需要创建fabric-sdk对象并且需要创建通道。在确认hyperledger fabric网络环境没有问题之后创建config.yaml文件,为fabric-sdk-go配置参数和指定hyperledger fabric通信地址。
定义结构体,用于包含fabric-sdk需要的配置信息。包括通道名称、通道配置文件路径、组织名称、组织管理员名称、orderer名称、资源管理。
type initinfo struct {
ChannelID string
ChannelConfig string
OrgName string
OrgAdmin string
OrdererOrgName string
OrgResMgmt *resmgmt.client}
定义好结构体之后就可以创建sdk实例,并进行一系列操作。之后创建sdk及通道的创建,并将peer节点加入通道中,为保证客户端初始化所有组织,需要进行测试创建通道。
接下来使用fabri-sdk实现链码安装,实例化链码,创建客户端实例。通过该实例可对链码进行查询、调用。
第三层为web控制层,方便用户操作。系统架构,如图3所示。
图3 系统架构
2.环境搭建
此应用采用ubuntu系统完成,环境所需安装配置包括vim、git、docker、docker-compose、goland。需要进行拉去镜像,接下来是搭建hyperledger Fabric的步骤。
第一步需要生成Fabric的证书编写,并生成组织节点证书的配置文件,可将其命名为:crypto-config.yaml。在文件里指定组织的名称,节点个数,用户个数和访问节点的域名信息。
第二步需要创建创世块文件和通道文件。Fabric是分布式账本技术平台,被设计用于企业场景, 每个账本都有自己的区块, 账本的区块链作用就是用来存储业务的交易数据,但账本的第一个区块与其他区块不同,第一个区块是不储存业务的交易数据是用来存储配置信息,所以,把账本的第一个区块称为创始块。通过指令生成创世块文件,名称为genesis.block。通道在Fabric中称为channel,一个channel表示一个账本。Fabric多样化的可配置特性,能够满足多种行业的各种各样需求。在fabric中至少有一个channel,通过命令将通道创建出来,通道文件名称为channel.tx。
第三步通过指令编写docker-compose启动时需要的配置文件,默认生成的文件名为:docker-compose.yaml通过指令docker-compose up -d测试测试启动网络环境,通过指令docker ps显示状态全为up状态,启动测试成功。
3. 链码的设计与实现
链码对于区块链来说是一个十分重要的组成部分。在Fabric中将智能合约称之为ChainCode,也就是链码。在链码中设计了此实验的结构体。代码如下:
链码通过hyperledger提供的接口和账本数据进行交互操作,对应用程序提供的接口。ChainCode是业务层客户端和Fabric技术之间的连接,是业务的承载体,通过操作业务层客户端程序可以发起交易、查询交易,负责具体的业务逻辑。Fabric中的ChainCode包含了链码及管理命令。ChainCode程序需要运行在容器中。所以,ChainCode链码非常安全;ChainCode管理命令是对ChainCode链码进行安装、实例化、调用、打包、签名等步骤进行操作。
Chain Code需要导入Fabric技术提供一些系统包,ChainCode通过导入这些系统包实现ChainCode和Fabric的连接。Fabric包中的Shim包包含了配置环境,以及Fabric和ChainCode连接的相关接口。在链码中操作执行查询增加等功能都需要通过shim才能实现。
定义结构体并实现,ChainCode若要实现Fabric技术提供的接口,首先,要实现以下两个方法。第一个是Init方法,为系统初始化的方法。第二个是Invoke方法,这种方法的作用是写入数据,如发起交易。可以使用相关的API来创建SDK实例:创建通道、将组织中peer节点加入已创建的通道中、安装链码、实例化链码、创建客户端实例。其次,进行创建fabirc-sdk,并进行测试。通过使用SDK相关的API来进行安装链码、实例化链码,创建客户端并进行测试,显示链码实例化成功。
4. Fabric-sdk-go功能的实现
在业务层定义一个函数实现链码的调用,管理员用户向分布式账本中添加信息功能。
定义一个 FindEduInfoByEntityID 函数,接收字符串参数,代表身份证号码,此函数通过调用链码实现查询用户的个人教育情况追溯。
定义一个 ModifyEdu 函数,接收Education结构的对象,该函数实现管理员通过调用链码对已存在的信息进行修改的功能。
5. Web应用的实现
Web应用的实现主要分为两个步骤:控制层的实现和视图层的实现。控制层主要是处理响应,处理要求。在控制层设置管理员用户和普通用户,管理员用户可添加个人教育经历信息,修改个人信息。普通用户只可实现查询功能。在控制层创建controllerHandler.go 函数实现用户的请求,根据不同的用户请求调用业务层不同的函数,在业务层,通过sdk提供的接口实现对链码的访问,具有添加信息、查询信息,修改信息等功能,实现对分类账本的访问。每次发布信息都会有对应的哈希值。
在视图层存放页面布局的css文件、与用户交互的javaScript文件、以及所需图片文件。
至此所有项目结束,可通过命令查看效果。图4为链码的实现流程,图5为web页面显示。
图4 链码实现的流程
图5 web页面显示
四、基于hyperledgerfabirc个人教育经历的创新点
区块链的主要特点是数据不可更改和可以进行溯源验证,建立相互信任的个人教育经历的共享溯源,可打破个人教育情况伪造的现象。
共享平台的特点是去中心化,方便提供个人教育认证,提高效率。
区块链技术将数字证书的哈希值存储在分布式账本中,可保证数据完整性和准确性[7],方便个人教育数据的管理。
五、结论
针对传统个人教育经历的弊端,将个人教育经历应用系统与区块链技术的结合。提出了基于hyperledger fabric个人教育情况的共享溯源系统[8],具有透明化、数据不可篡改等特点[9]。采用了虚拟机的Linux系统,docker容器,hyperledger fabric环境等设计了共享溯源平台,解决了数据的可信问题和数据的安全性,为数据建设提供一种全新的技术支持。