【背景介绍】
前文《打破K/V存储的性能瓶颈》中,我们提到用一个哈希值来反映区块链系统中所有对象的当前状态集合,并称之为“世界状态”。现在大多数区块链底层平台为了支持与其他链集成,或者为了部署在更小的终端,都会提供轻节点的功能,轻节点也就是存储少量数据的“轻量级节点”,但因为没有存储全量数据,无法对其他节点的数据进行正确性的验证。这里便需要其他节点生成一份数据证明,配合轻节点本地保存的“世界状态”来进行数据的验证。
这份数据证明是什么?又是怎么实现的?带着这份疑问,本文将详细介绍目前主流的数据证明的实现以及解决方案和优化思路。
【默克尔证明】
介绍数据证明前,我们先要了解传统的默克尔树,以及对应的证明生成和验证的流程。
默克尔树(Merkle Tree),因发明人叫Merkle,并且是树形结构而得名。如下图,默克尔树的叶节点存储数据或者数据的哈希值,任一父节点包含了其子节点总和的哈希值。
默克尔树最大的作用便是快速校验部分数据是否在原始数据中。
举个例子,要想验证L2在上图的这棵树上,只需要节点列表[L2,Hash0-0,Hash1]即可,通过L2可以计算出Hash0-1,通过Hash0-1与Hash0-0可以计算出Hash0,再通过Hash0与Hash1,便可以得到一个树根,再把该树根与Top Hash进行比对即可快速验证L2是否在树中。默克尔树生成数据证明以及验证数据证明的原理就是如此,生成证明时自底向上,不断获取父节点的兄弟节点,打包成数据证明;验证时通过遍历证明中的节点列表,不断进行哈希得到父节点的操作,最后可以得到树根节点,再把该树根与原树根进行比对,达到验证的目的。
这种基本的默克尔树广泛应用在区块链系统中,例如比特币中轻钱包的SPV(简单支付验证)便是应用该原理,比特币中区块记录的root便是区块中交易集合构成的默克尔树的树根,使得无需下载完整区块,只需要区