我正在尝试使用这篇论文实现默克尔树一致性算法:
然而,我在一致性检查上卡住了,因为当我执行ConsProofSub部分时,总是陷入无限循环中。
例如:
新树有8
个叶子,旧树有7
个叶子。
通过之前的函数,我得到m = 7
,我的新树叶片作为向量E
,并且b = true
。
该函数通过递归代码流程,直到我们到达这种情况:
E
现在有2
个元素,因此n = 2
。
m = 1
,由于递归调用m<k
的先前减法以及b = false
。
如果m
和n
不相等,则不会陷入m = n && b = false
的情况。
k
现在被计算为2
,因为向上取整将结果从log2(n)/2
的1/2
修正为1
。
我们进入了m <= k
的情况,并且再次使用完全相同的参数递归调用函数。现在我们陷入了一个无限循环。
然而,我似乎无法找出我的错误所在。我觉得k
计算中的向上取整是问题所在。这基本上使得无法跳出循环,因为在一些迭代后,k
似乎总是比m
高。
对于我的错误有什么建议/提示吗?
编辑:有趣的是,当n是奇数时,该算法似乎完美地工作。它只似乎在偶数情况下失败。我刚刚尝试了一个新的有7个叶子的树,它像魔术一样运行,提供了证明一致性所需的正确节点。
然而,我仍然无法弄清楚必须进行哪些更改才能使其与偶数配合使用。
n = 9
⇒log(n/2) = log(4.5) ≈ 2.17
⇒⌈log(n/2)⌉ = 3
⇒2^⌈log(n/2)⌉ = 8
。⌈x⌉
是 上取整函数 的符号。 - Anton