我正在尝试实现一个 merkle 树一致性证明,但我坚持理解算法
I'm trying to implement a merkle tree consistency proof, but I'm stuck at understanding the algorithm
我正在尝试用这篇论文实现默克尔树一致性算法:
但是,我有点卡在一致性检查上,因为当我执行 ConsProofSub 部分时,我总是陷入无限循环。
示例:
新树有 8
,旧树有 7
片叶子。
通过前面的函数,我获得了 m = 7
,我的新树的叶子作为矢量 E
和 true
作为 b
。
函数通过递归代码流,直到我们到达这种情况:
E 现在有 2
个元素,所以 n = 2
.
m = 1
,由于 m < k
以及 b = false
.
的递归调用中的先前减法
如果 m
和 n
不相等,我们不会落入 m = n && b = false
。
k
现在再次被计算为 2
,因为上限正在将结果 1/2
从 log2(n)/2
修正为 1
。
我们陷入了 m <= k
的情况,我们再次使用完全相同的参数递归调用函数。现在我们处于无限循环中。
但是,我似乎无法弄清楚我做错了什么。我觉得 k
计算中的上限是问题所在。它基本上不可能跳出循环,因为 k
在一些迭代后似乎总是高于 m
。
对我这里的错误有什么建议/提示吗?
编辑:有趣的是,当 n 为奇数时,算法 似乎 可以完美运行。它似乎只对偶数失败。我刚刚用一棵 7 片叶子的新树尝试了它,它就像一个魅力,提供了证明一致性所需的正确节点。
但是,我仍然无法弄清楚必须进行哪些更改才能使其适用于偶数。
书中好像有错误。 m = n
和b = true
的情况需要分开处理。在 RFC 6962.
中可以找到更详细的算法描述
修复方法如下:
我正在尝试用这篇论文实现默克尔树一致性算法:
但是,我有点卡在一致性检查上,因为当我执行 ConsProofSub 部分时,我总是陷入无限循环。
示例:
新树有 8
,旧树有 7
片叶子。
通过前面的函数,我获得了 m = 7
,我的新树的叶子作为矢量 E
和 true
作为 b
。
函数通过递归代码流,直到我们到达这种情况:
E 现在有 2
个元素,所以 n = 2
.
m = 1
,由于 m < k
以及 b = false
.
如果 m
和 n
不相等,我们不会落入 m = n && b = false
。
k
现在再次被计算为 2
,因为上限正在将结果 1/2
从 log2(n)/2
修正为 1
。
我们陷入了 m <= k
的情况,我们再次使用完全相同的参数递归调用函数。现在我们处于无限循环中。
但是,我似乎无法弄清楚我做错了什么。我觉得 k
计算中的上限是问题所在。它基本上不可能跳出循环,因为 k
在一些迭代后似乎总是高于 m
。
对我这里的错误有什么建议/提示吗?
编辑:有趣的是,当 n 为奇数时,算法 似乎 可以完美运行。它似乎只对偶数失败。我刚刚用一棵 7 片叶子的新树尝试了它,它就像一个魅力,提供了证明一致性所需的正确节点。
但是,我仍然无法弄清楚必须进行哪些更改才能使其适用于偶数。
书中好像有错误。 m = n
和b = true
的情况需要分开处理。在 RFC 6962.
修复方法如下: