APP下载

基于区块链的农产品可信检测数据存储方法

2022-09-29唐豪易文龙赵应丁殷华徐亦璐

科学技术与工程 2022年24期
关键词:布隆哈希过滤器

唐豪,易文龙*,赵应丁,殷华,徐亦璐

(1.江西农业大学计算机与信息工程学院,南昌 330045;2.江西农业大学江西省高等学校农业信息技术重点实验室,南昌 330044)

中国作为一个农产品生产大国,农产品质量安全问题一直备受关注,但农产品从生长成熟、检测入市到消费者食用的整个流通是一个开放过程,它会受诸多因素影响,如有生长环境、生产过程、人为管理、有害生物侵袭等因素,因此,在整个流通环节中,加强农产品质量检测数据管理对提升其质量安全监管有着促进作用。以传统数据库管理系统为代表的检测管理系统,它只是完成了检测项目、检测流程、参与人员及角色等描述从物理世界到数字世界的转变,但是数据主要存储在相关检测单位或其他利益方,并没有完全提升消费者对农产品检测数据的可信度。区块链是一种去中化、存储数据不可篡改、带时间戳的分布式账本。近年来,有学者将区块链技术应用到农产品品质安全监管中[1-2],提高了数据的可信度。洪坤明等[3]基于区块链设计开发了分层多用户的水产养殖品质量追溯系统;吴晓彤等[4]以区块链系统为基础,利用数据分片实现农产品信息的分布式安全存储;于合龙等[5]基于区块链对水稻供应链溯源信息进行保护模型研究,均使用区块链技术保证食品的安全追溯,有效解决了食品信息的不透明和可篡改等问题。原因在于数据管理相关参与者在和自节点上记录与维护同一数据账本,并且向该账本插入数据时,需要满足一定数量节点的共识后才能修改,从而保障数据去中心化数据管理的可靠性;区块链中哈希函数对农产品检测数据完整性的校验[6],使得上链数据不可篡改,一旦发生数据安全事故,能够对出现问题的环节进行有效的溯源与追责,这样保证了监管部门、检测人员、消费者三方建立安全、透明的检测服务流程,提高了检测数据的可信度。

然而与传统数据库管理系统比较,现有区块链系统在性能上存在查询效率低,查询操作简单且功能有限,数据扩展不灵活等问题[7]。为使得安全可信的检测数据能够高效实时上链,可通过链上链下结合的数据存储方式来缓解[8]。在农产品质量检测工作中,检测站的工作人员涉及的数据描述较为复杂,一方面是农产品的类别范围广与属性跨度大,另一方面检测结果有可能是图片或视频等多模态数据,如果大面积实时上传该类材料,区块链系统会难以应对如此庞大的吞吐量,导致事务提交的延迟高,限制了检测数据上链效率。针对上述问题,设计了一种链上链下结合的农产品检测数据存储方案,通过采用区块链与链下数据库相结合的链上链下数据存储模式,将快速增长的数据量存储在链下传统数据库,仅将数据关键字段上链,以应对高吞吐量的情形,并融合布隆过滤器至缓存层。

1 相关技术

1.1 区块链基础

区块链是由一个个交易区块组成的链式结构,每个区块存储着某个时间阶段的交易数据,其本质就是通过哈希函数将这些区块串起来,从而使区块里的内容不可篡改。如图1所示,区块链每个区块都由区块头和区块体构成,区块头存储了前一区块哈希、时间戳、版本号、随机数和默克尔树根等区块主要信息,而区块体存储默克尔树除根节点外的所有节点,其中最底层的叶子交易A至交易D存储交易事务数据本身,默克尔树的中间节点存储其下一层节点的哈希值,由下至上构建成一棵满二叉树型结构。从区块链的第一区块(创世区块)开始,通过在当前区块存储前一区块哈希值的方式,从而形成一种链式存储结构。

图1 区块链结构Fig.1 Blockchain structure

1.2 分布式数据库

分布式数据库是由一群分布在不同地方的计算机系统软件组成,这群系统具有本身的局部数据库,然后通过计算机网络连接,形成整个全局数据库。与传统数据库相比,分布式数据库具有高效高量可扩展、稳定可靠低成本等显著优势。

