一种基于区块链跨链的数据交叉存储方法与流程

文档序号:19749997发布日期:2020-01-21 19:15阅读:264来源:国知局
一种基于区块链跨链的数据交叉存储方法与流程

本发明涉及计算机区块链技术领域,特别是涉及一种基于区块链跨链的数据交叉存储方法。



背景技术:

区块链技术是由互不相信的多方共同维护同一种全局状态的分布式分类账本,具有去中心化、冗余存储、防篡改以及可追溯等优点,主要涉及的内容包括链式结构、共识机制和非对称加密等相关算法。在没有第三方介入的情况下,互不相信的人可以通过区块链技术进行数据的分享。因此,区块链在金融、经济以及科技方面都有重要应用。

区块链是以区块为单位的链式结构,一般情况下,区块链的数据结构如图1所示。每个区块由区块头和区块体两部分组成,区块头存放了version、target_bits、nonce、timestamp、prevblockhash和merkleroot等字段,区块体存放着这个区块存储的数据data。version是指版本号,是用来标记交易版本的;target_bits是指难度目标,是生成该区块的难度值;nonce是指随机数,是令区块头部哈希小于难度目标的值;timestamp是指时间戳,记录该区块产生的近似时间。prevblockhash是指前块哈希,存放着前一区块的哈希,所有区块按照生成顺序,通过前块哈希连接在一起,因此区块链中的任一区块被修改,都会影响后面所有区块哈希的改变,从而可以保证区块链的安全性。merkleroot是指merkle树根,merkle树是二叉哈系数,叶子节点是存储的数据,所有子节点值连接后进行哈希运算可以得到父节点,最终可以计算出根节点。区块内任何数据发生改变,merkle树根都会改变,可以保证区块内数据的完整性。

共识机制也是区块链技术中的重要内容。公有链适用pow机制而私有链和联盟链适用pbft算法。pbft可以容忍恶意节点不超过全网节点数量的1/3。pbft算法在区块链中添加信息的方法如下:

(1)从所有节点中选取一个负责生成新区块的主节点;

(2)所有节点广播想要添加的信息,主节点收集后打包成块,然后全网广播;

(3)每个节点收到区块后,计算新区块的hash值,然后向全网广播;

(4)如果一个节点收到2c(c为可容忍的恶意节点数)条和自己相同的摘要,向全网广播commit消息;

(5)如果一个节点收到2c+1条commit消息,新区块即可添加至区块链。

现有基于区块链的数据存储方法中,都是基于单区块链的数据存储,当有恶意节点想要篡改区块链的数据时,现有的方法很难保证区块链的安全性和完整性。



技术实现要素:

针对现有技术存在的问题,本发明提供一种基于区块链跨链的数据交叉存储方法,能够有效保证区块链的安全性和完整性,且节省运行时占用的内存。

本发明的技术方案为:

一种基于区块链跨链的数据交叉存储方法,其特征在于,包括下述步骤:

步骤1:建立n条区块链,基于pbft共识机制向区块链中添加区块,若有区块链添加至触发转移区块条件的区块,执行步骤2至步骤5;若没有区块链添加至触发转移区块条件的区块,继续基于pbft共识机制向区块链中添加区块;

步骤2:选取一条添加至触发转移区块条件的区块的区块链记为original链,将original链添加至的触发转移区块条件的区块记为transition块,将除original链之外的n-1条区块链构成非original链集合;

步骤3:在非original链集合中选取一条用于original链转移transition块的区块链记为select链;

步骤3.1:初始化k=1、途径区块链集合s为空集,记k为非original链集合中的区块链总数;

步骤3.2:利用随机函数从非original链集合中随机选取一条不属于途径区块链集合s的区块链记为sk,将区块链sk添加进途径区块链集合s中;

步骤3.3:若区块链sk添加至触发转移区块条件的区块,则进入步骤3.4;若区块链sk未添加至触发转移区块条件的区块,则将区块链sk作为select链,将区块链sk从途径区块链集合s中剔除,进入步骤4;

