基于区块链的食品追溯信息的存储技术
2019-11-30张嘉伟
文/张嘉伟
区块链作为一种公共的、分布式的账本,利用时间戳、共识机制等技术手段,实现了数据的不可篡改以及可完整追溯等特性,这不仅可以有效解决中心化数据存储问题,同时也为跨机构溯源体系的建立提供了技术支持。建设基于区块链的食品追溯系统,关键在于实现对食品交易数据的分布式存储和管理,解决存储流程、数据加密、数据存储、数据库选型、及性能瓶颈等问题。
1 区块技术的架构方案
Hyperledger Fabric是IBM 推出的企业级区块链开源架构方案。Fabric定义了链、Peer、通道、共识服务的概念,其中,链代表了账本和对应的共识服务,Peer可以拥有多个逻辑账本,并且可以参与多条链;通道是将Peer连接共识服务的虚拟通信方式;而共识服务既是可信的与链无关的公共服务。
在本项目中,我们基于Fabric搭建系统的架构,底层由多个节点组成P2P网络,通过GRPC通道进行交互,利用Gossip协议进行同步,而业务应用通过SDK访问Fabric网络中的多种资源。系统架构包括账本、交易、链码、事件、权限管理,其中,账本是最核心的结构,记录应用的业务信息;链码承载系统的交易执行逻辑,主要依赖容器、状态机等技术;权限管理负责整个交易过程的访问控制,主要利用已有的PKI体系、数字证书、加解密算法等诸多安全技术。
2 区块数据存储流程
食品信息区块的构建分为两部分,一部分是将食品供应交易信息的追溯哈希码生成区块并注册到区块链上,另一部分是将共享的食品相关信息形成标准文档,并把文档的索引生成区块并注册到链上。其处理流程如下:
2.1 生成食品注册信息
系统为每个食品交易信息生成一对公钥和私钥地址,使用设定的主公钥地址向注册的公钥地址发送消息,生成区块写入到区块链中,完成食品交易信息的登记注册。
2.2 上传食品信息到追溯区块
将食品信息进行封装后用管理机构的私钥地址对这些数据进行数字签名,再传送到脱链的可信云存储数据库,然后利用区块链中的食品管理机构的公钥地址对数据的电子签名进行核对,只有通过核对的数据,可信存储库才认可上传的食品信息是合法的。
2.3 加密食品追溯信息
使用哈希算法对共享食品追溯信息计算生成数字指纹并写入到区块链中。
2.4 存储原始数据
将共享食品原始信息进行脱链存储并存储在云数据库上。
2.5 检索数据
区块节点在收到检索请求后对请求真实性进行验证,通过后查询自己的原始数据并根据请求的计算内容进行计算,并将计算结果用请求方公钥加密返回。
3 核心技术分析
3.1 基于布隆过滤器的区块内容查找办法
hash可以将任意内容映射到一个固定长度的字符串,而且不同内容映射到相同串,构成一个“内容→索引”的生成关系,弊端就是当映射后的值限制在一定范围(如总数组大小)内时,会发现hash冲突的概率会变高,而且范围越小,冲突概率越大。为解决这个问题,我们采用更高效的布隆过滤器,即通过采用多个hash函数来提高空间利用率,对于同一个给定输入,由多个hash函数计算出多个地址,分别在位串的这些地址上标记为1进行查找,进行同样的计算过程,并查看对应元素,如果都为1,则说明较大概率是存在该输入的。实验证明,采用该方法后,误报率低于1%。
3.2 基于同态技术的数据加密
同态加密是基于数学难题的计算复杂性理论的密码学技术,对经过同态加密的数据进行处理得到一个输出,输出进行解密,其结果与用同一方法处理未加密的原始数据得到的输出结果是一样的。在本项目中,使用同态加密技术,通过应用基于带扰动学习的同态加密技术,加密后的数据只有用户自身可以进行解密,整个过程第二方平台无法获知任何有效的数据信息,即运行在区块链上的智能合约可以处理密文,但却无法获知真实数据,极大地提高了数据的安全性。
3.3 区块链数据库解决方案
系统应用LevelDB数据库,这是采用C++编写的一种高性能嵌入式数据库,没有独立的数据库进程,占用资源少,速度快。有如下特点:
(1)键和值可以是任意的字节数组;
(2)数据是按键值排序后存储的;
(3)可以自定义排序方法;
(4)基本操作是基于键的;
(5)支持批量修改的原子操作;
(6)支持创建快照;
(7)支持对数据前向和后向的迭代操作;
(8)数据采用Snappy压缩。
3.4 区块写入性能解决方案
区块链的读取性能通常没有问题,但写入需要在所有节点上做共识及加密运算,这些操作都是CPU密集型操作,所以存在性能瓶颈。针对这个问题,我们通过如下方案解决:
(1)通过消息队列技术进行异步写入,将需要写入的区块放入队列中,再利用kafka、SBTF等共识算法对所有交易信息进行排序并打包成区块,发给committing peers节点,实现区块链上链操作;
(2)并行写入,建设多个区块链平台,用多个平台同时服务于业务。
(3)区分全节点和轻量级节点。区块链网络中的节点包括保存完整区块链的全节点,也包括不保存完整的区块链轻量级节点。全节点能自主校验所有交易信息,不需要借助任何外部参照,轻量级节点只保留了区块链的一部分内容,通过“简易支付验证(SPV)”的方式来完成交易验证。