刘东伟,张学旺,郭晓金
(1.重庆邮电大学 通信与信息工程学院,重庆 400065;2.重庆邮电大学 软件工程学院,重庆 400065)
随着比特币的兴起,区块链技术受到了各行各业的广泛关注。2016年,国务院印发的《“十三五”国家信息化规划》首次将区块链列为我国的国家信息化规划,并将其作为战略前沿技术之一。“区块链+教育”也逐渐成为国内外教育学领域专家关注的一个研究发展方向,依据区块链技术所具有的数据公开透明和不可篡改特性,将其应用于教育的学信管理、资质证明等方面,有助于教育领域的改革发展。
目前国外的部分教育机构已经开始利用区块链技术进行学位证书的颁发。文献[1]提出了基于以太坊的教育记录方案系统设计,该方案系统能够实现学位证书信息的存储和验证,但基于挖矿机制,交易处理效率低。文献[2]提出了基于区块链平台多链的学位证书验证方案,该方案系统仍然基于挖矿机制,交易处理效率仍不高。而本文针对学位证书存证的教育业务场景,为解决交易吞吐量低以及中心化存储所具有的单点故障问题,采用了超级账本作为底层区块链技术平台,并利用Kafka技术实现交易的快速分发处理,以此提高学位证书存储的交易吞吐量。
区块链基于图1所示的链式区块数据结构,一个区块中包含了区块头和区块体两部分[3]。区块头中包含了前一个区块的哈希散列值、Merkle根、时间戳、版本号和其它信息。其中Merkle根是由区块体中所有交易信息的总哈希值生成,前一个区块的哈希散列值作为区块间的连接索引,将区块按照时间顺序连接起来,形成一条主链。时间戳用于给每一个生成的区块确定时间,确保该区块无法伪造。其它信息根据共识机制[4]的不同可能会含有随机数、目标哈希值等数据。而区块体中的交易信息由Merkle树[5]进行存储,这种存储结构能够确保交易信息篡改后Merkle根值发生变化,确保交易信息无法篡改。区块链底层依托于P2P网络[6],每一个节点都持有该账本的副本,所有副本同步更新。除非拥有网络中绝大部分节点的控制权,否则更改网络中单个节点的数据毫无意义。
图1 区块结构
Kafka作为一个分布式、可分区和可复制的消息系统[7],具有高吞吐量和低延迟特性,其架构如图2所示。将Kafka机制应用于区块链网络的交易共识,能够提高区块链网络的交易处理速度。
Kafka以主题为单位区分所发消息的类别,每个主题包含一个或多个分区,每个分区都是一个顺序的、不可变的消息队列,用于存储新增的消息。Producer和Consumer异步生产和消费消息,Producer负责向Broker发送消息,Consumer负责从Broker消费消息。Kafka通过分区备份机制实现Broker集群的可靠性和稳定性,每个分区的数据副本存储到多个Broker上。通过选举机制将其中一个Broker作为该分区的主节点,其余的Broker作为从节点,主节点负责处理所有的读写请求,从节点存储一个副本并和主节点保持数据同步。
Broker集群状态需要通过Zookeeper进行管理维护,通过Zookeeper watch机制监测Consumer和Broker元数据信息的变更。当主节点宕机,Zookeeper会监测到变化信息并通过选举机制从剩下的Broker中重新产生一个主节点,以此确保主节点宕机后并不会影响集群工作。Zookeeper集群管理服务要求集群中半数以上的节点处于可用状态,在兼顾工作效率与节约资源的情况下,Zookeeper集群节点应设置为奇数个,满足2*n+1个,其中n为容错节点数,集群节点数最小为3。一般来说,Broker数量越多,数据可靠性越高,但是数量过多也会影响整体性能。
图2 Kafka消息订阅与发布
目前的区块链平台主要有比特币、以太坊和Linux基金会的开源项目超级账本。其中比特币和以太坊作为公有链,基于挖矿共识机制,交易处理效率低。任意节点都可以加入网络并共享账本,不利于数据的隐私保护。而超级账本作为许可链,通过成员管理服务和通道隔离机制实现网络节点身份认证和账本数据的隐私保密,并将节点进行角色分类和职责分工,具有更高的交易处理能力。
本系统设计以Hyperledger Fabric作为区块链平台,通过web前台系统实现用户交互。前台系统用户主要分为系统管理员、普通用户和审核机构用户。系统管理员主要实现前台系统的用户管理和权限分配等功能。普通用户主要为学生用户,负责发起学位证书信息的登记、查询、更改等交易提案。审核机构用户主要为各大高校用户,负责审核登记、更改、吊销学位证书信息世界状态。图3为本系统的层次结构设计,主要由区块链底层平台、智能合约、业务层和应用层组成。
图3 系统结构层次
应用层采用Jquery+Bootstrap+HTML5等前端框架实现前台系统用户交互的WEB页面,主要功能有:用户注册登录,学位证书信息的登记更改、详情查看、吊销、历史记录和学位证书信息所属高校类别、学位类别和年月等维度的统计分析。业务层作为后端服务,负责给Web前端功能提供Restful接口,通过Fabric-Java-SDK与区块链网络交互,实现账本状态的写入和更新,同时负责对接其它业务系统。智能合约通过GRPC接口与区块链底层平台交互,实现对学位证书信息的账本状态更改。Hyperledger Fabric主要提供成员管理服务、共识服务、链码服务和安全密码服务。CA(certificate authority)模块主要提供成员管理服务,为节点的加入和离开提供成员身份证书注册和注销功能。共识服务主要实现交易提案的分阶段验证,并采用Gossip协议实现数据分发,保证同一个链上不同节点区块数据的一致性。链码服务通过合约程序执行学位证书相关业务逻辑。密码安全服务主要提供密钥生成、哈希运算、签名校验和加解密等基础功能。账本状态由CounchDB存储,与默认LevelDB数据库相比,其支持富查询和建立索引,查询效率更高。
本设计为了兼顾系统的高可用性和高交易吞吐量,采用图4所示的含有3个组织和Kafka集群的系统网络节点架构[8]。根据业务合约方法和账本状态变化,图4中前台系统的交易提案主要划分见表1。
图4中的CA节点作为成员服务提供商(membership service provider,MSP),结合PKI(public key infrastructure)技术,基于标准的X.509证书格式为节点成员提供注册、数字证书发行和数字证书延期与吊销,实现节点之间数据传输的签名和验证。记账节点负责验证区块交易并记账,维护状态数据和账本副本。同时在链码实例化的时候,背书策略会指定每个组织中的一个记账节点动态充当背书节点角色,用于接收前台系统的交易背书请求,模拟执行交易提案并对结果进行签名背书。主节点是由每个组织通过选举机制产生并与排序服务节点通信,负责接收排序服务广播的新区块,并通过Gossip协议实现组织内各记账节点账本数据的同步。记账节点数据同步过程大体如下:
图4 系统节点架构
表1 系统交易提案类型
一个记账节点接收到消息后,随机地选择K个节点进行消息发送。节点之间会有一个基于反熵的状态同步过程,每个节点周期性地与邻居节点交换保存的数据并对比本地数据和邻居节点保存的数据,检查是否有缺失或过期的数据,并进行本地节点数据的更新。
Kafka集群主要用于提高区块链网络的交易处理速度,由于Kafka无法保证一个主题中多个分区间消息的有序性,本系统通过在区块链网络启动时创建一个编号为0的分区,确保从排序服务节点提交到Kafka的交易消息有序性。同时区块链网络中只创建一个通道,确保图中3个组织节点都属于一条链,实现不同组织节点账本数据和状态数据的同步共享。图4中一个通道对应Kafka的一个主题,排序服务节点在不同阶段充当不同的角色。接收交易阶段时,排序服务节点充当生产者,负责将交易转发给Kafka集群,并通过权限检查转发给对应通道的主题。消息处理阶段时,排序服务节点充当消费者,从Kafka集群中获取交易信息,并把交易排序、分割打包成区块,通过原子广播给组织内的主节点。
其中Kafka集群应满足条件1
前台系统发起表1中的交易提案后,直到账本状态发生变化或返回学位证书信息的世界状态,经历了图5所示的共识过程[9]。
图5 交易共识过程
(1)交易背书
交易背书是对交易进行背书的规则,本文以大多数子规则成立的隐含元策略作为背书策略,满足背书策略才是有效的交易。图5中,有3个背书节点,当前台系统提交学位证书交易提案后,背书节点会调用链码模拟执行交易提案的内容并生成读写集,同时调用交易系统链码ESCC(endorsement system chaincode)对读写集结果进行结构转换和签名背书,只有交易获得2个及以上的背书数量才会标记为有效的交易。
(2)构造交易请求并发送给排序服务节点
前台系统收集交易背书并进行签名验证,如果交易提案只是进行账本查询,则不会构造交易发送给排序节点。如果交易提案对账本状态进行更改,则会重新构造该交易并发送给排序服务。排序服务会根据交易信封中的指定通道名称,在通道内按照时间顺序对接收到的交易进行排序并生成区块。
(3)交易验证并同步区块
记账节点负责对接收到的区块交易进行有效性验证,主要包括背书策略验证和双花检测。校验时会对模拟执行时状态数据版本和提交交易时状态数据版本进行比较,如果版本不一致,则校验失败,标记为无效交易。同时会验证是否符合指定的背书策略,不满足也标记为无效的交易。对于区块中有效的交易,记账节点会记录到账本数据并同步更新状态数据库的世界状态。
智能合约也称为链码,运行在由背书节点进程独立出的安全Docker容器中,用于处理被网络成员认可的业务逻辑,对链码执行结果达成一致后才能实现账本状态的更改。网络中每个记账节点都会存储图3中的账本数据和状态数据,验证通过的交易最终会打包生成区块,并以区块文件的形式存储在每个记账节点的账本数据中,而基于Key-Value存储结构的状态数据库负责记录交易执行的状态结果。本文以学位证书编号作为唯一键值,保证每条数据记录的唯一性。合约中建立了图6所示的学位证书DegreeInfo结构,承载学位证书信息的具体属性。
图6 学位证书属性结构
结合表1中的交易提案,对于验证通过的交易,链码可以通过PutState(key,value)、GetState(key)、DelState(key)、GetHistoryForKey(key)等方法实现学位证书的登记、修改、吊销和历史状态查询等功能,其中key为学位证书编码,value为序列化的DegreeInfo结构信息。以上对学位信息的增删改是指在区块链中记录下对数据所发生的交易,即作为一笔交易记录在账本数据中[10],而状态数据只是记录交易执行的结果。
依照图4,采用Kafka集群、Orderer排序节点集群和3个组织方式验证本系统设计的可行性和正确性。其中为了避免单点故障和脑裂问题,选择3个Zookeeper节点,为了满足容错的最小节点数,选择4个Kafka节点,共使用表2所示的19台PC机作为网络节点,测试环境配置见表3。
表2 系统节点
表3 实验配置
针对不同的高校类别和学位类型,测试用例分别采集了50张学士学位证书、30张硕士学位证书和30张博士学位证书。因篇幅原因,这里以东北师范大学的学士学位证书为例。
系统用户通过前台系统发起证书登记请求,登记成功后会在区块链网络中生成一笔交易。图7左边为测试用例上链后的世界状态,图7右上角为该笔交易在账本数据的交易记录详情,从图7中可以看出两者的交易号一致。
图7 测试用例及验证结果
交易吞吐量是指单位时间能够完成交易的最高个数,本系统交易吞吐量的测试方法为:通过频率可调的交易生成器随机生成交易,以每300笔交易为单位,依次向区块链网络节点发送300-1200笔交易,并在统计时间内记录区块链上的交易数量,通过取平均数方式得到稳定的网络交易吞吐量。图8是交易数量分别为300、600、900和1200笔的4组测试实验,每组交易重复执行30次的实验结果,表4为4组实验稳定交易吞吐量结果。
从图8和表4可以看出,除了网络波动造成的个别组次结果差异较大,系统交易吞吐量维持在180-250Tps,而比特币区块链的每秒交易是7笔,以太坊区块链交易每秒大约为几十笔,本系统设计的交易吞吐量更高。
图8 交易吞吐量测试结果
表4 稳定吞吐量结果
本文结合区块链技术所具有的优点,提出了一种基于区块链的学位证书信息存证系统设计。学位证书信息由区块链网络节点共同维护,安全性更高。将Kafka机制应用于区块链交易信息处理,能够提升区块链的交易处理速度,相比于使用比特币区块链和以太坊区块链实现学位证书信息存储验证,本系统的交易吞吐量性能表现更优。实际生产环境下,区块链网络节点数量将更多,将进一步考虑节点的数量对交易速度的影响。