美文网首页
merkle树,让交易确认过程变得简单

merkle树,让交易确认过程变得简单

作者: Rafael10 | 来源:发表于2018-07-13 15:51 被阅读0次

    如今我们出门大部分时间都不用带现金了,带着手机,用支付宝基本可以搞定一切支付场景。通过扫码,卖家会收到后台的提醒,一瞬间就可以确定你的钱到账了。中心化的验证机制可以做到快速完成交易确认,是因为一切都以后台数据中心里的记录为准。中心化支付体系是建立在一个我们默认的前提下,那就是中心值得信赖,我们相信支付宝的公正可信。但是在去中心化的货币支付体系里,卖家面对的一个个节点是陌生而又充满不确定性的,他如何确认你的转账呢?交易得安全性如何保证?

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

    安全性和效率,两手都要抓,两手都要硬。如何做到呢?

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

    不用下载全部区块,只需下载全部区块头,就能轻松验证所有支付。真的么?

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

    图1:简化版merkle树

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

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

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

    我们在之前的《哈希加密,不是保险柜,是榨汁机》(放文章链接)一文中介绍过:

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

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

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

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

    图2:区块结构

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

    相关文章

      网友评论

          本文标题:merkle树,让交易确认过程变得简单

          本文链接:https://www.haomeiwen.com/subject/vnalpftx.html