1.2.1 高效高量可扩展

分布式数据库采用分库分表的方式,将数据分散的存储到多个节点,实现平滑地扩展。可在后期使用阶段根据业务访问量和数据存储量的增长,动态平滑地增加存储节点[9],提升数据库的性能和容量,以满足业务连续性要求。

1.2.2 安全可靠低成本

分布式数据库采用多副本机制,副本间通过一致性算法保持数据的一致性,如Raft、Paxos等。当系统中的局部发生故障,其他节点仍旧还可继续工作,不会造成数据丢失,解决单点故障的问题,从而保障数据存储的安全可靠。同时分布式数据库克服了物理中心数据库的弱点,业务访问针对局部数据库的节点,而且单个事务处理消耗的成本也会比集中式数据库显著降低。

1.3 布隆过滤器

布隆过滤器是一种概率性的二进制数据结构,它是一个有固定位数的bit向量或者说是bit数组,内部结构十分简洁,在进行数据读取和写入操作方面有着很好的性能,时间复杂度为O(1),同时空间占用率也有很大优势。布隆过滤器的内部结构是一个映射关系,如果需要将集合域中的某个元素映射到布隆过滤器中,首先将这个元素通过k个哈希函数计算生成k个哈希值,并对全部生成哈希值对应位置的数组位标为1 。不过布隆过滤器在检索某元素是否存在指定集合域时有一定的错误概率[10-11],会产生误判,布隆过滤器误判率的计算公式为

(1)

式(1)中:p为布隆过滤器误判率;k为哈希函数个数;m为布隆过滤器长度;n为输入的元素个数。

根据式(1)可以看出,误判率可通过增加m、减少n或k进行降低。当布隆过滤器数组m长度固定,n的大小受主观使用因素变化很大,因此k的取值变得尤为重要,只有求得k的极值,才能确保误判率最小。对式(1)两边取对数进行推导可得

(2)

将式(2)代入式(1)中可得

(3)

化简得

(4)

2 系统架构设计

基于区块链的农产品可信检测的存储架构共分为5个层次,如图2所示,链下数据库、区块链数据库、网络、合约、应用5个层次。应用层是区块链系统和用户使用的交互接口层,为用户提供应用和服务;合约层是执行智能合约的关键所在[12],封装了区块链系统运行的各类代码脚本,是区块链系统的核心技术;网络层是采用了对等互联网络(peer to peer,P2P)技术,它具备去中心化的数据传播和验证机制。在传统的区块链系统中,数据层以日志存储的方式进行数据的分布式存储,用户上传的数据会首先记录到最底层的叶子交易中,然后通过哈希函数运算得到哈希值保存在叶子节点中,由下至上依次组合运算形成新的哈希,最终得到根哈希保存在区块头中。而本研究的思路是在区块链架构的基础上引入一个链下数据库。检测站的工作人员录入的数据将分为两部分存储,链下数据库负责存储大部分的数据,链上区块链只存储检测信息主要字段。首先将检测数据存储到链下数据库中,然后选取数据中的主要字段上链,如数据集1中的P1字段为上链存储,P2、P3、P4字段则在链下数据库存储,由链下数据库提供大容量存储,区块链提供数据安全防篡改的保证。

图2 基于区块链农产品可信检测数据的存储方法架构Fig.2 Storage method architecture of agricultural products trusted detection data based on blockchain

2.1 链上链下存储模式

利用区块链技术构建的农产品检测数据管理系统,其可信、可追溯特性保障了检测站工作人员和农产品消费者对检测数据的可信度;同时其分布式、哈希函数验证的存储特性,不仅能够减少网络单点存储故障、数据丢失问题,也能够防止他人恶意篡改检测数据的可能。如图3所示,将图像、视频等多大容量的检测数据存储在本地检测机构,再借助哈希函数将上述文件生成数据摘要与拟定的重要农产品检测字段的内容哈希化上链。链下数据库可选用诸如SQL Server、MySQL等性能稳定的关系型或NoSQL非关系型数据库。由于MYSQL数据库开源、功能完善,选用此数据库作为链下数据库。用户将数据按批次全部存储在链下数据库,链下数据库将用户存储的数据主要字段进行打包。当数据存放批次达到给定数量阈值时,计算其Hash摘要值并上传至区块链。如需查看完整的数据存储信息,可通过该 Hash 值解密成原始字段,回至链下数据库进行查看。该存储模式具备链下检测数据大容量,链上数据完整性优点。

