技术领域
[0001] 本
发明涉及信息技术领域中的信息获取与处理技术,尤其涉及一种基于区块链的农产品追溯信息存储方法。
背景技术
[0002] 当前,随着经济的高速发展与人民生活
水平的不断提高,
食品安全问题已逐渐成为社会关注的焦点。各部委、地方政府及行政主管部
门顺应这一需求,在各个行业内开始试点追溯体系的建设工作,并取得了长足的进展。
[0003] 与定型
包装食品不同,目前我国农产品的生产过程受限于生产规模和信息化水平,尚未实现全过程信息追溯。近年来,随着
物联网技术的发展与普及,农产品生产也正向着集约化、规模化、信息化的方向演进,并且对追溯信息的存储模式提出了更高的要求。
[0004] 于此同时,随着社会大众对于农产品
质量安全问题的关注程度日益提高,消费者对于农产品追溯信息的可信性需求也越来越迫切。
[0005] 如何通过区块链技术,实现农产品追溯信息的条块化、规格化、持久化存储,并通过
密码学技术对上述信息实现可信的保护,便于企业、消费者、行政主管部门进行完整性校验,实现
覆盖农产品追溯信息的数据
预防性控制、检查性控制和恢复性控制,是当下具有研究价值和应用价值的问题。
发明内容
[0006] 本发明所要解决的技术问题是针对背景技术中所涉及到的
缺陷,提供一种基于区块链的农产品追溯信息存储方法。
[0007] 本发明为解决上述技术问题采用以下技术方案:
[0008] 用以存储农产品追溯信息的区块类型BC是一个抽象数据类型,通过面向对象分析方法(Object-Oriented Analysis)中的类(Class)进行实现。
[0009] 用以存储农产品追溯信息的区块类型BC的实例(Instance)BI由以下2个部分组成:区块首部BH,区块本体BB。
[0010] 当需要生成一个用以存储农产品追溯信息的区块类型BC的实例(Instance)BI时,首先执行区块初始化方法IP。IP为BC的构造函数,也可以是以BC为基类的任何继承类的构造函数。IP对BI初始化时,分别对区块首部BH和区块本体BB中的属性进行初始化。
[0011] 其中,区块首部BH至少具有以下属性:
[0012] 区块编号BS,数据类型为64位无符号整型,含义为该区块从区块链首部开始计算的偏移
位置的编号,当BS为0时表示该区块为区块链中的初始区块,以此类推,BS默认值为0;
[0013] 前向哈希PH,数据类型为字符串,含义为该区块在区块链中前一个区块的哈希值,当PH为空时表示该区块本身为区块链中初始区块,PH默认值为空;
[0014] 不重数NC,数据类型为字符串,含义为一个调用伪随机
算法生成的随机字符串,用以避免区块链中的各区块发生哈希碰撞(Hash Collision),当NC为空时表示该区块本身为区块链中初始区块,NC默认值为空;
[0015] 首部哈希HH,数据类型为字符串,含义为该区块首部BH中除HH以外所有属性的哈希值,HH默认值为空。
[0016] 区块本体BB至少具有以下属性:
[0017] 本体数据BD,数据类型为字符串,含义为在该区块中所存储的农产品追溯信息数据,BD默认值为空;
[0018] 数据哈希DH,数据类型为字符串,含义为在该区块中所存储的农产品追溯信息数据的哈希值,DH默认值为空。
[0019] 初始化过程IP完成后,BI中的上述属性均被设为默认值,开始执行区块赋值过程AP。
[0020] 区块赋值方法AP:通过输入的农产品追溯信息,更新实例BI中区块本体BB的属性,具体步骤如下:
[0021] 将需要存入该区块的农产品追溯信息AI序列化之后,赋值给实例BI中区块本体BB的本体数据BD,其中BD的数据类型为字符串,含义为序列化的农产品追溯信息数据,格式可以是SOAP(Simple Object Access Protocol)、JSON(JavaScript Object Notation)或其他协议;
[0022] 使用MD5、SHA1或其他
哈希算法计算BD的哈希值,其类型为字符串,含义为本体数据BD的散列信息。然后,根据该哈希值更新数据哈希DH;
[0023] 区块赋值过程AP完成后,BI中上述属性的值被更新,开始执行区块插入过程CP。
[0024] 区块插入方法CP:通过将实例BI插入链表CT,并更新BI中区块首部BH的属性,使BI与CT链表中的其他实例建立哈希连接(Hash Join),从而组成一条区块链,具体步骤如下:
[0025] 检查链表CT的长度是否为零,CT是由若干个区块类型BC的实例组成的链表,其长度大于或等于零;
[0026] 若链表CT的长度为零,则说明当前区块链内还没有任何区块,将实例BI作为初始区块插入链表CT;
[0027] 若链表CT的长度不为零,则说明当前区块链内已存在若干个现有的区块,将实例BI插入链表CT尾部,并与CT原来的尾部实例建立哈希连接。
[0028] 当链表CT的长度为零时,需要更新实例BI的区块首部BH中的属性,具体步骤如下:
[0029] 更新实例BI的区块编号BS的值为0,含义为BI是CT中首个实例;
[0030] 更新实例BI的前向哈希PH的值为空,含义为BI之前不存在任何其他实例;
[0031] 更新实例BI的不重数NC的值为空,含义为BI是CT中首个实例,不会与其他实例产生哈希碰撞;
[0032] 对实例BI的区块首部BH中的区块编号BS、前向哈希PH、不重数NC进行连接运算,使用MD5、SHA1或其他算法计算连接运算结果的哈希值,其类型为字符串,含义为区块首部BH的散列信息。然后,根据该哈希值更新实例BI的首部哈希HH;
[0033] 当链表CT的长度大于零时,同样需要更新实例BI的区块首部BH中的属性,从而和CT原来的尾部实例建立哈希连接,具体步骤如下:
[0034] 对CT原来的尾部实例中区块编号BS的值进行加1运算,并根据运算结果更新实例BI的区块编号BS的值,含义为BI是CT中原来的尾部实例之后的一个实例;
[0035] 对CT原来的尾部实例中首部哈希HH与数据哈希DH进行连接运算,使用MD5、SHA1或其他算法计算其结果的哈希值,其类型为字符串,含义为CT原来的尾部实例的区块散列值。然后,根据该哈希值更新实例BI的前向哈希PH,建立BI与CT原来的尾部实例之间的哈希连接;
[0036] 使用伪随机算法随机生成一个字符串,含义为一个无实际语义的随机变量,用以避免在后续过程中产生首部哈希HH的碰撞。然后,根据该字符串更新实例BI的不重数NC;
[0037] 对实例BI的区块首部BH中的区块编号BS、前向哈希PH、不重数NC进行连接运算,使用MD5、SHA1或其他算法计算连接运算结果的哈希值,其类型为字符串,含义为区块首部BH的散列信息。然后,根据该哈希值更新实例BI的首部哈希HH;
[0038] 区块插入过程CP完成后,实例BI被插入链表CT,并更新BI中的上述属性,开始执行持久化过程RP。
[0039] 持久化方法RP:根据链表CT更新的结果,通过增量更新或总量更新的方式,将CT持久化保存至
数据库管理系统或文件系统中。
[0040] 本发明采用以上技术方案与
现有技术相比,具有以下技术效果:
[0041] 通过区块链技术,实现农产品追溯信息的条块化、规格化、持久化存储,便于在数据传输、存储及交换过程中实现数据的标准化;通过密码学技术建立了区块间的哈希连接,对农产品追溯信息实现了可信的保护,能够检测恶意实体对于数据的非授权篡改,便于企业、消费者、行政主管部门进行完整性校验,有利于实现覆盖农产品追溯信息的数据预防性控制、检查性控制和恢复性控制,可以有效预防不法分子对于农产品追溯信息数据的的伪造、篡改,提高追溯信息内容的完整性和抗攻击能
力。
具体实施方式
[0042] 下面对本发明的技术方案做进一步的详细说明:
[0043] 令设实现过程中开发语言为Java,集成开发环境为Eclipse,将用以存储农产品追溯信息的区块类型BC编写为以下类(Class)
[0044] public class PC{
[0045] class BH{
[0046] Long BS;
[0047] String PH;
[0048] String NC;
[0049] String HH;
[0050] }
[0051] class BB{
[0052] String BD;
[0053] String DH;
[0054] }
[0055] }
[0056] 当需要生成一个用以存储农产品追溯信息的区块类型BC的实例(Instance)BI时,执行区块初始化过程IP。IP为BC的构造函数,首先生成一个BC的实例BI;
[0057] BI=new BC();
[0058] IP分别对于BI中BH和BB的每一个属性进行赋值操作,设为默认值:
[0059] BI.BH.BS=0;
[0060] BI.BH.PH=””;
[0061] BI.BH.NC=””;
[0062] BI.BH.HH=””;
[0063] BI.BB.BD=””;
[0064] BI.BB.DH=””;
[0065] 初始化过程IP完成后,开始执行区块赋值过程AP。
[0066] 设输入的农产品追溯信息为纯文本,使用JSON(JavaScript Object Notation)格式对其进行序列化后,得到的值如下:
[0067] {
[0068] “SPU”:”1230056781234”,
[0069] “SKU”:”c1e26952-514e-4a69-bcfd-776774fbe04c”,
[0070] “PN”:”早春红玉”,
[0071] “BN”:”20180314”,
[0072] “MU”: ”第一实验农场”,
[0073] “PU”:” 4个/箱,10kg”,
[0074] “PE”:[
[0075] {
[0076] “Action=购种& Data=GPD西瓜(2018)310083& Category=
播种阶段&TimeStamp=2018-02-01 00:00:00”
[0077] },
[0078] {
[0079] “Action=育苗&Data= 1000株&Category=播种阶段&TimeStamp=2018-03-25 00:00:00”},
[0080] {“Action=除虫& Data=PD20121962,10kg& Category=生长阶段&TimeStamp=2018-04-01 00:00:00”},
[0081] {Action=采摘&Data=28℃/30%&Category=采摘阶段&TimeStamp=2018-05-01 00:00:00”},
[0082] {Action=装箱&Data=30℃/50%&Category=采摘阶段&TimeStamp=2018-05-02 00:00:00”}
[0083] ]
[0084] }
[0085] 将上述值赋值给BI中BB的BD,然后使用MD5哈希算法计算BD的哈希值,结果为”B23BBD5B74F3376C0F58F46A48B3D991”。将上述结果赋值给BI中BB的DH,即为BD的散列信息。
[0086] 区块赋值过程AP完成后,开始执行区块插入过程CP。
[0087] 设链表CT是由若干个区块类型BC的实例组成的链表,其类型为ArrayList,长度为5,说明CT中已存在5个实例。因此,将BI作为第6个区块插入到CT末尾,并更新BI中BB的以下属性:
[0088] 首先,获取链表CT原来的尾部实例中区块编号BS的值(5-1)=4,进行加1运算得到5,再赋值给BI中BB的BS;
[0089] 设CT原来的尾部实例中首部哈希HH的值为”3B69831F827080328957930A8F60B4A3”,数据哈希DH的值为”1E6D5D717158698F26B11C3D4ED5178A”,对其进行连接运算,结果为”3B69831F827080328957930A8F60B4A31E6D5D717158698F26B11C3D4ED5178A”。使用MD5哈希算法计算上述结果的哈希值,得到”9A2F98C3045C7B8796CA60E08C7A0779”,赋值给BI中BH的前向哈希PH。除初始区块外,链表CT中每一区块实例的前向哈希PH都与前一个实例的首部哈希HH和数据哈希DH建立哈希连接关系,从而共同组成一条区块链。
[0090] 使用GUID方法生成一个的随机字符串,结果为”f6923141-d18e-405b-801e-e3f28883e095”,赋值给BI中BB的不重数NC。不重数NC旨在避免在下一步计算中产生重复的首部哈希HH,并无语义上的含义。
[0091] 对实例BI的区块首部BH中的区块编号BS、前向哈希PH、不重数NC进行连接运算,结果为”59A2F98C3045C7B8796CA60E08C7A0779 f6923141-d18e-405b-801e-e3f28883e095”。使用MD5哈希算法计算上述结果的哈希值,得到”999B835E46AE96E55AA8E1837E801A79”,赋值给BI中BH的首部哈希HH,即为BH的散列信息。
[0092] 当CT原来的尾部实例中任意属性受到非法篡改时,根据该属性所在的位置,分别重新计算区块首部BH中首部哈希HH或区块本体BB中数据哈希DH的值,并将更新后的值进行连接运算之后使用MD5哈希算法计算其哈希值,然后与链表CT中下一个区块实例的前向哈希PH进行比较。当两个值不同时,即可发现该区块实例受到了篡改。
[0093] 区块插入过程CP完成后,实例BI被插入链表CT,并与前一区块实例建立哈希连接,开始执行持久化过程RP。
[0094] 持久化过程RP根据更新后的链表CT,将其以增量更新的形式持久化存储至分布式
数据库管理系统中。此处使用Apache Cassandra作为数据库管理系统,
节点数设为3,副本因子设为1。持久化过程RP完成后,若需要生成新的区块实例BI,则可以按顺序重复执行上述过程,直至没有新的农产品追溯信息输入产生。
[0095] 本技术领域技术人员可以理解的是,除非另外定义,这里使用的所有术语(包括技术术语和科学术语)具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样定义,不会用理想化或过于正式的含义来解释。
[0096] 以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何
修改、等同替换、改进等,均应包含在本发明的保护范围之内。