zoukankan      html  css  js  c++  java
  • 区块链学习1:Merkle树(默克尔树)和Merkle根

    ☞ ░ 前往老猿Python博文目录

    一、简介

    默克尔树(Merkle tree,MT)又翻译为梅克尔树,是一种哈希二叉树,树的根就是Merkle根。
    关于Merkle树老猿推荐大家阅读《Merkle树》这篇文章。

    Merkle树和Merkle根在区块链中用于维护账本校验数据的完整性和不可篡改,并在变动时快速定位变化的交易数据。在区块链中常用的hash算法为SHA256,关于SHA算法请参考《深入理解SHA系列加密算法》。

    二、思考

    为什么说在比较两组相同数据量的数据时,将其构建Merkle树后,两个树的根相同就数据相同呢?

    理论上说,每个散列算法,包括安全算法,都会发生碰撞,好的算法是散列尽可能均匀,降低碰撞概率,如果这个概率非常非常小,就可以认为不同的数据散列的结果基本不同。区块链中构建Merkle树时采用的哈希方法是SHA256来,一个哈希位有0和1两个可能值。则每一个独立的哈希值通过位的可能值的数量对于SHA-256,有2的256次方种组合,这是一个庞大的数值。因此在数据一致性处理时就认为根相同的树其对应的数据相同。

    三、要点

    1. Merkle树构建过程,是从输入数据开始进行hash,hash的结果作为树的叶子节点,然后相邻两个节点值两两配对作为输入再hash散列得到上层节点,如此一直往上,如果某层的结点数为奇数时,则最后一个节点与自己配对进行散列;
    2. 任何叶子节点数据变动都会逐层传递,导致根数据发生变化,根结果的比对可以作为构建树的数据的比对;
    3. 反过来,根节点变化,可以根据逐层往下查找变动的节点,直到找到最终的叶子节点;
    4. SHA-256散列函数算法总体比较简单高效,可以保证处理过程的高效性。

    正是由于这些特点,Merkle树有多种用途:

    • 可以用于确保数据完整性的校验
    • 可以快速比较大量数据(将两组相同数据量的数据排序后,构建Merkle树,如果两个树的根相同,则两组数据是相同的)
    • 散列计算非常快速,可以带来完整性保障校验和数据比对计算性能的优势
    • 可以快速定位修改
    • 可以作为零知识证明 (zero-knowledge proof)使用来证明交易发生过但无需提供交易数据,具体请参考《Merkle树与SPV验证》、《Merkle树和SPV机制》)。

    因此Merkle树和Merkle根才被区块链用于保障交易的完整性和防篡改。

    更多关于区块链的内容请见老猿专栏《零基础学区块链》或《零基础学区块链专栏文章目录》。

    跟老猿学Python、学5G!

    ☞ ░ 前往老猿Python博文目录

  • 相关阅读:
    pyqt 设置QTabWidget标签页不可选
    C#分块读取文本数据(FileStream)
    C#IO读写文本txt文件中的数据
    C#IO读写文本txt文件中的数据
    Winform开发主界面菜单的动态树形列表展示
    Winform开发主界面菜单的动态树形列表展示
    C#LinqJoin两个DataTable
    C#LinqJoin两个DataTable
    c#转义字符
    c#转义字符
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643456.html
Copyright © 2011-2022 走看看