周 强,李向东,彭诗杰,姚梦辉,张 行
1(武汉市水务集团有限公司,武汉 430034)
2(湖北邮电规划设计有限公司,武汉 430023)
区块链(Blockchain)是一种分布式账本技术,采用非对称数字加密、时间戳、分布式共识等技术,具有去中心化、信息不可篡改、可以追溯、公开透明等特点[1,2].2008年区块链作为比特币的底层实现技术被提出,截至目前,区块链已经经历了以比特币为代表的可编程货币阶段(1.0 阶段)和以以太坊和超级账本为代表的可编程金融阶段(2.0 阶段),正在向可编程社会的3.0 阶段发展[3].
随着区块链技术的不断发展,利用区块链上产生的数据,提供基于区块链的区块/交易查询、数据信息提交等一系列操作的BaaS (Blockchain as a Service,区块链即服务)逐渐成熟.BaaS 具有降低开发及使用成本,兼顾快速部署、方便易用、高安全可靠等特性,为区块链应用开发者提供区块链服务能力[4].BaaS 加速了区块链在各个行业应用落地的步伐.
目前,区块链技术在国内各领域应用场景不断推出.贸易金融领域,2019年4月中国国投国际贸易有限公司所属南京公司完成了内地首笔基于区块链技术的跨境信用证交易;产品溯源领域,2019年1月,由中国网“一带一路”网与中追溯源科技股份有限公司联合发起的基于区块链技术的“一带一路”可追溯商品数据库正式启动,确保每一件商品都能实现来源可查,去向可追,有力杜绝假冒伪劣产品;政务民生领域,2019年6月佛山市禅城区启动全省首个“区块链+疫苗”项目建设,打造“区块链+疫苗安全管理平台”,旨在实现疫苗流通全过程的可视化监管,并简化疫苗预约接种流程[5].此外,在公共服务、电力能源、智能制造、供应链、物流、电商、农业、物联网等诸多行业领域都在探索区块链应用[6–15].
智慧水务是智慧城市建设的重要组成部分,通过物联网技术的应用,建立城市水资源信息物联网络,实现对取水、送水、制水、配水、排水、污水处理等各环节进行监控、识别、定位和管理,以提升水务信息智能化管理水平[16].目前国内智慧水务建设,一般运用物联网技术,采用中心化的数据收集和处理模式,汇总IoT 设备采集的数据,并基于数据分析结果对IoT 设备发送控制指令[17].中心化的处理方案,信息的获取和发布对用户不透明,容易出现延时和失真,且成本高、容量有限、安全性差[18].而区块链技术去中心化、信息不可篡改、公开透明的特点为解决这些问题提供了一个可行性的方案.
近两年来,国内外企业尝试将区块链技术使用在智慧水务应用上.美国 Genesis 公司将区块链技术应用于油气田污水处理系统,为了减少当地民众对污水处理质量的担忧,系统中的数据采用以太坊(Ethereum)技术存储发布,当水质变坏时系统也能预警,提高了人们对水质数据的信任度[19].在国内,搜狐网报道2019年长春水务集团联手支付宝公司推出“最多只跑一次”和“区块链代扣”服务,把代扣业务“搬”上链,成为全国首家把区块链技术融合到民生缴费服务中的水司,实现了全程可追溯、不可篡改、实时可查询,保证了扣费的稳定性,解决了出账速度慢、通知慢的问题,极大提升了用户代扣业务的便捷性、安全性.
城市智慧水务建设过程中,因为水务数据的可信度所产生的一系列责任鉴定问题.例如,智能水表故障所造成损失定量和取证,可行的做法是通过监测智能水表的健康状态数据,根据故障的时间来定量分析损失.在此过程中,主要矛盾在于数据的真实性信任问题,在数据集中存储管理模式下,水表生产商和水务公司之间互不信任.而引入区块链技术,数据多方存储管理和不可篡改性可以较好地解决上述问题.从上述问题出发本文针对智慧水务应用中构建区块链BaaS 服务的关键技术进行了相关研究.首先,提出了智慧水务平台中区块链BaaS 服务体系架构.然后,基于分布式账本存储结构,提出智能水表健康状态数据在区块链账本中存储的数据模型,并提出一种健康状态数据Merkle二叉树验证模型确保数据真实性和完整性;其次,并针对海量高并发健康状态数据提出一种上链方案,双缓冲队列和多节点接入关键技术;最后通过对比分析验证水务区块链BaaS 服务在高并发智慧水务数据上链应用上的可行性和优越性.
如图1所示,智慧水务平台分为业务系统层和区块链层.业务系统层包括了水务区块链BaaS 服务及其他业务系统.水务区块链BaaS 服务作为可部署的独立单元,既可在水务内网服务器,也可在公有云中部署.其核心职责是以基于RESTful 接口方式为其他系统和平台并提供了区块链钱包注册、数据上链、数据溯源和数据验证服务.
区块链层依托分布式账本和密码不可篡改的特性为上层应用提供可信的分布式数据网络.其他业务系统的数据(健康状态)通过水务区块链BaaS 服务写入至区块链系统的账本中,可通过基于区块链本身的区块链浏览器浏览上链数据,并通过基于区块链本身的钱包应用来管理各智能水表的数据资产.
本文以水表计费数据的全生命周期视角出发来说明智慧水务平台和区块链BaaS 服务的交互情况.
(1)物联网IoT 平台通过唯一标识ID 来管理智能水表,IoT 平台调用BaaS 服务创建钱包接口,为水表在区块链上开辟一个账户(公钥、私钥),并通过TOKEN激活,使钱包账户和水表ID 形成一一映射;
(2)智能水表健康状态数据通过NBIoT 传输方式回传至IoT 平台,然后调用BaaS 服务数据上链接口将数据写入到该水表账户下交易中;
(3)通过IoT 平台将数据发送至数据中心;
(4)数据中心调用BaaS 服务验证接口来校验接收的健康状态数据是否合法或未修改.
图1 智慧水务区块链BaaS 服务总体架构图
区块链分布式账本从功能性角度来看,类似于分布式数据库系统.在一定程度上,分布式账本特性与分布式数据库相似,健康数据写入到分布式账本需要构建相应的数据模型和索引结构进行存储和索引.而数据模型和索引结构合理设计,将会对数据检索性能提升以及存储空间优化带来显著成效.本文提出的健康状态消息的分布式账本数据模型和检索结构主要包括3 种:智能水表基本信息模型、健康状态模型和Merkle验证树模型.其中智能水表基本信息模型和健康状态信息模型是分布式账本存储数据模型,而Merkle 验证树模型是一种基于Hash 二叉搜索树检索模型.
水表基本信息模型的构建的思路方法如下:在水务平台中提交智能水表唯一标识(MN)、位置信息(Location)、生产商信息(Manufacturer)经由生产商和水务公司共同审核.通过后,根据此数据组合生成一对钱包地址和私钥与存储在数据库中传感设备基本信息形成映射绑定,算法过程如图2所示.
1)MN+Location+ Manufacturer+Passwd 组成的字符串经过SHA256 算法得到32 位固定长度字符串;
2)再次经过SHA256 算法获得私钥;
3)私钥通过SECP256K1 椭圆曲线算法得到公钥;
4)公钥通过SHA256 算法获得公钥哈希;
5)公钥哈希通过BASE58 算法得到钱包地址.
图2 水表基本信息模型算法流程图
本文提出的水表基本信息模型也就是水表四元组数据通过一定算法过程,转化为私钥、公钥和钱包地址三元组数据的算法过程和两者之间关系投影,如图3.
图3 水表基本信息映射关系图
智能水表回传的健康状态数据的数据量随时间的累积数量成线性增长,是一种附有时间戳属性的多源海量的结构化数据.数据组织形式是将单位时间内的健康状态数据批量打包写入到单笔交易中.而分布式账本交易数据结构无法直接纳入海量数据且提供高效的检索机制,健康状态数据并非直接逐条写入到分布式账本交易,而是按预先指定的规则和时间戳范围打包成数据块,然后将数据块的数字指纹(Hash),并组织成上一数据块交易哈希、智能水表钱包地址、数据块时间范围和数据块哈希的数据模型然后再写入交易中,健康状态数据模型如图4所示.
图4 智能水表健康状态数据结构
上一数据交易哈希:上一笔交易哈希,通过该哈希值,可以快速定位到上一笔装载了健康状态数据的交易.
智能水表钱包地址:生产这些健康数据的智能水表,用其在区块链系统中的钱包地址来替代.
数据块时间范围:由开始时间戳和结束时间戳组成,而本交易中所写入的健康状态数据均在此时间范围内,该字段的意义在于对外提供了快速的时间检索入口.
数据块哈希(Merkle 二叉树):将上述时间范围内的所有健康状态分别计算得出的数字指纹,组织成Merkle 二叉树模型,数据块哈希则是此Merkle 树根哈希.Merkle 树完整写入交易,为健康数据的验证提供数据结构方面的基础.
算法步骤如下所述:
1)将智能水表的健康状态数据逐条按时间范围批量打包成数据块,单个健康状态数据结构由智能水表唯一标识、报警代码、实际数值和报警时间组成.将时间范围内的数据块哈希据、智能水表钱包地址和上一数据块交易哈希构建JSON 格式数据块;
2)将JSON 数据块进行SHA256 算法计算获得数据块哈希(数字指纹),通过构建convert 类型交易(交易发起方和交易对家均为同一钱包账户)将数据块哈希、时间范围、水表设备钱包地址和上一数据块交易哈希构成的数据结构,写入到分布式账本交易中,从而完成智能水表健康状态数据模型的构建.
Merkle Tree,也被称为Hash Tree,顾名思义,是一种存储哈希值的树数据结构.Merkle 树的叶子由数据块(文件或文件切片)的哈希值.非叶节点则是其对应子节点串联哈希字符串的哈希.自底向上,最底叶节点层,和哈希列表类似,数据被分成小的数据单元块,有相应地哈希和数据块一一对应.逐级向上回溯,相邻的非叶子节点两个哈希合并成一个字符串,然后运算得出父节点哈希,递归计算得出根哈希,称为Merkle Root.
由上节阐述的水表健康状态数据模型内容可知,分布式账本中健康状态数据是由原始数据经过计算得出的哈希,以水表在单位时间范围内多条健康状态数据哈希值组织成链表.根据实际情况,水务BaaS 服务核心职责为水务平台中所有业务系统提供包括健康状态在内的数据完整性和有效性验证服务,该服务面临高并发、低时延的挑战和要求,需要一种针对健康数据在内的支持高并发高性能遍历检索机制.而链表数据遍历时间复杂度为O(n),不能满足高性能的要求.在借鉴区块链关键技术中Merkle 树关键技术基础上,结合水表健康状态数据模型,提出了一种基于Merkle 二叉树索引模型,将时间复杂度下降了一个维度,由O(n)降为O(logn).
创建水表健康数据Merkles 树,算法步骤过程如图5所示.
图5 健康数据Merkle 二叉树模型
假设某一笔交易写入4个水表健康状态数据.
Step 1.对水表健康状态数据1–4 做SHA256 算法hash 运算,hash (x,y)=hash(datai),i=1,2,3,4,(x,y)=0,1.
Step 2.第2 层相邻两个hash 块串联,做SHA256 hash 运算,hashz=hash (hash(x,y)),z=0,1,(x,y)=0,1.
Step 3.第3 层重复第2 层的两两hash 运算,生成Merkle Root Hash,hash root=hash (hashz),z=0,1.
易得,创建Merkle 树是O(n)复杂度(指O(n)此hash 运算),n是数据量级.
检索水表健康数据Merkle 树算法步骤如下:
Step 1.首先比较Root Hash是否相同,如果不同检索其孩子hash 0和hash 1;
Step 2.hash 0 相同,hash 1 不同.检索hash 1的孩子hash 1-0和hash 1-1;
Step 3.hash 1-0 不同,hash 1-1 相同.Hash 1-0为叶子节点,获取其对应的健康状态数据.
Step 4.检索比较完毕.
健康状态数据的验证分为两个步骤:智能水表设备验证、健康状态数据的验证.前者的验证方法参照上述的传感设备可信度验证方法,通过此验证,则进行下一步健康状态数据的验证,否则,返回验证结果未通过.健康状态数据的验证方法如下:
1)确认待验证健康状态数据时间范围和智能水表唯一标识(数据中包含智能水表的ID);
2)根据智能水表ID和时间戳范围检索待验证区块和交易;
3)批量验证:SHA256 算法计算多条健康状态数据Merkle Root Hash,单条验证:SHA256 算法计算单条健康状态数据Hash;
4)批量验证:对比账本交易上Merkle Root Hash,单条验证:对比Merkle 树对应的叶子Hash;
5)验证对比结果:对比一致则健康状态数据是可信的没有被篡改,对比不一致则健康状态数据是不可信的已经被篡改,流程步骤如图6所示.
图6 健康状态数据验证流程图
针对当前区块链系统数据上链遇到的TPS 瓶颈问题,本文提出了基于双缓冲队列的多节点上链方法.如图7所示,左侧为物联网平台(IoT);中间为BaaS 服务,包括双缓冲队列和线程池两部分;右侧为联盟链,其中白色节点为当前可用节点,灰色节点为当前不可用节点.IoT 回传的数据并写入双缓冲队列;消费者通过读取缓冲队列数据,结合联盟链中当前可用节点创建上链任务传入线程池任务队列,实现多节点异步上链.
图7 基于双缓冲队列的多节点接入
这种方式先将数据存放到双缓冲队列,然后通过线程池异步上链,使得数据上链过程分散到了联盟链各个节点,与IoT 连接联盟链上链的方式相比,很大程度解决了单一节点上链中存在的区块链系统TPS 瓶颈问题.
如图8所示,基于双缓冲队列实现多点接入的具体流程如下.
图8 线程池任务发布流程
1)获取区块链节点列表,若列表为空,结束;
2)获取联盟链中可用节点列表,若列表为空,结束;
3)从双缓冲队列读取数据;
4)判断数据是否为空,不为空执行流程5),为空执行流程6);
5)根据可用节点情况构建上链任务;
6)交换队列;
7)判断线程池是否存在,不存在执行流程8),存在执行流程9);
8)创建线程池;
9)线程池分发任务;
10)多节点上链.
需要注意的是,在初始化线程池时,需要遵循等式Nt=Nb,其中,Nt代表线程池的最大线程数,Nb代表联盟链的节点数.上链任务以联盟链中的可用节点为基准,即任务中连接的节点为当前可用节点,并遵照平等原则,依次为节点分配任务.
本章节针对智慧水务平台有BaaS 服务和无BaaS服务情况分别对接入区块链系统功能性和效率性方面出发做对比分析,结果如表1所示.
(1)BaaS 服务降低了业务系统与区块链系统间的耦合度,大大降低区块链的使用门槛.通常情况下不使用BaaS 服务,各应用接入系统需各自开发相应的区块链的搜索查询、交易提交、区块生成等服务接口,而采用BaaS 服务则可在BaaS 服务中模块化常用功能,系统接入方无需精通或掌握区块链底层技术细节,无需相关的资源环境运维投入,即可快速接入使用区块链.本文中设计的面向智慧水务平台的区块链BaaS 服务为水务数据提供统一的上链接口,水务业务系统与底层区块链系统之间实现解耦合,即便底层区块链系统整体被替换情况下,亦不会影响水务数据的上链,降低了业务系统数据上链门槛,更便于后期扩展更多的业务系统数据进行快速上链.
(2)BaaS 服务根据高并发数据的使用场景和业务特点,拓展自定义智能水表信息和健康状态数据模型及双缓冲多节点接入技术,满足个性化的高并发数据上链需求.区块链技术去中心化的共识机制需要全网节点对系统中的每一笔交易达成共识,这种共识机制限制了区块链系统的吞吐量.目前主流的区块链如比特币区块链、以太坊等TPS(系统吞吐量)均在几十、几百,最高也不过几千,远远无法满足数以万计的智能水表组成IoT 网络的智慧水务系统的数据写入速度需求.本文采用智能水表信息和健康状态数据模型在BaaS 服务中定制化的将海量上链水表健康数据打包成数据块进行上链,无需修改区块链底层即实现高并发下海量数据的区块链上链服务,写入效率大大提升.
表1 BaaS 服务的优势对比
随着区块链技术的演进和发展,以及在各行业应用中的渗透和普及,越来越多区块链加行业领域的新技术和新模式将会涌现出来.本文聚焦于智慧水务加区块链方向,针对水务数据特别是智能水表管理中面临的数据可信度问题,利用区块链的公开、透明和不可篡改性提供解决方案.通过建立水务区块链BaaS 服务解决水务数据写入分布式账本中面临的瞬时高并发量和水务数据验证过程中检索效率低的问题.在创新点方面:(1)提出了一种适用于智能水表健康数据在区块链系统中存储的数据结构,有效利用分布式账本中存储空间基础上,提供了健康数据高效的验证的机制.(2)提出了一种基于双缓冲队列和多节点接入的关键技术,支持百万量级瞬时高并发的健康状态数据写入区块链系统分布式账本.
后续研究方向和工作聚焦在以下两个方面:(1)将更多类型和更大量级的水务数据(排水、污水控制处理等)接入到BaaS 服务;(2)针对水务数据具备一定普适性的分布式账本数据模型做进一步研究.