区块链和传统数据库在属性上不同的关键点,互相利用并增强彼此的特性。一是传统的区块链吞吐量随着参与区块链的节点处理能力的增加而降低,然而,在分布式数据库的情况下,吞吐量随着节点的增加而增加,但区块链与数据库中的事务延迟相比,区块链中的事务延迟通常较高,因此,通过使用链下数据库,可以根据需要降低延迟;二是因为传统的区块链平台使用分布式键值对数据库LevelDB作为底层数据库[13],不支持历史数据中的复杂查询,许多应用程序都需要这些查询来检索所需的信息,而传统数据库对历史数据的查询可以通过使用多版本并发控制来支持;三是区块链不可变性或不可篡改性,在数据库系统中,可以通过禁止在数据库中删除和更新的机制来实现这种抗篡改能力;四是区块链的去中心化、分布式多节点特性,随着与传统数据库的结合,在各线下节点中存储相同的数据并上链存储,动态平滑地增加存储节点,以满足业务连续性要求。

数字字母组合为哈希值图3 链上链下存储模式Fig.3 On-chain storage mode

2.2 融合布隆过滤器的LSM-tree存储架构

区块链底层使用LevelDB数据库,其核心是由多个排序字符串表(sorted string table ,SSTable )以不同的层次组织构成的日志结构合并树(log-structured-merge-tree,LSM-tree)存储架构,通过消除随机写入转化为顺序写入,从而提供良好的写入性能。图4为LevelDB存储结构,数据记录的存储介质为内存和磁盘文件。在进行写入操作时,k-v(key-value)键对首先被写入MemTable(memory table)中缓存,当 MemTable 填满后将其锁定并转换为不可变的MemTable,随后下放到磁盘中形成新的SSTable并追加到辅助存储器第0层中。当进行查询操作时需要第0~n-1层逐级搜索它,直到查找到第一个符合要求的记录为止。因此,通常需要读取多个表才能找到一个键,这会导致读取放大,而布隆过滤器常用于减少读取放大。

图4 融合布隆过滤器的LSM-tree存储架构 Fig.4 LSM-tree storage architecture that incorporates Bloom filters

加入布隆过滤器可在数据查询时首先在数据缓存层搜索,如果k键不存在或者过期,再对数据库进行查询,并把查询结果放进缓存[14];如果数据库查询结果为空,则不放进缓存。如果每次查询一个不存在k-v对,而缓存中没有数据,每次都要去查询数据库,消耗了其查询性能。查询一个数据库中不存在的数据,这也就是常见的缓存穿透问题。使用布隆过滤器可以快速判断元素是否已经存在,避免频繁访问磁盘[15]。用户发出查询请求,判断是否命中布隆过滤器,如是则继续查询数据库,否则直接返回,该k键一定不存在对应的value值。将数据库中的空值存储到缓存层中,查询空值就不会直接访问数据库,即限定了在缓存层中访问,进一步提高了数据查询效率。同时布隆过滤器不需要存储元素本身,所以对某些数据要求严格保密的情况下安全性更好。

2.3 系统功能与事务处理

本系统是基于区块链的农产品可信检测存储方法的分布式存储系统,系统功能模块中的用户管理模块和检测信息管理模块需要借助智能合约实现在区块链平台上的可信数据存储和读取。在区块链中,智能合约的一次执行相当于数据库中的一个事务,并且事务的提交是以区块为单位,而不是以每个事务为单位。与传统数据库相比,在事务处理方面同样需要满足事务的原子性、一致性、隔离性和持久性特性,并且区块链系统加入可追溯性,确保链上的数据环环相扣,如某个阶段服务器出现问题,错误数据可保障有据可依,有链可循。如果区块链运行在不可信环境,事务的处理过程还需要考虑区块链系统所采用的共识协议影响[16-17],因为事务的处理包含模拟、验证等过程,当其共识协议达成之后,每个节点才会执行区块内的事务。