步骤3.4:若k=k,则将区块链sk作为select链,将区块链sk从途径区块链集合s中剔除;若k<k,则令k=k+1,返回步骤3.2;

步骤4:在select链中添加完整的transition块;

步骤4.1:在select链中添加transition块,用select链添加的transition块的区块头中的prevblockhash字段记录transition块在select链的前块哈希;

步骤4.2:在select链添加的transition块中额外添加connectblockhash字段,用connectblockhash字段记录transition块原来在original链的前块哈希;

步骤5:在original链及途径区块链集合s中的区块链中添加区块头;所述区块头包括prevblockhash字段、nextblockhash字段、translocation字段、merkleroot字段;

区块链中添加的区块头的prevblockhash字段用于记录该区块头在该区块链的前块哈希;merkleroot字段用于记录transition块的merkle树根,merkle树根为transition块的数据摘要;

若途径区块链集合为空集,original链添加的区块头的nextblockhash字段用于记录select链添加的transition块在select链的前块哈希,original链添加的区块头的translocation字段用于记录select链添加的transition块的位置信息<chainid,height>;其中,chainid为select链的id,height为select链添加的transition块在select链上的位置;

若途径区块链集合为非空,记途径区块链集合s={s1,...,sr,...,sr},sr为途径区块链集合s中的第r条区块链,r∈{1,...,r},r为途径区块链集合s中的区块链总数,区块链sr添加的区块头的位置信息为<chainidr,heightr>,chainidr为区块链sr的id,heightr为区块链sr添加的区块头在区块链sr上的位置,

original链添加的区块头的nextblockhash字段用于记录区块链s1添加的区块头在区块链s1的前块哈希,original链添加的区块头的translocation字段用于记录区块链s1添加的区块头的位置信息<chainid1,height1>,

若r=1,区块链s1添加的区块头的nextblockhash字段用于记录select链添加的transition块在select链的前块哈希,区块链s1添加的区块头的translocation字段用于记录select链添加的transition块的位置信息<chainid,height>,

若r>1,区块链sii∈{1,...,r-1}添加的区块头的nextblockhash字段用于记录区块链si+1添加的区块头在区块链si+1的前块哈希,区块链si添加的区块头的translocation字段用于记录区块链si+1添加的区块头的位置信息<chainidi+1,heighti+1>,区块链sr添加的区块头的nextblockhash字段用于记录select链添加的transition块在select链的前块哈希,区块链sr添加的区块头的translocation字段用于记录select链添加的transition块的位置信息<chainid,height>。

所述步骤1中,转移区块条件为固定步长条件或不定步长条件;当转移区块条件为固定步长条件时,若区块链添加到第2m块区块(m=1,2,3,……),则该第2m块区块触发转移区块条件;当转移区块条件为不定步长条件时,若区块链添加到第2m块区块(m=1,2,3,……),则该第2m块区块触发转移区块条件。

在步骤3中select链被选取后,若select链自身有新的区块准备添加,则需等待步骤4中在select链中添加transition块后再继续添加该新的区块。

本发明的有益效果为:

(1)本发明使用多条区块链跨链对数据进行交叉存储,将区块链中触发转移区块条件的区块随机链接至其他区块链,并在经过的链中记录参与的链的信息,恶意节点如果想要篡改任何一条区块链的数据都需要更改所有与之互相关联的几条区块链的内容,这对恶意节点来说工作量是巨大的,能够有效保证区块链的安全性和完整性。

(2)本发明使用区块头代替完整的区块,能够节省运行时占用的内存,也可以使区块链整体不至于过大。

附图说明

图1为一般区块链的数据结构示意图;

图2为本发明的基于区块链跨链的数据交叉存储方法的流程图;

图3为实施例一中使用本发明的基于区块链跨链的数据交叉存储方法进行数据交叉存储的过程示意图;

