一句话先说清
默克尔山脉(Merkle Mountain Range,简称 MMR)是标准默克尔树的一种“只进不改”变体:数据项只能从最右边追加,永远不允许修改或中间插入。它的外形不是一棵对称大树,而是一排高度递减的二叉“山峰”——每当两个同等高度的峰并拢,就长出一座更高的新峰。因为结构只增不换,追加一个元素的成本只是一条从山脚到峰顶的短路径,特别适合区块链这种不断生长、还希望随时能剪枝的历史数据。

为什么普通默克尔树在这里吃力
标准默克尔树要求叶子数量凑成二的幂,稀疏处要补占位哈希;对“不断追加”的场景,每次叶数变化都可能牵动一大片结构。而区块链的输出集、区块头列表天然是流水账:只加、不改、不删。MMR 顺着这个天性设计:第 n 个元素落位时,若它左侧正好有一个同高兄弟,就向上合并,像二进制加法进位一样。往 MMR 里塞 100 万个叶子,多数追加只需重算几个节点——因为“进位”在二进制里平均只传导一位。
峰顶、装袋与存在性证明
MMR 通常没有唯一树根:它有若干个峰(数量等于元素总数的二进制表示里一的个数)。想和一个“根”比对,就把各峰顶从右往左依次哈希、并把总元素数当作前缀串进去——社区形象地称之为 bagging the peaks(“把峰装进袋”)。要证明某个元素在某个历史状态里,证明由三部分组成:该元素到所属峰顶的兄弟路径、全部峰顶列表、以及装袋方式。验证者重算峰顶、装袋、和区块头里承诺的那个值对比,就得到“它在这座山里、这座山还是那座山”的完整结论。Grin 文档还展示了用途之一:给未花费 coinbase 输出配一份 MMR 证明加区块哈希,节点无需下载整块就能校验成熟期规则。
可剪枝是隐藏福利
MMR 的叶子按插入顺序排号,位置一经分配永不改变。当某些数据(比如已被花掉的输出承诺)不再需要保留原值,可以从树里“挖掉”对应叶子并沿无兄弟路径向上剪枝——已删除叶子的位置索引、峰顶的装袋规则都不受影响,历史证明仍然可以重放。Grin 把输出、核、范围证明分别放进各自的 MMR,配合 Mimblewimble 的 cut-through 让节点可以只留必要哈希,大幅压缩存储。
一条直觉线
把标准默克尔树想成一座必须永远方方正正的建筑:多搬一块砖就可能重砌半面墙。MMR 是沿着海岸线堆石头:新石头永远放在最右边,凑够两颗就叠一层,堆出来的轮廓像起伏的山脊。要检查某块石头在不在某天的山脊上,只需要沿它所在那座小山的兄弟石一路到峰顶,再和当天登记册里记下的“峰顶合影”对一遍——登记册就是区块头里那个承诺值。
快速问答
问:MMR 能像哈希链表那样当“存在证明”吗?能,而且比链式承诺更省:证明体积是对数级,哈希链是线性。 问:峰顶数量为什么等于元素数的二进制一的个数?每个峰对应一个二的幂长度区间,不重叠地平铺到总长度——这正是二进制拆分。 问:MMR 的“位置”能当索引吗?可以,位置稳定是它优于可重排树的核心卖点,但也意味着删除操作只删数据不删编号。
常见误区
一是把 MMR 当成“更省哈希的树”:省的是更新路径和运维心智,证明体积与标准树同为对数级,不存在数量级差异。二是把“可剪枝”读成“可篡改”:剪掉的只是不再参与花费验证的叶子,任何对保留叶子的改动都会立刻让装袋值对不上。三是误以为它只属于隐私币:比特币的 UTREEXO 学术方案、以太坊多起无状态提案里都有类似只追加累加器的身影,MMR 是通用数据结构,不是某条链的专利。
风险提示:本文为密码学数据结构科普,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。