如图5所示,用户管理模块主要针对相关检测站的工作人员的管理,工作人员注册为系统管理员后方可使用系统提供的服务。在首次注册使用时,系统通过事务处理1.1~1.5步骤添加用户,生成区块链账户,将用户的注册信息通过Hash算法计算成私密摘要。接着发布智能合约,将该Hash摘要值存储上链并反馈给用户,同时该摘要值绑定了所在检测站点,如出现问题可追溯查询,针对错误工作纠正处理。检测信息管理模块用于检测站点工作人员对检测数据的上传和管理。上传检测信息时,工作人员先将批量检测信息按批次存储到本地链下数据库,当链下数据库存储的检测数据存放批次达到给定数量阈值时,系统通过事务处理2.1~2.5步骤添加检测信息。首先系统进行预处理,将上传的检测数据计算成一段Hash值,将该Hash值与链上已存储的Hash值进行对比,确保检测数据信息的唯一性。然后系统会将上传的检测数据通过Hash算法解密后以文本信息显示在web端页面中,供给各站点人员与消费者正常查看。上传的检测数据拥有唯一的检测编号作为标识,可通过该标识查询其他站点的检测数据,如对某个检测结果存在疑问,可联系该站点工作人员进行讨论,并对错误检测信息进行修改。当系统通过事务处理3.1~3.7步骤进行查询时,由于融合布隆过滤器,查询的编号会优先进行缓存层进行查询,判断该编号是否存在,如不存在返回空值,如存在则调用智能合约返回检测信息。

图5 区块链事务处理交互时序图Fig.5 Blockchain transaction processing interaction sequence diagram

整个系统启动运行需要在区块链网络和环境的支持,首先拉取系统启动所需要的 docker 镜像,然后生成各组织的证书、通道、创世区块以及各节点,接着安装、实例化链码并进行调用,最终完成整个区块链后台的启动。

3 实验与评价

制订了两种实验方案:有、无融合布隆过滤器的区块链农产品检测系统性能对比,来验证了研究方案的系统查询效率。实验环境采用了3个阿里云服务器作为检测环节中的参与方线上记账节点,其软硬件详细配置为:系统镜像为Ubuntu 16.04 64位,支撑环境为go1.15.3 linux/amd64,支撑软件为Docker version 18.09.7,硬件环境为1核CPU、2 GB 内存、40 GB 硬盘、1 M带宽。

首先对系统本身进行运行测试,在此次基础上逐步增加查询次数,根据查询耗时来评价其查询效率;其次在同等环境中,加入布隆过滤器,测试其在以上两个方面查询效率的变化情况。图6为有无布隆过滤器下查询已有元素,图7为有无布隆过滤器下查询空值元素。

图6 有、无布隆过滤器下查询已有元素Fig.6 Query existing elements with or without a Bloom filter

图7 有、无布隆过滤器下查询空值元素Fig.7 Query null-valued elements with or without a Bloom filter

实验结果(图6、图7)表明,在同等实验环境中,对系统中的已有元素进行查询时,加入布隆过滤器后在查询效率上有所提升,但提升程度不大;对空值元素进行查询时,加入布隆过滤器后对查询效率有显著提升。该实验结果表明在链上链下存储结合模式中,加入布隆过滤器,不仅能在保证检测数据在区块链中的安全可信存储,而且在数据查询性能提升方面有较大的改善。

4 结论

区块链是一个多方参与记录数据的可信账本,其开放透明、可追溯和不可篡改等特性给农产品检测信息的可信存储提供了保障。基于区块链对检测数据分类存储,即大文件检测数据的源文件存储在本地数据库,该文件的哈希摘要与重要的检测字段打包在链上数据库存储,能够有效地保障检测数据的完整性,同时布隆过滤器的引入能够提升区块链系统的查询效率。本文方法为农产品质量安全检测提供了一种可信的技术方案与应用案例。

猜你喜欢

布隆哈希过滤器
哈希值处理 功能全面更易用
Windows哈希值处理不犯难
文件哈希值处理一条龙
守门员不在时
针对石化行业过滤器流阻的探讨及研究
花粉过滤器
新型纳米材料过滤器
基于混淆布鲁姆过滤器的云外包隐私集合比较协议
巧用哈希数值传递文件