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

I'm trying to implement a merkle tree consistency proof, but I'm stuck at understanding the algorithm

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

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.

的递归调用中的先前减法

如果 mn 不相等,我们不会落入 m = n && b = false

k 现在再次被计算为 2,因为上限正在将结果 1/2log2(n)/2 修正为 1

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

但是,我似乎无法弄清楚我做错了什么。我觉得 k 计算中的上限是问题所在。它基本上不可能跳出循环,因为 k 在一些迭代后似乎总是高于 m

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

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

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

书中好像有错误。 m = nb = true的情况需要分开处理。在 RFC 6962.

中可以找到更详细的算法描述

修复方法如下: