Merkle root、state root 和 transactions root 是大量数据的哈希承诺,不是“根账户”,更不是 Android Root。验证 proof 不需要 Root 手机、钱包、私钥或链上交易。本篇只用四个虚构地址和整数,在本地运行 OpenZeppelin StandardMerkleTree,同时测试正确值和篡改反例。
你会完成什么#
- 看懂 leaf、sibling proof、internal node 和最终 root 的关系。
- 用明确 ABI 类型构建 OpenZeppelin standard Merkle tree。
- 为第三个测试 leaf 生成 proof,并在本地验证为 true。
- 把数量改掉后用同一 proof 验证为 false,证明承诺绑定数据。
- 区分 Merkle root、Ethereum stateRoot/transactionsRoot/receiptsRoot 和 Android Root。
先看结论#
| 字段/术语 | 承诺的数据 | proof 证明什么 |
|---|---|---|
| Merkle root | 一组按约定编码/哈希的 leaves | 某 leaf 按该约定包含在 root 中 |
Ethereum stateRoot | 执行后全局账户状态 trie | 某状态路径与区块头承诺一致 |
transactionsRoot | 区块交易 trie | 某交易条目属于该区块承诺 |
receiptsRoot | 执行收据 trie | 某 receipt 属于该区块承诺 |
| Android Root | Android 启动/内核/su 授权 | 与哈希树 proof 无关 |
心智模型#
L0(address1,10) ─┐
├─ H01 ─┐
L1(address2,20) ─┘ │
├─ Merkle root
L2(address3,30) ─┐ │
├─ H23 ─┘
L3(address4,40) ─┘
proof(L2) = 必需的 sibling hashes → 逐层 hash → 与 root 比较
工具清单#
| 工具/资料 | 角色 | 什么时候用 | 来源与注意 |
|---|---|---|---|
@openzeppelin/merkle-tree | 构造标准树、proof、可视化和本地验证 | 本篇离线测试数据 | Standard tree 对 ABI 编码 leaf 做双重 keccak256 并排序 |
OpenZeppelin MerkleProof | Solidity 端验证 proof | 合约已采用完全相同约定时 | 编码、leaf hashing、pair ordering 必须一致 |
| Ethereum MPT 文档 | 理解 state/transaction/receipt tries | 阅读区块头和状态证明 | 比简单二叉 Merkle tree 更复杂,不可混用 proof 格式 |
| Uniswap merkle-distributor | 历史合约设计样例 | 研究一次性 claim 模式 | 示例不是自动适配生产业务或当前安全要求 |
alloy-rs/trie | Rust 的 trie/root/proof 实现 | Rust/Ethereum 客户端工具 | 版本和 trie 规则必须与目标链一致 |
| Bitcoin block header | 对比交易 Merkle root 字段 | 跨链术语学习 | Bitcoin 与 Ethereum 的结构/编码不同 |
项目全景:区块链与 Root的 9 个项目,一个不漏#
9 个项目中的 root 主要是链根、Merkle root、状态根和证明根,另有一个借区块链思路做微服务 RCA 的跨界项目。主题可围绕“从叶子数据算出可验证根”。
| 技术路线 | 项目数 | 处理等级 | 在主题任务中的位置 |
|---|---|---|---|
| 链配置与 Root Chain | 2 | 候选路线 | 以网络元数据和 OmniFlix root chain 说明 chain ID、RPC、主权链连接与项目配置来源,不把未知 JSON 当钱包配置直接导入。 |
| Merkle 分发与白名单 | 3 | 候选路线 | 比较两个 distributor 与 NFT 白名单示例,从叶子编码、排序、证明生成到合约验签逐步验收。 |
| Trie、EVM 与状态根 | 2 | 候选路线 | 用 Merkle-Patricia Trie 与并行 EVM 说明交易执行如何产生确定状态根,并用相同输入重复计算核对。 |
| 区块头、SPV 与证明验证 | 1 | 候选路线 | 以 headers-only 节点和 Merkle proof 项目解释不下载全量状态时如何验证包含关系,并说明信任假设。 |
| 区块链启发的 RCA 与待复核 | 1 | 边界复核 | 单列 mABC 等把区块链思想用于多 Agent 根因分析的项目,并逐项说明它们不处理链上资产。 |
1. 链配置与 Root Chain · 2#
以网络元数据和 OmniFlix root chain 说明 chain ID、RPC、主权链连接与项目配置来源,不把未知 JSON 当钱包配置直接导入。
本组共 2 项:2 个源项目、0 个 Fork,其中 0 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。
| 项目 | 上游定位与识别信号 | 状态与采用前检查 |
|---|---|---|
| Nate0634034090/nate.283090 | 主题用途:将 Nate0634034090/nate.283090 纳入「链配置与 Root Chain」候选路线,根据 仓库名、README 与发布记录 核对功能、平台与版本适配。 上游自述(保留原文):({"name":"Ethereum Mainnet","chain":"ETH","icon":"ethereum","rpc":("https://mainnet.infura.io/v3/${INFURA_API_KEY}","wss://mainnet.infura.io/ws/v3/${INFURA_API_KEY}","https://api.mycryptoapi.com/eth","https://cloudflare-eth.com"),"faucets":(),"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"infoURL":"https://ethereum.org","shortName":"eth","chainId":1,"networkId":1,"slip44":60,"ens":{"registry":"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e"},"explorers":({"name":"etherscan","url":"h | 未归档源项目 · ★ 69 · LGPL-2.1 · 2022-04-05。活跃候选:先核对 README、最新 Release、目标版本与已知问题。 |
| OmniFlix/omniflixhub | 主题用途:将 OmniFlix/omniflixhub 纳入「链配置与 Root Chain」候选路线,根据 blockchain · dao · decentralization · Go 核对功能、平台与版本适配。 上游自述(保留原文):OmniFlix Hub is the root chain of the OmniFlix Network. Sovereign chains and DAOs build on top of or connect to the OmniFlix Hub to manage their web2 & web3 media operations to mint, manage, distribute & monetize NFTs enabled with community interactions. | 未归档源项目 · ★ 55 · MIT · 2026-01-23。活跃候选:先核对 README、最新 Release、目标版本与已知问题。 |
2. Merkle 分发与白名单 · 3#
比较两个 distributor 与 NFT 白名单示例,从叶子编码、排序、证明生成到合约验签逐步验收。
本组共 3 项:3 个源项目、0 个 Fork,其中 2 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。
| 项目 | 上游定位与识别信号 | 状态与采用前检查 |
|---|---|---|
| Uniswap/merkle-distributor | 主题用途:将 Uniswap/merkle-distributor 纳入「Merkle 分发与白名单」候选路线,根据 TypeScript 核对功能、平台与版本适配。 上游自述(保留原文):📦 A smart contract that distributes a balance of tokens according to a merkle root | 已归档源项目 · ★ 622 · GPL-3.0 · 2023-06-23。已归档:保留作历史、迁移或兼容性参考,不作为默认安装源。 |
| saber-hq/merkle-distributor | 主题用途:将 saber-hq/merkle-distributor 纳入「Merkle 分发与白名单」候选路线,根据 TypeScript 核对功能、平台与版本适配。 上游自述(保留原文):📦 A smart contract that distributes a balance of tokens according to a Merkle root | 未归档源项目 · ★ 193 · GPL-3.0 · 2023-03-07。活跃候选:先核对 README、最新 Release、目标版本与已知问题。 |
| miguelmota/merkletreejs-nft-whitelist | 主题用途:将 miguelmota/merkletreejs-nft-whitelist 纳入「Merkle 分发与白名单」候选路线,根据 blockchain · erc721 · ethereum · JavaScript 核对功能、平台与版本适配。 上游自述(保留原文):Solidity NFT whitelist contract example using MerkleTree.js for constructing merkle root and merkle proofs. | 已归档源项目 · ★ 71 · MIT · 2022-07-04。已归档:保留作历史、迁移或兼容性参考,不作为默认安装源。 |
3. Trie、EVM 与状态根 · 2#
用 Merkle-Patricia Trie 与并行 EVM 说明交易执行如何产生确定状态根,并用相同输入重复计算核对。
本组共 2 项:2 个源项目、0 个 Fork,其中 0 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。
| 项目 | 上游定位与识别信号 | 状态与采用前检查 |
|---|---|---|
| risechain/pevm | 主题用途:将 risechain/pevm 纳入「Trie、EVM 与状态根」候选路线,根据 Rust 核对功能、平台与版本适配。 上游自述(保留原文):The Ultimate Parallel EVM Engine: Transaction Execution, State Root Calculation, Shred Broadcasting. All in One and at Once! | 未归档源项目 · ★ 352 · MIT · 2026-06-09。边界命中:先读 README,确认它确实属于当前任务,再决定是否使用。 |
| alloy-rs/trie | 主题用途:将 alloy-rs/trie 纳入「Trie、EVM 与状态根」候选路线,根据 alloy · alloy-rs · blockchain · Rust 核对功能、平台与版本适配。 上游自述(保留原文):Fast Merkle-Patricia Trie (MPT) state root calculator and proof generator for prefix-sorted nibbles | 未归档源项目 · ★ 160 · Apache-2.0 · 2026-06-29。活跃候选:先核对 README、最新 Release、目标版本与已知问题。 |
4. 区块头、SPV 与证明验证 · 1#
以 headers-only 节点和 Merkle proof 项目解释不下载全量状态时如何验证包含关系,并说明信任假设。
本组共 1 项:1 个源项目、0 个 Fork,其中 0 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。
| 项目 | 上游定位与识别信号 | 状态与采用前检查 |
|---|---|---|
| bsv-blockchain/block-headers-service | 主题用途:将 bsv-blockchain/block-headers-service 纳入「区块头、SPV 与证明验证」候选路线,根据 bitcoin · bitcoinsv · bsv · Go 核对功能、平台与版本适配。 上游自述(保留原文):A headers only peer on the Bitcoin p2p network, with a private web API to allow Merkle root validation. | 未归档源项目 · ★ 34 · NOASSERTION · 2026-07-14。活跃候选:先核对 README、最新 Release、目标版本与已知问题。 |
5. 区块链启发的 RCA 与待复核 · 1#
单列 mABC 等把区块链思想用于多 Agent 根因分析的项目,并逐项说明它们不处理链上资产。
本组共 1 项:1 个源项目、0 个 Fork,其中 0 项已归档。它们的平台、用途或分类存在边界,只作逐项核验,不当作默认安装候选。
| 项目 | 上游定位与识别信号 | 状态与采用前检查 |
|---|---|---|
| zwpride/mABC | 主题用途:将 zwpride/mABC 作为「区块链启发的 RCA 与待复核」边界条目,通过 Python 核对它实际是否属于本教程。 上游自述(保留原文):(EMNLP 2024 (Findings)) mABC: multi-Agent Blockchain-inspired Collaboration for root cause analysis in micro-services architecture | 未归档源项目 · ★ 75 · Apache-2.0 · 2024-12-31。边界条目:先核对实际平台、用途和分类理由,不作为默认安装源。 |
开始前#
需要受支持的 Node.js/npm,创建空目录 <lab-dir>。确认 npm registry 为你/组织批准的来源,运行 npm init -y。本篇地址全部由重复数字构成,没有私钥,数量没有货币意义。不要连接浏览器钱包,也不要打开 RPC。安装前核对准确 scope 包名 @openzeppelin/merkle-tree,并保留生成的 lockfile 供复核。
操作步骤#
1. 安装唯一依赖并固定四个 leaves#
在 <lab-dir> 运行 npm install @openzeppelin/merkle-tree,确认 package-lock.json 与 node_modules 都位于此目录。创建 merkle_lab.mjs:
import { StandardMerkleTree } from "@openzeppelin/merkle-tree";
const values = [
["0x1111111111111111111111111111111111111111", "10"],
["0x2222222222222222222222222222222222222222", "20"],
["0x3333333333333333333333333333333333333333", "30"],
["0x4444444444444444444444444444444444444444", "40"],
];
const encoding = ["address", "uint256"];
const tree = StandardMerkleTree.of(values, encoding);
类型字符串是承诺的一部分;把 uint256 当普通文本哈希会得到不同 root。
2. 打印树、root 和一个 proof#
继续加入:
const index = 2;
const proof = tree.getProof(index);
console.log(tree.render());
console.log("root:", tree.root);
console.log("value:", values[index]);
console.log("proof:", proof);
运行 node merkle_lab.mjs。保存输出到本地笔记即可,不上传。tree.render() 让你看到 leaf/internal node 的布局;默认 leaf 按 hash 排序,所以显示顺序不一定等于输入顺序。
3. 验证正确值和篡改反例#
加入两次验证:
console.log("original:", tree.verify(index, proof));
const tampered = [values[index][0], "31"];
console.log("tampered:", StandardMerkleTree.verify(tree.root, encoding, tampered, proof));
重新运行,预期 original: true、tampered: false。proof 只包含 sibling hashes;验证器用提供的 leaf 逐层计算并比较 root。它证明 30 这条测试值属于该 root,不证明发布这个 root 的人诚实,也不防止业务层重复 claim。
4. 固化测试向量并回滚#
记录包版本、四个 values、encoding、root、proof 和两个布尔结果,形成可复现测试向量。不要部署合约或连接测试网来“加强验证”。退出所有 Node 进程,确认 <lab-dir> 只含 manifest、lockfile、脚本与局部依赖后,用文件管理器删除整个目录。删除即回滚,本实验没有钱包授权或链上状态。
验证#
- root 是固定长度的
0x十六进制值,且相同输入/版本再次生成一致结果。 - 树图包含四个 leaves 和逐层 internal hashes。
- 第三个原始值用其 proof 返回 true。
- 把数量 30 改成 31 后,同一 root/proof 返回 false。
- 没有钱包、助记词、RPC、交易、真实地址或 Android 权限参与。
排错#
| 现象 | 常见原因 | 安全处理 |
|---|---|---|
| root 与另一个教程不同 | encoding、leaf 顺序/排序、double hash 或库版本不同 | 比较完整测试向量,不只比较可见值 |
| 原值验证 false | index/proof 与 value 不匹配 | 输出 tree.entries() 并按真实 index 取 proof |
| 合约验证失败、本地成功 | Solidity leaf 编码与 JS 约定不同 | 按 OpenZeppelin standard leaf 公式逐项比对 |
| 篡改值也 true | 实际仍传入原 value,或测试日志混淆 | 打印两个 value 与布尔结果,重新建干净脚本 |
| 空投页要求助记词 | 钓鱼/盗取凭据,与 Merkle proof 无关 | 立即关闭页面,不输入、不签名并检查账户安全 |
完成清单#
- 我能解释 Merkle root 是数据承诺,不是 Android/账户 root 权限。
- 我只使用四个虚构地址和无价值整数。
- 我记录了 encoding、库版本、root 与 proof。
- 我验证了原值 true 和篡改值 false。
- 我没有连接钱包/RPC,并删除了完整实验目录。