一种基于超级账本的高速公路通行数据区块链
2021-05-20王若华石晋平
王若华,焦 健,石晋平
(1.北京信息科技大学 网络文化与数字传播北京市重点实验室,北京 100101;2.山西省交通信息通信有限公司,太原 030006)
0 引言
中国高速公路作为一种特殊的广域物联网系统,正在逐渐向无人值守和自动化收费的运行模式转变。省界站取消后,车辆通行记录均由高速出入口收费站和门架产生。区域化管理造成通行数据由各个高速公司分散存储,这对数据共享提出了挑战。
近年来区块链技术的发展对物联网领域产生了重要的影响[1],其抗抵赖和防篡改的特性在数据保护领域有着较好的应用。区块链按其参与者分为公有链、联盟链和私有链[2]。公有链允许任意节点加入或退出;私有链是一个实体内部使用、信息不公开的区块链;联盟链由多个实体组成,节点加入或退出都需要获得组织机构的许可,区块中存储数据可以根据权限访问。相对于公有链,联盟链的安全性更加有保障;相对于私有链,联盟链中盟员可以访问其他盟员存储的数据,具有一定的透明度。
联盟链的区块和交易的有效性由预先设定的一个验证者群体决定,这个验证群体形成一个联盟。联盟链上的信息可以是公开的,也可以只对联盟成员可见[3]。它可避免数据全网透明带来的风险,防止数据泄露,同时可获得较高的性能[4]。联盟链可以指定相应的节点,承担共识和会计功能[5]。联盟链的共识由盟员参与,数据读写权限按联盟规则制定,节点的加入需要联盟其他节点的同意[6]。由盟员管理机构管理各盟员,一些盟员可以共同维护一个账本,不同的组织可以通过联盟链访问其他组织维护的账本。
联盟链的出现代表着区块链可逐渐应用于各行业,比如区块链管理土地登记[7]。新的区块链应用更可能应用于中央或部分集中的组织,如国家银行[8]。文献[9]提出了一种基于许可链技术的跨组织医疗数据共享框架。文献[10]提出了一种基于联盟区块链的安全服务协议,以解决云计算中的不可信计算问题。文献[11]介绍了一种利用区块链构建的图书馆流通系统,提高了图书交付的及时性,节约了图书管理成本。
比特币和以太坊为代表的公有链在记账效率存在一定的缺陷,不能满足高速并发的记账需要,联盟链较好的并发逐渐引起关注。文献[12]提出了高性能联盟链系统架构,极大地提高了去中心化的主板核心交易系统的性能。文献[13]提出了基于联盟链的数据安全共享和存储系统,传输效率比传统区块链系统提高了83.33%。
联盟链适用于多个实体构成的组织或联盟[14]。文献[15]在联盟链方式下实现了对物联网设备动态数据授权操作和安全管理。文献[16]提出了基于联盟区块链的高速铁路环境监测数据、身份认证方案,以此保护高速铁路运营环境监测数据。
高速公路特殊运营模式决定各个高速公路公司既要独立运营各自所属公路,同时又要接受交通管理部门监督与管理,各公司运行数据需要有严格的准入机制和权限分级。使用联盟链成为改进高速公路公司数据存储与共享的合理选择。本文基于联盟链超级账本技术,设计了一种高速公路通行数据区块链,用于共享车辆通行记录,利用终端日志的保存结果,通过区块链和底层日志建立映射关系,快速完成数据的上链和验证等操作,为数据共享服务提供有效的技术保证。
1 超级账本
超级账本Hyperledger[17]是一个开源项目,旨在推进许可或私有的跨行业区块链技术。它曾被提议用于移动医疗保健应用程序和医疗数据存储或访问应用程序[18]。
Hyperledger Fabric是一个提供分布式账本解决方案的平台。Fabric拥有CA组件,提供身份注册、颁发登录证书与交易证书、证书续期与撤销的功能。可以创建不同的通道,每个通道表示有权查看部署到该通道的链码数据的参与者子集,参与者需要进行身份验证和授权,只有被授权用户才能在通道上访问数据和处理交易。可以建立私有数据集合,存储在授权节点上的私有状态数据库中,通过这些节点上相应的链码进行访问。通过在链码逻辑中构建访问控制,可以将数据访问限制在组织中的某些角色。Fabric中的加密服务模块(blockchain crypto service provider)实现了密钥生成、哈希运算、签名验签、加解密等密码功能。数据在传输过程中通过TLS进行加密。
早期的Hyperledger Fabric V0.6使用实用拜占庭容错算法PBFT[19]作为核心共识算法。PBFT通过Request、Pre-prepare、Prepare、Commit和Reply五个阶段的多轮互播,保证了每一个算法实例完成后,所有非故障节点都能达成一致。但是,PBFT与其他很多共识算法都使用了多对多的消息模式来达成共识[20],需要确认和通信的次数较多,当节点数量增多时,交易性能会大幅下降。
Hyperledger Fabric V1.0的共识由背书、排序和验证3个阶段保障。背书过程中背书节点检查客户端发出的交易提案,该交易提案获得一定数量的背书后被发送到排序节点;排序过程中排序节点将一段时间内的一批交易排序并打包,通过原子广播发送到验证节点;验证过程中验证节点审核交易结构完整性、背书签名、交易读写集等,确保交易合法和一致,避免并发交易产生的冲突,验证通过的交易将写入账本。采用的Kafka共识主要作用在区块生成与数据传输上,其具有崩溃容错能力,能够保证交易信息的顺序以及不丢失,保证数据传输的一致性,提高吞吐率。如表1所示,与PBFT相比而言,Kafka拥有良好的扩展性和低延迟的优点。以4个peer节点的区块链系统为例,提交同样的一条交易,PBFT需要的通信次数为12次,而Kafka仅需5次,Kafka的吞吐率约为PBFT的2.4倍。由于在高速公路应用场景中,节点数量极多,需要极高的吞吐量和可扩展性,PBFT无法满足性能需求,因此选择Kafka作为主要共识算法。
表1 PBFT与Kafka共识算法比较
2 模型构建
本文基于超级账本技术设计高速公路通行数据区块链系统,实现高速通行数据的收集、处理、上链和共识等操作。利用超级账本构建模型,依据链上信息可以有效地实现原始数据的回溯,为数据共享提供可靠的数据来源。
2.1 整体结构
系统模型的整体结构如图1所示。考虑到高速公路的车流量地域差异较大,按照数据量规模,区块链盟员可以是地方管理公司、片区中心或公路路段,各个ETC门架隶属于不同的盟员,高速公路的通行数据依靠链码为盟员提供有效的数据共享服务。
图1 高速公路区块链结构
高速通行记录在高速公路上的ETC门架与高速公路出入口产生。当ETC车辆通过ETC门架时,ETC门架系统读取车载单元,依据费率计算标准,生成带有交易的车辆通行记录。
原始通行记录以明文存储在区块链上不利于隐私保护,但是在数据上链前进行加密,又加重了系统负荷,降低了存储与共享效率。因此,为保障数据隐私,盟员的上链信息只包括行车记录的索引信息、车牌号和哈希值,真实的车辆行驶记录会存储在所在盟员所属管理公司的本地数据库。各个盟员都可以对上链数据提出共享请求,完整的原始数据需要通过认证服务器认证才能进行访问。
利用链码的一致性与不可篡改性,在区块链原有的安全功能的基础上,增加系统的可编程性。本系统的链码结构如图2所示,由功能选择模块(Function Selection)、数据采集模块(Data Collection)、数据存储模块(Data Storage)、数据查询模块(Data Query)组成。调用链码时,首先进入功能选择模块,根据输入命令继续调用不同模块;数据采集模块将准备上链的数据构造为结构体,再转换为JSON格式;数据存储模块通过调用Hyperledger Fabric接口实现构造组合键与数据上链;数据查询模块调用Hyperledger Fabric接口实现链上数据查询,查询成功后调用上链相关模块将数据访问记录存储上链。
图2 链码结构
为描述方便,该模型所用符号在表2中给出定义。
表2 符号描述
当汽车通过高速门架时产生行车记录,经过处理后上链信息为tr ={noc,Hash(E,noc,Time),Sec(Location,Key)},上链信息的主要目的是用于数据索引,其中Hash(E,noc,Time)为门架号、车辆车牌和通过时间的哈希值,用于保证链上信息的完整性。Sec (Location,Key)为盟员公钥加密后的数据库服务器存储位置和存储秘钥。车辆的真实记录信息表示为{ noc,Time,a,E,LE },存储在各个盟员所属的数据库服务器,访问前认证服务器实现认证控制。
2.2 区块链运行流程
区块链运行过程分别由背书节点、排序节点和提交节点完成,其运行流程如图3所示。其中数据源代表行驶车辆产生的数据源,整个过程分为采集、背书、排序结块和上链4个阶段。
图3 运行流程
1) 数据采集阶段:当车辆C通过ETC门架E时,E检测到C通过,读取C的车载OBU,获取到车牌号码noc与上一个通过的ETC门架编号LE,产生交易扣费,生成交易记录tr,发送至收费站的背书节点EN。
2) 背书阶段:背书节点EN收到ETC门架E提交的车辆C的通行记录tr,背书节点EN对比交易金额a和额定金额da,得到交易验证结果v= (a==da) ? normal:suspicious。背书节点计算读集rs和写集ws,将包含读集rs和写集ws的背书结果写入对应的通行记录。当达到时间阈值或收到第n个通行记录,将这n条通行记录写入集合TR={tr1,tr2,…,trn},并将集合发送给排序节点O。
3) 排序结块阶段:排序节点O收到通行记录集合TR,将集合TR中的交易记录按车辆通过时间Time排序。有序的车辆通行记录被打包成区块b,排序节点O通过原子广播将区块b发送给多个对等的提交节点。
4) 区块上链阶段:提交节点P收到区块b,验证所有通行记录的读集rs,生成通行日志文件l并将其存入本地数据库,生成通行日志文件的索引i,将其写入区块b。通过验证的读集rs对应的写集wr中的所有键值对写入本地的状态数据库,更新本地的区块链世界状态,完成区块上链。
2.3 数据上链流程
高速公路中行驶车辆的交易是频繁发生的,长途行驶要产生几十到上百笔的交易记录。为了提高区块链的存储效率,我们采用分段上链的策略,将某一区域内的通行记录上链,返回KV值后,在进入新区域后重新产生交易记录并上链。
数据存储上链流程见算法1。首先将输入的原始数据存入本地数据库,之后生成数据存储位置和存储秘钥,将车牌号(noc)、哈希值(Hash(E,noc,Time))、本地存储信息(Sec (Location,CompositeKey))构造为结构体(struct),然后将结构体转换为JSON格式的上链信息(record),生成组合键(key),将组合键与上链信息作为键值对存储上链,最后输出数据上链的执行结果。
算法1 数据存储
Procedure SavingData(noc,Time,E,LE,a)
service executes:
write the data to DB
contract executes:
struct ←{ noc,Hash(E,noc,Time),Sec (Location,Key)}
record ← json(struct)
Compositekey ← CompositeKey(noc,Hash)
write blockchain (key,record)
print(results of execution)
end Procedure
2.4 数据共享操作
数据在完成上链工作后,区块链上记录的索引可以用于数据共享的服务。共享过程需由盟员提出共享请求,通过链码完成共享请求的审核、读取链上信息、获取原始的车辆通行记录,并且将此次访问记录上链,具体过程如下:
1) 盟员User针对某辆车noc产生共享请求Q={noc,Sig},包括车牌号和盟员的签名信息,该请求信息由客户端提交给链码。
2) 共享链码在收到Q后开始核准,首先对User完成签名校验,根据noc搜索键前缀匹配的链上数据,并对Hash值完成一致性验证,如果无误则核准该盟员访问原始信息的权限。
3) 若核准通过,盟员User依据从联盟链上返回的Location和Key,访问指定的数据库并提交{Location,Key,Sig};该数据库所属的认证服务器实施认证,返回解密存放的数据,User获取原始的行驶信息。
4) 盟员将此次请求作为交易记录上链,数据结构可以表示为(ID,time,Q),分别记录盟员ID、访问时间和共享请求。区块链可以对该记录信息做背书、排序和上链等操作,其他盟员也可以通过区块链查询该盟员的访问记录。
共享算法的伪代码如下:
算法2数据共享
Procedure QueryData(noc,Sig)
contract executes:
if validate(Sig) = false then
return errorinvalidSignature
endif
record ← write blockchain
if validate(Location,Key,Sig) = false then
return errorinvalidHash
endif
return (Location,Key,Sig)
service executes:
if validate(Location,Key,Sig) = false then
return errorinvalidDB
endif
read the data from DB
return(raw data)
system executes:
generate route
print(route)
contract executes:
SavingData(ID,time,noc,Sig)
end Procedure
3 安全性分析
将区块链技术应用到高速公路数据的存储与共享中,可以很好地发挥区块链的优点,使高速公路通行记录可在不同高速公司之间轻松共享,并在共享过程中保护隐私,让高速数据管理更加灵活和安全。本文模型的安全性可从以下几个方面进行分析。
3.1 弱中心化
高速公路联盟链的盟员由各个片区中心或高速公司组成,这些公司之间无需相互信任,任何一个节点都无法单独控制整个联盟链上的数据。并且链上数据仅含行车记录的摘要哈希与索引,对单个节点的攻击无法使整个网络瘫痪。联盟链的弱中心化使得此模型具有良好的抗单点攻击能力。
3.2 可溯源
区块链上的每个区块都具有顺序关系,区块内记录的行车记录的索引信息,数据存储上链后便无法再修改。并且每条原始通行记录中都包含该车辆经过的上一个门架信息,因此可以进行溯源。对某车辆的行驶路线进行追溯,可得到该车完整的行驶路线。
3.3 不可篡改
区块链中所有节点均保存了完整的区块链账本数据,即使单个或少数节点存储的账本数据被篡改,在下一轮共识结束后,所有节点又将同步获取最新的账本数据。在现实中,各高速公司都有严格的网络安全管理机制,出现大面积攻击的可能性极小,因此保证了该模型的链上数据不被篡改。
3.4 隐私保护
原始车辆的通行记录在高速出入口或门架处产生,通过签名加密后存入本地数据库,再将通行记录的摘要哈希和索引上传到联盟链中。公开的链上数据无法查看完整的行车记录,真实数据的访问权限完全由联盟链控制,没有联盟链的授权将无法从数据库中提取出真实数据。因此该模型的数据隐私得到了良好的保护。
4 实验结果与分析
为验证方案的正确性和工作效率,在硬件环境为 Intel(R)Core(TM) i7-8750 CPU(2.2 GHz),RAM 为 16 GB的 PC 机上进行了实验。采用山西北部某地区高速公路实际数据,5台操作系统为Ubuntu18.04的虚拟机模拟1个省中心与4个片区中心,每个片区中心包含2个收费站。实验网络结构如图4所示。
图4 实验网络结构
使用Hyperledger Fabric V1.4 构建联盟链系统。建立1个order节点、4个peer节点和8个cli客户端的区块链系统。省中心通过order节点为下属片区提供排序服务和打包区块;片区中心分属2个组织,通过peer节点提交对应片区的通行记录、存储区块以及执行链码;收费站通过cli客户端发送通行记录到上级片区中心。所有节点和cli在同一通道中,并放入docker运行,使用docker技术组织编排。认证服务通过Fabric提供的MSP(membership service provider)实现。
链码使用go语言开发,使用gin框架访问本地的mysql数据库,将通行数据摘要上传到区块链中,并可以在查询链上数据之后将查询事件记录上链。根据真实行车记录,设计结构体CAR ={noc,Hash,Location,Key}用于记录一条通行记录的车牌号、哈希值、真实数据存储位置、存储秘钥。为便于查询,将链上存储的键设为车牌号与哈希值的组合键。
4个peer及8个cli并发上传通行记录,上链后的数据可在任意节点通过调用链码查询得到。对车辆上链后的通行记录查询可得到一辆车完整的行驶轨迹,以便事后稽查。将同一个车牌号的所有通行记录按通行时间顺序排序,再按序提取每条通行记录中的门架号并输出,即该车辆完整的行车路线。
在本实验的数据上链阶段使用Wireshark对通行数据进行捕获,结果如图5所示,未见上链数据明文,可以看出开启TLS对数据传输过程起到了保护作用。
图5 抓包结果
原始同行记录经对称加密技术加密后存入本地数据库,如图6所示,除车牌号外,相关信息均为密文,极大保护了车主的个人隐私。
图6 加密数据库
假设业务量是按照时间递增的,使各节点并发上传车辆通行记录,同时获取上链前后时间差,计算交易读写吞吐率、延迟以及资源消耗。交易到内存之后需要等到形成一个完整区块才能存入磁盘,这就使得第一个进入到区块的交易和最后一个进入区块的交易有时间差,故在此取上链多个交易的平均时间。
如图7中虚线所示,随着业务交易量的变化,系统吞吐率在40条/s左右,交易数对吞吐率不存在明显的影响。在单个虚拟机上同样部署了相同节点数量的高速公路区块链,如图7中实线所示,吞吐率仅为15条/s。系统的交易量数据上链延迟与交易数的关系如图8所示,其延时性和吞吐率基本成线性关系。实验证明了影响系统吞吐率的主要因素是分布式系统的节点数,节点越多则吞吐率越大。按照该系统吞吐率计算,24 h提交的业务量约为40×60×60×24=345.6万条,而山西省单日实际业务量约为1 000万条,该系统基本满足省业务需求的1/3,可以减小片区规模的实际业务压力。随着节点数量的扩容,该系统可以进一步满足省级甚至国家级的业务需要。
图7 系统上链吞吐率
图8 系统上链延迟
图9 上链资源消耗趋势
多机环境下随机抽取某个peer上链期间的资源消耗如图9所示,图中CPU及网络波动区域显示了一批数据的上链消耗。CPU利用率大概在40%~50%间,内存无明显变化,网络流量消耗较大。考虑到上链期间peer的合计资源消耗已达到物理机的最大性能,单个peer的CPU利用率不高,如提高物理性能,系统性能仍有很大的提升空间。
5 结束语
本文提出了一种能记录和共享高速公路通行数据的区块链,为高速公路的稽查管理提供了新思路。实验结果表明该系统具有较好的吞吐率和较低的时延,系统运算资源消耗适中,可以满足片区级高速公路的实际需求。如何提高区块链系统的扩展性,更好地满足高速公路信息化需求将成为下一步的研究方向。