Android Root Atlas/教程库/区块链与 Root

其他含义与待复核 / 区块链与 Root

Merkle Root 与 State Root 怎么验证?从叶子到区块头的可视化教程

用 OpenZeppelin 官方 JavaScript 库在本地构建四叶 StandardMerkleTree,验证正确 proof 与篡改反例,全程不用钱包或真实资产。

本篇完成任务

在隔离目录生成固定测试地址/数量的 Merkle root、单叶 proof 和树图,并证明原值通过、篡改值失败后删除环境。

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 RootAndroid 启动/内核/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 MerkleProofSolidity 端验证 proof合约已采用完全相同约定时编码、leaf hashing、pair ordering 必须一致
Ethereum MPT 文档理解 state/transaction/receipt tries阅读区块头和状态证明比简单二叉 Merkle tree 更复杂,不可混用 proof 格式
Uniswap merkle-distributor历史合约设计样例研究一次性 claim 模式示例不是自动适配生产业务或当前安全要求
alloy-rs/trieRust 的 trie/root/proof 实现Rust/Ethereum 客户端工具版本和 trie 规则必须与目标链一致
Bitcoin block header对比交易 Merkle root 字段跨链术语学习Bitcoin 与 Ethereum 的结构/编码不同

项目全景:区块链与 Root的 9 个项目,一个不漏#

9 个项目中的 root 主要是链根、Merkle root、状态根和证明根,另有一个借区块链思路做微服务 RCA 的跨界项目。主题可围绕“从叶子数据算出可验证根”。

技术路线项目数处理等级在主题任务中的位置
链配置与 Root Chain2候选路线以网络元数据和 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.jsonnode_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: truetampered: 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 或库版本不同比较完整测试向量,不只比较可见值
原值验证 falseindex/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,并删除了完整实验目录。

一手资料#