区块链应用 基于merkle树的共享数据粒度调整方案

区块链应用 基于merkle树的共享数据粒度调整方案

数据共享是区块链应用一大落地场景,但区块链节点对等、完全互为冗余、节点间互不信任的特点也成为与大数据量、数据精准控制的一个矛盾。

区块链共享数据场景及粒度问题

数据共享是区块链落地应用的一大场景,比如个人信息授权查询,司法存证等,其本质都是:预先将数据传到链上,在必要的时候再将其展示给特定的查询方。通常出于对区块链性能和数据保护的考虑,预先传到链上的并非数据本身,而是数据的hash值,查询方查看数据的时候首先要做的就是确保看到的数据与最初上传到区块链hash对应的。以区块链司法存证举个例子:甲和乙两人签了一份合同C,为进一步确保安全于是将合同拍照(文件contract1.jpg)上传到司法存证系统留存, 简要流程如下:
区块链应用 基于merkle树的共享数据粒度调整方案
可以看到blockchain保存的数据只有hash、时间等信息,而数据主体(图像等)存放到了其他database中。法院查询方通过对contract1.jpg重新求hash再与hash1对比判断contract1.jpg是否为原上传的文件,如果相等则可认定该图像是未经修改的。

尽管区块链上存的只是hash等信息,单算一条hash为64字节,1亿份存证材料对应的hash存储量就是6,400,000,000字节,约6GB,这些都存储在各区块链节点的内存中,随着业务量增长就是个不小的负担。这个问题的原因在于上链数据粒度过细导致底层链负担过大,如果能将链上数据的粒度加粗(比如一个自然人只维护一份数据,不论有多少存证材料)则可以确保区块链的内存负担在一个可控的范围。本文讨论一种基于Merkle树的解决思路,可将区块链上的内存消耗限制在一个可控的范围内,仅供参考。

什么是Merkle树

Merkle树,通常也被称作Hash树,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。
区块链应用 基于merkle树的共享数据粒度调整方案
简单来说Merkle树即通过对一组数据各自的hash两两组和再进行hash直到得到一个唯一的root。由于hash的确定性(若hash(A)不等于hash(B),则A不等于B)以及碰撞概率小的特点,可以实现局部验证:给定一个根值为R的merkle树treeR和一个数据dataT,若能找到一组hash使得hash(dataT)能与它们共同组建出一棵树根值也等于R的merkle树,则dataT属于treeR的一个元素。以上图为例:给定dataT,若hash(hashAB+hash(hashC+hash(dataT)))等于root,则可以确定dataT=dataD。

基于merkle树的数据粒度调整

基于merkle树的上述特性,要解决底层链内存负担重的问题,可以使用如下思路:1.对每个自然人的所有存证材料求hash并生成merkle树根hashR,链上只存储树根hashR;2.有新材料加入存证则更新链上的hashR值,这样始终每个人只在链上占用一个hash值的空间(当然还有其他一些基本信息消耗);3.查询的时候由存证系统检索该自然人的所有数据生成必要的树节点组合及局部数据供查询方校验。假设甲有contract1.jpg,contract12.jpg,contract3.jpg,contract4.jpg四份存证材料,某次合同纠纷中法院需要调取其中contract4.jpg则流程如下:
区块链应用 基于merkle树的共享数据粒度调整方案

这样,可以将区块链的存储负担控制在人数相关的一个范围内,不会随着参与人上传更多的存证材料而增加负担。

除了通过加粗数据粒度来控制区块链节点的内存消耗,这种思路也可以运用在数据粒度细分控制上。比如个人数据共享的场景下,一个基于区块链的学生成绩存档授权查询平台,如果上传的时候以一份某学期完整成绩单为单条数据,则查询的时候要么不查要么就只能查一整个学期所有科目,这可能是没有必要的(比如应聘某文字工作的时候用人单位也许并不关心音乐成绩)。若是上传的时候对成绩单先做科目细分然后求merkle树根保存在平台区块链,则查询时可以灵活选择查询某个科目,而不用担心数据的验证问题。

(完)
欢迎交流

区块链应用 基于merkle树的共享数据粒度调整方案