【问题标题】:What is the width of a Merkle treeMerkle树的宽度是多少
【发布时间】:2018-09-19 12:30:05
【问题描述】:

我正在尝试将超级账本结构应用到我的项目中,因此正在研究它。

我正面临 json 数据中的配置块,但在这部分感到很困惑。

"BlockDataHashingStructure": {
  "mod_policy": "Admins",
  "value": {
    "width": 4294967295
  },
  "version": "0"
},

官方文档说,“这个值指定了那个默克尔树的宽度” 但我不知道默克尔树的宽度是多少。 有没有人可以简单地解释一下默克尔树宽度的含义?

谢谢。

【问题讨论】:

    标签: hyperledger-fabric


    【解决方案1】:

    我会尝试回答,但我不是默克尔树的专家(所以如果专家审查我的答案会很好!!)。树的宽度是您连接在一起作为下一个树级别哈希的输入的字节数或字节数组。

    通常我们看到二叉树 => 树的每个节点都有 2 个子节点。所以宽度为 2(或 16 为 2 个字节,我不知道)。

    但是看看使用 merkle 树的 MD6 算法。树不是“二元”的,每个节点有 4 个子节点:

    值 4294967295 是 uint32 的最大值。所以树将具有最大宽度大小。这将导致一棵只有 2 个级别的树:级别 0“包含”块的所有字节,级别 1“包含”级别 0 的连接字节的哈希。

    fabric 似乎还不支持“真正的”默克尔树(超过 2 个级别)

    树的构造似乎是通过使用函数 Bytes 进行的(参见https://github.com/hyperledger/fabric/blob/13447bf5ead693f07285ce63a1903c5d0d25f096/protos/common/block.go

    // Bytes returns a deterministically serialized version of the BlockData
    // eventually, this should be replaced with a true Merkle tree construction,
    // but for the moment, we assume a Merkle tree of infinite width (uint32_max)
    // which degrades to a flat hash
    func (b *BlockData) Bytes() []byte {
    return util.ConcatenateBytes(b.Data...)
    }
    

    我不知道多级默克尔树在超级账本结构中是否有用。我对使用默克尔树的理解是简化区块内交易存在的验证。但在超级账本中,您不需要简化这一点,因为节点在区块链旁边维护一个状态数据库(levelDB 或 couchDB)。 但我可能是错的。

    【讨论】:

    • 但我仍然在措辞,因为我不习惯 cs 概念.. 你的意思是 4,294,967,295 是 uint32 的最大值,因为它被转换成标准的十六进制?例如,在上图中,lv.0 的叶节点将有一个 uint32 值,那么它的位数将是 32。那么 lv.1 的中间节点将具有 128 位(32 x 4)的宽度,那么呢?我明白你的解释了吗?
    • “树的宽度是你连接在一起的字节数或字节数组作为下一个树级别哈希的输入”,你的意思是树的宽度是字节的总和所有叶节点数据(即块)来计算根哈希?
    猜你喜欢
    • 2021-10-11
    • 2015-05-25
    • 2018-11-09
    • 1970-01-01
    • 2018-08-07
    • 2018-05-19
    • 1970-01-01
    • 2012-10-25
    • 2014-02-20
    相关资源
    最近更新 更多