zoukankan      html  css  js  c++  java
  • 比特币中MerkleTree默克尔树的构造

    有点比特币基础的应该都知道,在一个区块的区块头中有一个字段叫RootHash,这个根哈希是该区块中所有交易构建默克尔树之后计算的树根哈希。但是基本上所有的文章都只说到如果交易数不是偶数个的时候需要补齐,但是具体怎么补齐呢?下面简单说明一下,以解这个细节上的疑惑。

    一、3个交易时

    如果只有3个交易Tx1,Tx2,Tx3,那么在构造默克尔树的时候,只需要把最后的那个Tx3和自己再算相加,计算Hash33即可。如图:

    Tx3

    二、5个交易时

    如果是有4个交易,那最简单,没什么好说的,接下来说如果有5个交易的情形,那么这里就需要做多次自己和自己相加,然后计算上一级哈希的情况,具体计算如图:

    Tx5

    三、6个交易时

    那么如果有6个交易的时候,是把Tx6复制多次进行填充吗?不是的!!!而是在计算的过程中遇到单个Hash的时候进行重复,也就是对H56就行重复,所以实际上是把Tx5和Tx6进行了填充,如图:

    UntitledImage

    总之在计算默克尔树的根哈希时,都是简单的从下到上层层推进,每一层在算的时候如果下面的哈希是奇数,就复制一个哈希,在5个交易时,计算H55就是复制了一份H5,然后上一层计算H5555的时候下面又是奇数,所以复制了一份H55。同理在计算6个交易的默克尔树时,算H5656时,因为下面只有一个H56,所以复制了一份H56。对于更大量的交易数的时候,处理逻辑都是这样的。

  • 相关阅读:
    day5 -常用模块
    day4装饰器-迭代器&&生成器
    h5 canvas 图片上传操作
    Tomcat上传文件报错:returned a response status of 403 Forbidden
    $.each遍历json对象
    Java求字符串中出现次数最多的字符
    线程池原理
    谈谈你对Hibernate的理解
    为什么要用 ORM? 和 JDBC 有何不一样?
    多线程有几种实现方法?同步有几种实现方法?(被问到)
  • 原文地址:https://www.cnblogs.com/studyzy/p/14041740.html
Copyright © 2011-2022 走看看