merkle树:每一笔交易都寄生在这棵逆生长的树上

merkle树:每一笔交易都寄生在这棵逆生长的树上_第1张图片

如今移动支付已经快速的融入到了我们的生活方式中,以支付宝为代表的第三方中心化支付交易,逐步取代着法币交易的支付场景。之所以支付宝可以获得广大用户的认可,是因为它能在保证在支付安全性的前提下,满足用户快速确认交易的需求。能够做到快速完成交易确认,是因为一切都以后台数据中心里的记录为准。安全性则来自于支付宝多年积累的信用背书。

但是在去中心化的货币支付体系里,卖家面对一个个节点是陌生而又充满不确定性,那么交易的安全性又该如何保证?

比特币网络去中心化的解决思路是,让更多的可信节点(矿工)参与到交易确认的过程中去,靠共识机制保证交易确认的安全性,同时让全网的节点都保存一份交易信息。但是这样的话,会带来一个新的问题,如果每个节点都保存完整的交易信息,需要交易确认时,需要调用的数据量太大,耗时太长,会大大降低使用的效率。

在如今互联快时代快节奏的生活方式下,效率同样非常重要。

安全性和效率,两手都得抓。那么鱼与熊掌又如何兼得呢?

我们需要找到一种方案,只需要验证小部分的信息(区块头,占用存储空间很小),就可以确认打包过的批量交易纪录(整个区块),这样可以极大地提高交易验证的效率。为了保证安全性,这种方案还要做到,打包过的交易记录需要和区块头信息一一对应。交易记录如果有任何微小变化,都会对待区块头信息产生改变,这样就可以有效防止交易信息被任意篡改。

不用下载全部区块,只需下载全部区块头,就能轻松验证所有支付。但这种方式是如何实现的呢?

merkle树,一种精妙的数据结构设计,就是这个完美方案。

merkle树是一种二叉树,由一个根节点,一组中间节点和一组叶节点组成。merkle树最早由Ralph Merkle在1980年提出,在区块链系统出现之前,曾广泛用于文件系统和P2P系统中。

merkle树:每一笔交易都寄生在这棵逆生长的树上_第2张图片
图1:简化版merkle树

如图1所示,这是一个简化到只有四个交易记录的merkle树,实际中每个区块大约包含2000多笔交易。矿工把区块内所有交易的哈希值一字排开,让相邻的两个交易哈希值牵手(相加),再算出新哈希(如图红框所示,交易A和交易B算出的哈希值N0和N1,然后再把N0和N1相加算出新的哈希值N4)。继续类似的操作直到只剩下顶部的一个节点,即merkle根,存入区块头。矿工验证、记录和整理交易的过程称为“打包”。往上叠加哈希值,直到顶点就完成了打包过程。

merkle树有两点特别神奇,首先它是逆生长的,先长叶子,然后是树枝,最后是树根;其次它的整个形状也像是一棵树倒过来的样子,叶子在最下面保存着所有交易记录,树根长在了最上面,存放在区块头里。2000多笔交易,需要2000多个叶子节点存放,所以真实的merkle树要茂盛很多。

我们在之前的哈希加密,不是保险柜,是榨汁机一文中介绍过:

哈希算法的处理使存储和查找信息的速度更快,因为哈希值通常更短所以更容易被找到。之所以把哈希值称为“数据指纹”,是因为它和原有的输入信息有一一对应的特性。找到具有相同哈希值的两个输入文件在计算上是计算不可行的,任何微小的变化,比如多个标点,都会对输出的哈希值产生改变。 哈希加密是一种不可逆的加密过程,具有单向性,即从哈希输出无法倒推输入的原始数值。


Merkle树逐层记录哈希值的特点,让底层数据的任何变动,都会传递到其上一层,层层沿着路径一直到根节点。这意味着merkle根的值实际上代表了对底层所有数据的“数字指纹”。仅仅一个哈希值,就蕴含该区块内所有交易验证信息。

区块头是80字节,而平均每个交易至少是250字节,按每个区块包含2000个交易计算,包含完整交易的区块比区块头的4千倍还要大。在比特币网络中,只有那些参与交易验证的矿工节点需要下载和储存完整的区块链的数据和交易信息,交易者钱包节点只需要下载区块头就可以了。

那么交易验证的过程是怎样的呢?我们以图1为例(参见黄色箭头代表的路径),发生了交易C,它的哈希值N2立即生成,参与验证矿工是那些少数保存有全部区块信息的节点,由于哈希值的一一对应的特性,他们可以很快定位到相应叶节点的位置,经过1次哈希运算得到N5,2次哈希运算得到根节点的哈希值。然后矿工计算出的根节点的哈希值发送至交易者的钱包,只需将该哈希值跟自己钱包里保存的区块头的Merkle根对比验证,如果一致,则证明该交易存在。即使有2048笔交易,最多也只需做11次哈希计算(2的11次方等于2048)。由于哈希运算可以在瞬间完成,所以整个交易验证的过程耗时很短,效率大大提高。

merkle树:每一笔交易都寄生在这棵逆生长的树上_第3张图片
图2:区块结构

如图2所示,在一个区块内部,哈希算法让每一笔交易都生长在了merkle树上,打包后的merkle树根保存在每一个区块头中;每一个打包过的区块之间也通过哈希算法按时间顺序依次连接(参见挖矿就是在破解一道难度不断调整的数学题)。因此,如果想要篡改某一项历史纪录,要按时间顺序依次破解所有的哈希函数,这在现有的计算力条件下是彻底无解的。

 END 

公司、项目合作  ◇  微信:chainwired 

转载、约访  ◇  微信:chainwied

投稿◇  [email protected]

merkle树:每一笔交易都寄生在这棵逆生长的树上_第4张图片

你可能感兴趣的:(merkle树:每一笔交易都寄生在这棵逆生长的树上)