algorithm - 我正在尝试实现一个 merkle 树一致性证明,但我坚持理解算法

标签 algorithm recursion hashtree merkle-tree

我正在尝试用这篇论文实现默克尔树一致性算法:

https://books.google.de/books?id=CokSDQAAQBAJ&lpg=PA147&dq=merkle%20consistency%20proof&hl=de&pg=PA148#v=onepage&q&f=false

但是,我有点卡在一致性检查上,因为当我执行 ConsProofSub 部分时,我总是陷入无限循环。

例子:

新树有8 , 老树有7叶子。

通过前面的函数,我获得了 m = 7 ,我的新树的叶子作为矢量 Etrue作为b .

函数通过递归代码流,直到我们到达这种情况:

E 现在有 2元素,所以 n = 2 .

m = 1 ,由于递归调用中先前的减法 m < k ,以及 b = false .

我们不属于 m = n && b = false如果,作为 mn不相等。

k现在再次计算为 2 ,因为上限正在纠正结果 1/2来自 log2(n)/21 .

我们陷入了m <= k情况下,我们再次使用完全相同的参数递归调用该函数。现在我们处于无限循环中。

但是,我似乎无法弄清楚我做错了什么。我感觉像天花板在k计算是问题。它基本上不可能脱离循环,因为k似乎总是高于m经过一些迭代。

对我这里的错误有什么建议/提示吗?

编辑:有趣的是,当 n 为奇数时,算法似乎 可以完美运行。它似乎只对偶数失败。我刚刚用一棵 7 片叶子的新树对其进行了尝试,它的效果非常好,提供了证明一致性所需的正确节点。

但是,我仍然无法弄清楚必须进行哪些更改才能使其适用于偶数。

最佳答案

这本书似乎有错误。 m = nb = true 的情况需要分开处理。可以在 RFC 6962 中找到该算法的更详细描述。 .

修复方法如下:

enter image description here

关于algorithm - 我正在尝试实现一个 merkle 树一致性证明,但我坚持理解算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41674058/

相关文章:

c将指针传递给递归函数

python - 反向树构建(有奇数个 child )

algorithm - 给定大量街道名称,测试文本是否包含该组街道名称中的一个街道名称的最有效方法是什么?

algorithm - 用树和递归寻找时间复杂度

algorithm - NQueen真的在回溯吗?

javascript - 如何从数组形成嵌套的 JSON 对象?

c++ - BST前序遍历并将树内容写入临时数组

Haskell:takeWhile 在 Maybe 列表中

C++ unordered_map 使用自定义类类型作为键