分形默克尔树的表示与遍历
1. 节点计算的尾部界限
在较大算法增量计算 TREEHASH 的情况下,会将一定数量的计算单元应用于特定步骤的迭代,并修改算法栈的状态。栈中的这些中间石子被认为构成了节点计算的尾部。对于高度为 $h_0$ 的节点 $n$,其空间尾部界限可表示为:
$Space Tail(n) ≤ h_0 + 1$
2. 子树表示与直觉
2.1 符号表示
从高度为 $H$ 的默克尔树 $T$ 开始,为处理子树引入了一些符号。首先选择子树高度 $h < H$,节点 $n$ 在树 $T$ 中的高度定义为从 $n$ 到叶子节点的路径长度(叶子节点高度为 0)。对于高度至少为 $h$ 的节点 $n$,以 $n$ 为根、高度为 $h$ 的唯一子树被定义为 $n$ 处的 $h$ - 子树。为简化,假设 $h$ 是 $H$ 的除数,令 $L = H/h$ 为子树的层数。当 $h$ - 子树的高度为 $ih$($i \in {1, 2, …, H}$)时,称其“处于第 $i$ 层”。每层 $i$ 有 $2^{H - ih}$ 个这样的 $h$ - 子树。
若一系列 $h$ - 子树 ${Tree_i}$($i = 1 … L$)满足对于所有 $i < L$,$Tree_i$ 的根是 $Tree_{i + 1}$ 的叶子节点,则称其为堆叠的 $h$ - 子树系列。
2.2 现有子树与期望子树
- 石子 :当存储与树 $T$ 中节点 $n$ 相关的值 $P(n)$ 时,称在该节点放置了一个石子。
- 静态视图 :在输出阶段的任何时刻,都会存在一系列堆叠的现有子树。对于每个 $i \in {1, …, L}$,都有 $L$ 个这样的子树 $Exist_i$,其每个节点(除根节点外)都有石子。设计上,对于 $Exist_1$ 中的任何叶子节点,其对应的认证路径完全包含在堆叠的现有子树集合中。
- 动态视图 :除了包含下一个所需认证路径的现有子树集合外,还有一组期望子树。若 $Exist_i$ 的根节点索引为 $a$(按高度为 $ih$ 的节点排序),则当 $a < 2^{H - i h} - 1$ 时,$Desire_i$ 被定义为索引为 $a + 1$ 的 $h$ - 子树。当 $a = 2^{H - i h} - 1$ 时,$Exist_i$ 是该层的最后一个子树,不存在对应的期望子树,特别地,第 $L$ 层永远没有期望子树。
为计算期望子树中的石子,对 TREEHASH 算法进行了修改,使其保存 $Desire_i$ 所需的石子,而不是丢弃它们,并提前一轮终止,不计算根节点。使用这种变体,每个正在计算的期望子树都有保存的中间石子尾部。
2.3 算法直觉
- 概述 :遍历的目标是顺序输出叶子节点的原像和认证路径。现有子树应始终包含下一个要输出的认证路径,而期望子树随着每一轮的进行包含越来越多完成的石子,直到现有子树过期。
- 现有子树的生命周期 :当 $Exist_i$ 最后一次用于输出时,称其“死亡”。此时,相邻的 $Desire_i$ 应已完成,即除根节点外的所有节点都已赋值。然后 $Exist_i$ 重生为 $Desire_i$,具体操作是先丢弃 $Exist_i$ 的所有旧石子,再获取 $Desire_i$ 的石子及其关联值。之后,将启动新的相邻子树 $Desire_i$ 的计算。
- 修改 TREEHASH 算法 :用于计算期望子树的工具是对经典 TREEHASH 算法的修改版本,应用于 $Desire_i$ 的根节点。该版本的不同之处在于:一是提前一轮停止算法(跳过根节点计算);二是将高度大于 $ih$ 的每个石子保存到 $Desire_i$ 树中。
- 计算分摊 :对于特定层 $i$,$Desire_i$ 树的计算成本为 $2 * 2^{ih} - 2$(省略根节点计算)。同时,$Exist_i$ 将服务 $2^{ih}$ 个输出轮次。通过每轮计算两次 TREEHASH 迭代,将 $Desire_i$ 的计算分摊到这个时间段内。实际上,$Desire_i$ 会提前一轮准备好。因此,每层分配 2 个计算单元可确保期望子树按时完成,每轮的总计算量为 $2(L - 1)$。
3. 解决方案与算法呈现
3.1 三个阶段
算法主要分为三个阶段:密钥生成阶段、输出阶段和验证阶段。
-
密钥生成阶段
:可由相对强大的计算机离线执行,计算并输出树的根节点,作为公钥。同时,需要对初始现有子树的石子进行计算和存储。
-
输出阶段
:由多个轮次组成。在第 $j$ 轮,输出第 $j$ 个叶子节点的原像及其认证路径。此外,会丢弃一些石子并计算一些新的石子,为未来输出做准备。
-
验证阶段
:与传统默克尔树的验证阶段相同,算法生成的输出与传统算法生成的输出无法区分,因此不再详细介绍验证阶段,主要关注密钥生成阶段和输出阶段。
3.2 密钥生成
首先,计算并存储最左侧堆叠现有子树集合的石子,每个关联石子有值、位置和高度。此外,为每个 $i < L$ 的层创建一个期望子树列表,每个列表初始化为空栈,用于修改后的 TREEHASH 算法。初始化计数器 $Desire_i.position$ 为 $2^{ih}$,指示下一个要计算的默克尔树叶子节点。
算法 2:密钥生成与设置
1.
初始子树
:对于每个 $i \in {1, 2, …, L}$:
- 计算第 $i$ 层现有子树中的所有(非根)石子。
- 在每个层 $i$(除 $i = L$ 外)创建新的空期望子树,叶子位置初始化为 $2^{ih}$。
2.
公钥
:计算并发布树的根节点。
3.3 输出与更新阶段
每一轮执行阶段包括以下部分:
-
生成输出
:在第 $j$ 轮,输出包括第 $j$ 个叶子节点的原像及其关联的认证路径。认证路径的石子将包含在现有子树中,此轮只需计算原像。
-
现有子树的死亡与重生
:当使用某个现有子树的石子的最后一个认证路径输出后,该子树不再有用,称其“死亡”。此时,对应的期望子树已完成,死亡的现有子树重生为这个完成的期望子树。每 $2^{ih}$ 轮需要一个新的第 $i$ 层子树,因此每 $2^{ih}$ 轮丢弃现有树中的石子。具体来说,在第 $j$ 轮($j = 1 \pmod{2^{ih}}$),丢弃旧树 $Exist_i$ 中的石子,完成的树 $Desire_i$ 成为新的 $Exist_i$,并创建一个新的空期望子树。
-
生长期望子树
:对每个尚未完成的期望子树进行少量生长。具体做法是将两个计算单元应用于新的或已开始的 TREEHASH 算法调用。
算法 3:分层默克尔树遍历
1. 设置 $leaf = 0$。
2. 输出叶子节点编号为 $leaf$ 的认证路径。
3.
下一个子树
:对于每个 $Exist_i$ 不再需要的 $i$(即 $i \in {1, 2, …, L} | leaf = 1 \pmod{2^{hi}}$):
- 移除 $Exist_i$ 中的石子。
- 将树 $Desire_i$ 重命名为树 $Exist_i$。
- 如果 $leaf + 2^{hi} < 2^H$,创建新的空树 $Desire_i$。
4.
生长子树
:对于每个 $i \in {1, 2, …, h}$:通过应用 2 个单元到修改后的 TREEHASH 算法来生长树 $Desire_i$(除非 $Desire_i$ 已完成)。
5. 增加 $leaf$ 并循环回到步骤 2(当 $leaf < 2^H$ 时)。
4. 时间与空间分析
4.1 时间分析
算法为每个期望子树分配 2 个计算单元,计算单元定义为调用 $LEAF - CALC$ 或计算哈希值。由于最多有 $L - 1$ 个期望子树,每轮的总计算成本为:
$T_{max} = 2(L - 1) < 2H/h$
4.2 空间分析
算法所需的总空间,或等效地,所需的可用石子数量,可通过计算以下三部分的贡献来界定:
- 现有子树:有 $L$ 个现有子树,每个子树最多包含 $2^{h + 1} - 2$ 个石子(不存储根节点)。
- 期望子树:最多有 $L - 1$ 个期望子树,每个子树最多包含 $2^{h + 1} - 2$ 个石子(不存储根节点)。
- 尾部:第 $i > 1$ 层的期望子树关联的尾部最多包含 $h * i + 1$ 个石子。如果只计算尾部中不属于期望子树的石子,则“适当”尾部最多包含 $h(i - 1) + 1$ 个石子。
将这些贡献相加,得到空间上限:
$Space_{max} ≤ (2L - 1)(2^{h + 1} - 2) + L - 2 + h(L - 2)(L - 1)/2$
一个稍差但更简单的界限为:
$Space_{max} < 2L2^{h + 1} + HL / 2$
4.3 权衡
该解决方案在时间和空间之间存在权衡。一般来说,子树越大,算法运行越快,但空间需求也越大。影响这种权衡的参数是 $h$,从 $h$ 的角度来看,计算成本低于 $2H/h$,空间需求上限为 $2L2^{h + 1} + HL/2$,或者表示为 $2H2^{h + 1}/h + H^2/2h$。
4.4 低空间解决方案
如果对空间需求较小的参数感兴趣,存在一个最优的 $h$ 值。由于对于非常小的 $h$,尾部石子的数量会显著增加(当 $H^2/2h$ 变大时),其近似值为 $h = logH$。可以通过对空间表达式 $2H2^{h + 1}/h + H^2/2h$ 求导来找到精确值。当 $h = logH = loglogN$ 时,有:
$T_{max} = 2logN / loglogN$
$Space_{max} ≤ 5/2log^2N / loglogN$
这些结果在空间和时间上都改进了默克尔的结果(对于足够大的 $N$)。
5. 额外节省
通过两个观察对算法进行了修改,虽然不影响空间或时间成本的复杂度类,但在某些情况下几乎将空间界限减半:
1. 丢弃现有子树中不再需要的石子。
2. 省略对修改后的 TREEHASH 算法的第一次 2 个单元的应用。
通过这些小改动,对于所有 $i < L$ 的层,$Exist_i$ 和 $Desire_i$ 中包含的石子数量可以由以下表达式界定:
$Space_{Exist}(i) + Space_{Desire}(i) ≤ 2^{ih + 1} - 2 + (h - 2)$
这几乎是之前界限 $2 * (2^{ih + 1} - 2)$ 的一半。使用这个估计,修改了之前计算的空间界限:
$Space_{max} <= (L)(2^{h + 1} - 2) + (L - 1)(h - 2) + L - 2 + h(L - 2)(L - 1)/2$
一个更简单的界限为:
$Space_{max} < L2^{h + 1}H L / 2$
当 $h = loglogN$ 时,将上述结果改进为:
$Space_{max} ≤ 3/2log^2N / loglogN$
5.1 流程图
graph TD;
A[开始] --> B[密钥生成];
B --> C[输出阶段];
C --> D[验证阶段];
D --> E[结束];
C --> C1[生成输出];
C --> C2[现有子树死亡与重生];
C --> C3[生长期望子树];
C1 --> C4[输出叶子原像和认证路径];
C2 --> C5[丢弃旧石子];
C2 --> C6[新老交替子树];
C2 --> C7[创建新期望子树];
C3 --> C8[应用计算单元];
5.2 表格总结
| 阶段 | 操作 | 具体内容 |
|---|---|---|
| 密钥生成 | 初始子树 | 计算现有子树非根石子,创建期望子树并初始化位置 |
| 密钥生成 | 公钥 | 计算并发布树的根节点 |
| 输出阶段 | 生成输出 | 输出叶子原像和认证路径 |
| 输出阶段 | 现有子树死亡与重生 | 丢弃旧石子,新老交替子树,创建新期望子树 |
| 输出阶段 | 生长期望子树 | 应用计算单元到修改后的 TREEHASH 算法 |
| 验证阶段 | - | 与传统默克尔树验证相同 |
5.3 列表总结
- 算法核心在于选择计算和保留哪些节点值,通过子树表示和管理实现。
- 现有子树和期望子树的交替更新确保了认证路径的连续输出。
- 时间和空间分析表明存在权衡,可通过选择合适的 $h$ 值优化。
- 额外的修改进一步减少了空间需求。
6. 未来展望
当前的算法在默克尔树的遍历和表示上取得了显著的成果,但仍有进一步优化和拓展的空间。
6.1 特殊用途函数的开发
目前,默克尔树使用特定的输入大小,内部节点使用二对一的单向函数,计算叶子节点值使用一对一的函数。如果为这些目的开发专用函数,可能会提高算法的效率。特别是可以避免标准哈希函数对短输入进行初始填充带来的开销。
6.2 基于特定原语的安全性证明
若这些专用函数能从特定原语(如 AES)推导得出,就有可能基于原语的假设难度来证明基于默克尔树方案的安全性。这将为算法在安全敏感领域的应用提供更坚实的理论基础。
7. 总结
7.1 算法要点回顾
- 子树管理 :通过引入现有子树和期望子树的概念,实现了节点值的有效计算和存储,确保了认证路径的连续输出。
- 算法修改 :对 TREEHASH 算法进行修改,提前一轮停止计算并保存所需石子,提高了计算效率。
- 计算分摊 :将期望子树的计算成本分摊到多个输出轮次,确保了计算资源的合理利用。
- 时间空间权衡 :通过调整子树高度 $h$,可以在时间和空间需求之间进行权衡,以满足不同应用场景的需求。
- 额外节省 :通过丢弃无用石子和省略部分计算,进一步减少了空间需求。
7.2 性能对比
与传统的默克尔树遍历算法相比,本算法在时间和空间性能上都有显著提升。特别是在选择合适的 $h$ 值(如 $h = loglogN$)时,能在保证计算效率的同时,大幅减少空间占用。
7.3 流程图总结
graph LR;
A[子树高度 h 选择] --> B{时间需求};
A --> C{空间需求};
B --> D[计算成本 < 2H/h];
C --> E[空间上限 2L2^{h + 1} + HL / 2];
F[现有子树 Exist_i] --> G[输出认证路径];
F --> H[死亡与重生];
I[期望子树 Desire_i] --> J[计算石子];
J --> H;
H --> F;
7.4 表格对比
| 算法特性 | 传统算法 | 本算法 |
|---|---|---|
| 时间复杂度 | $T_{max} = 2logN$ | $T_{max} = 2logN / loglogN$ |
| 空间复杂度 | $Space_{max} = 0mod(1/2 log^2 N)$ | $Space_{max} ≤ 3/2log^2N / loglogN$ |
| 子树管理 | 无明确子树管理 | 现有子树和期望子树交替更新 |
| 计算分摊 | 无计算分摊机制 | 期望子树计算成本分摊到多轮 |
| 空间优化 | 无额外空间优化 | 丢弃无用石子和省略部分计算 |
7.5 列表展望
- 未来可继续探索更优的子树高度 $h$ 的选择方法,以进一步平衡时间和空间需求。
- 开发针对默克尔树的专用哈希函数,提高计算效率和安全性。
- 研究算法在分布式系统和大规模数据存储中的应用,拓展其适用范围。
综上所述,本算法在默克尔树的表示和遍历方面提供了一种高效且节省空间的解决方案,通过合理的子树管理和计算分摊,实现了时间和空间的有效权衡。未来的研究可以围绕专用函数开发和安全性证明等方向展开,进一步提升算法的性能和应用价值。
分形默克尔树的表示、遍历与性能分析
超级会员免费看
501

被折叠的 条评论
为什么被折叠?