图4为实施例二中使用本发明的基于区块链跨链的数据交叉存储方法进行数据交叉存储的过程示意图;

图5为实施例三中使用本发明的基于区块链跨链的数据交叉存储方法进行数据交叉存储的过程示意图。

具体实施方式

下面将结合附图和具体实施方式,对本发明作进一步描述。

实施例一

如图2所示,本发明的基于区块链跨链的数据交叉存储方法,包括下述步骤:

步骤1:建立n条区块链,基于pbft共识机制向区块链中添加区块,若有区块链添加至触发转移区块条件的区块,执行步骤2至步骤5;若没有区块链添加至触发转移区块条件的区块,继续基于pbft共识机制向区块链中添加区块。

其中,转移区块条件为固定步长条件或不定步长条件;当转移区块条件为固定步长条件时,若区块链添加到第2m块区块(m=1,2,3,……),则该第2m块区块触发转移区块条件;当转移区块条件为不定步长条件时,若区块链添加到第2m块区块(m=1,2,3,……),则该第2m块区块触发转移区块条件。两种不同的步长,有不同的特点:采用固定步长,随着区块的增长,各链的交叉逐步增加,交叉频率保持不变,多条区块链的交叉保证平稳状态增加;采用不定步长,随着区块的增长,各链的交叉也逐步增加,但是交叉频率会发生变化,例如,当采用第2m块(m=1,2,3,……)进行区块转移时,随着区块数量的增加,虽然交叉频率会降低,但是会节省查询区块链的查询时间。因此,主节点可以根据自身链的实际情况,通过设定不同的触发条件对交叉频率进行调节,在区块链的安全性和查询速度之间权衡。不同的链可以选择不同的触发条件。

本实施例一中,如图3所示,建立10条区块链,编号为{a,b,c,d,e,f,g,h,i,j},基于pbft共识机制向区块链中添加区块。所有区块链的转移区块条件都采用不定步长条件,也即当区块链添加到第2m块区块(m=1,2,3,……)时,该第2m块区块触发转移区块条件,需要将该触发转移区块条件的区块进行转移。

步骤2:选取一条添加至触发转移区块条件的区块的区块链记为original链,将original链添加至的触发转移区块条件的区块记为transition块,将除original链之外的n-1条区块链构成非original链集合。

本实施例一中,区块链a添加至第2块区块,该第2块区块触发转移区块条件,将区块链a记为original链,将该第2块区块记为transition块,将除区块链a之外的9条区块链构成非original链集合。

步骤3:在非original链集合中选取一条用于original链转移transition块的区块链记为select链;

步骤3.1:初始化k=1、途径区块链集合s为空集,记k为非original链集合中的区块链总数;

步骤3.2:利用随机函数从非original链集合中随机选取一条不属于途径区块链集合s的区块链记为sk,将区块链sk添加进途径区块链集合s中;

步骤3.3:若区块链sk添加至触发转移区块条件的区块,则进入步骤3.4;若区块链sk未添加至触发转移区块条件的区块,则将区块链sk作为select链,将区块链sk从途径区块链集合s中剔除,进入步骤4;

步骤3.4:若k=k,则将区块链sk作为select链,将区块链sk从途径区块链集合s中剔除;若k<k,则令k=k+1,返回步骤3.2。

本实施例一中,利用随机函数srand()随机选取到区块链b,区块链b添加至第5块区块,区块链b未添加至触发转移区块条件的区块,可以将transition块连接至区块链b,从而将区块链b作为select链,得到的途径区块链集合s为空集。

步骤4:在select链中添加完整的transition块;

步骤4.1:在select链中添加transition块,用select链添加的transition块的区块头中的prevblockhash字段记录transition块在select链的前块哈希;

步骤4.2:在select链添加的transition块中额外添加connectblockhash字段,用connectblockhash字段记录transition块原来在original链的前块哈希。

其中,在步骤3中select链被选取后,若select链自身有新的区块准备添加,则需等待步骤4中在select链中添加transition块后再继续添加该新的区块。

如图3所示,transition块除了包含一般区块数据结构中的字段外,还包括connectblockhash字段。在计算select链hash时,除了prevblockhash、merkle树根等,connectblockhash字段也包括在内。

步骤5:在original链及途径区块链集合s中的区块链中添加区块头;所述区块头包括prevblockhash字段、nextblockhash字段、translocation字段、merkleroot字段;

区块链中添加的区块头的prevblockhash字段用于记录该区块头在该区块链的前块哈希;merkleroot字段用于记录transition块的merkle树根,merkle树根为transition块的数据摘要;

若途径区块链集合为空集,original链添加的区块头的nextblockhash字段用于记录select链添加的transition块在select链的前块哈希,original链添加的区块头的translocation字段用于记录select链添加的transition块的位置信息<chainid,height>;其中,chainid为select链的id,height为select链添加的transition块在select链上的位置;

若途径区块链集合为非空,记途径区块链集合s={s1,...,sr,...,sr},sr为途径区块链集合s中的第r条区块链,r∈{1,...,r},r为途径区块链集合s中的区块链总数,区块链sr添加的区块头的位置信息为<chainidr,heightr>,chainidr为区块链sr的id,heightr为区块链sr添加的区块头在区块链sr上的位置,

original链添加的区块头的nextblockhash字段用于记录区块链s1添加的区块头在区块链s1的前块哈希,original链添加的区块头的translocation字段用于记录区块链s1添加的区块头的位置信息<chainid1,height1>,

若r=1,区块链s1添加的区块头的nextblockhash字段用于记录select链添加的transition块在select链的前块哈希,区块链s1添加的区块头的translocation字段用于记录select链添加的transition块的位置信息<chainid,height>,

若r>1,区块链sii∈{1,...,r-1}添加的区块头的nextblockhash字段用于记录区块链si+1添加的区块头在区块链si+1的前块哈希,区块链si添加的区块头的translocation字段用于记录区块链si+1添加的区块头的位置信息<chainidi+1,heighti+1>,区块链sr添加的区块头的nextblockhash字段用于记录select链添加的transition块在select链的前块哈希,区块链sr添加的区块头的translocation字段用于记录select链添加的transition块的位置信息<chainid,height>。

本实施例一中,途径区块链集合为空集,在区块链b中添加完整的transition块,在区块链a中添加区块头。其中,用区块链b添加的transition块的区块头中的prevblockhash字段记录transition块在区块链b的前块哈希,在区块链b添加的transition块中额外添加connectblockhash字段,用connectblockhash字段记录transition块原来在区块链a的前块哈希。区块链a添加的区块头的nextblockhash字段用于记录区块链b添加的transition块在区块链b的前块哈希,区块链a添加的区块头的translocation字段用于记录区块链b添加的transition块的位置信息<chainid,height>,chainid为区块链b的id,height为区块链b添加的transition块在区块链b上的位置。

从上述可以看出,本发明使用多条区块链跨链对数据进行交叉存储,将区块链中触发转移区块条件的区块随机链接至其他区块链,并在经过的链中记录参与的链的信息。其中,转移区块等相关操作,由主节点进行。在修改original链数据时,original、select链以及中间途径的区块链的hash值都会发生改变;修改select链内容则也会导致这些链的hash值发生改变。因为共有n条链,所以恶意节点如果想要篡改任何一条区块链的数据都需要更改所有与之互相关联的几条区块链的内容,这对恶意节点来说工作量是巨大的,因而能够有效保证这n条区块链的安全性和完整性。

实施例二

本实施例二与上述实施例一的不同之处在于:

