Merkle树生成器与可视化工具
指导
Merkle树生成器与可视化工具
粘贴一组值,选择一个哈希函数,立即看到一个可视化的默克尔树,包含每个中间节点的哈希值和最终的默克尔根。选择SHA-256、SHA-1或Keccak-256(以太坊使用的哈希函数),调整比特币风格的奇数叶子规则或OpenZeppelin的排序配对约定,并将完整的树导出为JSON格式。点击树图中的任意节点,即可将其哈希值复制到剪贴板。
如何使用
- 在文本区域中输入你的叶子,每行一个值。点击示例按钮以获取一个快速示例集。
- 选择一个哈希函数:通用场景使用SHA-256,旧系统使用SHA-1,以太坊兼容场景使用Keccak-256。
- 选择每一行如何被解释:作为UTF-8文本(默认)或作为已哈希的十六进制字符串。
- 选择一个符合目标协议的奇数叶子规则和配对拼接模式。
- 查看默克尔根,滚动SVG树图,并下载JSON导出文件以供下游工具使用。
特征
- 三种哈希函数 – SHA-256、SHA-1和Keccak-256覆盖了比特币、旧系统和以太坊的常见使用场景。
- 交互式SVG树图 – 每个节点均可点击复制;虚拟的重复兄弟节点以虚线边框绘制,以确保结构的真实性。
- 奇数叶子策略 – 在“重复最后一个”(比特币惯例)和“提升最后一个”(将未配对节点原样上移)之间切换,以匹配目标协议。
- 排序配对模式 – 在需要与流行的Solidity MerkleProof库兼容时,开启OpenZeppelin风格的排序拼接。
- 预哈希十六进制输入 – 通过直接粘贴十六进制摘要跳过叶子哈希,适用于底层叶子数据较大或已标准化的情况。
- JSON导出 – 下载包含每一层、每个节点哈希值和所选参数的完整快照,以确保可重现性。
常问问题
-
什么是默克尔树?
默克尔树是一种由加密哈希构成的二叉树。叶子是输入数据的哈希值,每个父节点是其两个子节点拼接后的哈希值。顶层的单个哈希值——默克尔根——可以指纹整个数据集:只要任意一个叶子发生变化,根哈希就会改变。默克尔树允许通过共享少量的兄弟哈希值(默克尔证明)来证明某个值属于某个集合,因此它被用于比特币区块头、以太坊状态、Git提交和证书透明度日志中。
-
比特币为何在节点数量为奇数时会重复最后一个哈希值?
为了保持构造的严格二叉性,比特币通过复制最右边的哈希值来填充奇数层级,使其可以与自身配对。这种做法简单易实现,但会引入一个已知的第二预像漏洞(CVE-2012-2459),即攻击者有时可以构造出不同的叶子列表,从而产生相同的根哈希。更现代的设计倾向于采用“提升”规则——将未配对的哈希值原样上移——或在内部哈希与叶子哈希之间添加域分离标签,以弥补这一缺陷。
-
Keccak-256 与 SHA-256 和 SHA3-256 有何不同?
Keccak-256 是赢得 NIST SHA-3 竞赛的原始海绵结构。在标准化之前,NIST 修改了填充规则,生成了 SHA3-256,其字节与标准化前的 Keccak-256 不兼容。以太坊在变更发生前就固定了原始的 Keccak-256,因此 Solidity 中的 'keccak256' 函数与 SHA3-256 并不相同。SHA-256 属于与之无关的 SHA-2 系列,采用的是默克尔-达姆加德构造,仅共享名称模式。
-
为何一些默克尔库在拼接前会排序配对?
在拼接前对左右哈希值进行排序,使得父节点哈希值不再依赖于哪个子节点是“左”或“右”。这意味着默克尔证明只需包含兄弟哈希值,而无需方向位,从而使得链上证明更小(约30%),且验证合约也更简单。OpenZeppelin 的 MerkleProof.sol 使用了这一约定;经典比特币和以太坊区块头不使用此方式。排序变体主要出现在空投允许列表、治理快照和其他离链承诺中。