如图4所示,区块链a添加至第4块区块,该第4块区块触发转移区块条件,将该第4块区块记为transition块。随机选取到区块链c,区块链c添加至第2块区块,当区块链a的transition块连接到区块链c时,这个区块对于区块链c来说也是transition块。这时,对于区块链c来说也要选取合适的区块链把区块迁移,通过随机选取,选取到区块链d。查询区块链d,区块链d连接至第5块区块,区块链d未添加至触发转移区块条件的区块,区块链a的transition块可以通过区块链c连接在区块链d上,从而将区块链d作为select链,得到的途径区块链集合s={c}。

此时,在区块链d中添加完整的transition块,在区块链a和区块链c中均添加区块头。

其中,用区块链d添加的transition块的区块头中的prevblockhash字段记录transition块在区块链d的前块哈希,在区块链d添加的transition块中额外添加connectblockhash字段,用connectblockhash字段记录transition块原来在区块链a的前块哈希。

区块链a添加的区块头的nextblockhash字段用于记录区块链c添加的区块头在区块链c的前块哈希,区块链a添加的区块头的translocation字段用于记录区块链c添加的区块头的位置信息<chainid1,height1>,chainid1为区块链c的id,height1为区块链c添加的区块头在区块链c上的位置。

区块链c添加的区块头的nextblockhash字段用于记录区块链d添加的transition块在区块链d的前块哈希,区块链c添加的区块头的translocation字段用于记录区块链d添加的transition块的位置信息<chainid,height>,chainid为区块链d的id,height为区块链d添加的transition块在区块链d上的位置。

实施例三

本实施例三与上述实施例二的不同之处在于:

如图5所示,区块链a添加至第8块区块,该第8块区块触发转移区块条件,将该第8块区块记为transition块。随机选取到区块链e,区块链e添加至第2m块区块,继续选取区块链。当随机选取所有的区块链后(顺序为e->f->d->b->i->g->c->j->h),发现所有的区块链都刚好连接至第2m块区块,区块链a的transition块可以通过途径的8条区块链连接在最后选取的区块链h上,从而将区块链h作为select链,得到途径区块链集合s={e,f,d,b,i,g,c,j}。

此时,在区块链h中添加完整的transition块,在区块链a和区块链e、f、d、b、i、g、c、j中均添加区块头。

其中,用区块链h添加的transition块的区块头中的prevblockhash字段记录transition块在区块链h的前块哈希,在区块链h添加的transition块中额外添加connectblockhash字段,用connectblockhash字段记录transition块原来在区块链a的前块哈希。

区块链a添加的区块头的nextblockhash字段用于记录区块链e添加的区块头在区块链e的前块哈希,区块链a添加的区块头的translocation字段用于记录区块链e添加的区块头的位置信息<chainid1,height1>,chainid1为区块链e的id,height1为区块链e添加的区块头在区块链e上的位置。

区块链e添加的区块头的nextblockhash字段用于记录区块链f添加的区块头在区块链f的前块哈希,区块链e添加的区块头的translocation字段用于记录区块链f添加的区块头的位置信息<chainid2,height2>,chainid2为区块链f的id,height2为区块链f添加的区块头在区块链f上的位置。区块链f添加的区块头记录区块链d中添加的区块头的位置信息,区块链d添加的区块头记录区块链b中添加的区块头的位置信息,以此类推,区块链c添加的区块头记录区块链j中添加的区块头的位置信息。

区块链j添加的区块头的nextblockhash字段用于记录区块链h添加的transition块在区块链h的前块哈希,区块链j添加的区块头的translocation字段用于记录区块链h添加的transition块的位置信息<chainid,height>,chainid为区块链h的id,height为区块链h添加的transition块在区块链h上的位置。

显然,上述实施例仅仅是本发明的一部分实施例,而不是全部的实施例。上述实施例仅用于解释本发明,并不构成对本发明保护范围的限定。基于上述实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,也即凡在本申请的精神和原理之内所作的所有修改、等同替换和改进等,均落在本发明要求的保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1