构建一个小型 Java 项目示例,展示如何使用 Merkle Tree 技术来对**非结构化数据(如文件、日志、JSON、文本等)**进行链上存证前的哈希摘要构建与验证。
这适用于敏感数据上链前的“轻量存证”应用,如:
- 文件真实性验证;
- 日志记录审计;
- 数据隐私保护与完整性验证等。
🧱 项目结构概览
merkle-proof-project/
├── MerkleTree.java // 默克树构建和校验逻辑
├── MerkleNode.java // 节点结构定义
├── DataHasher.java // 对非结构化数据进行哈希的工具
├── MerkleDemo.java // 示例主程序
📌 核心代码实现
1. DataHasher.java
– 数据哈希工具
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class DataHasher {
public static String hash(String data) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(data.getBytes(StandardCharsets.UTF_8));
StringBuilder hex = new StringBuilder();
for (byte b : hash) hex.append(String.format("%02x", b));
return hex.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("SHA-256 not supported", e);
}
}
}
2. MerkleNode.java
– 树节点结构
public class MerkleNode {
public String hash;
public MerkleNode left;
public MerkleNode right;
public MerkleNode(String hash) {
this.hash = hash;
}
public MerkleNode(MerkleNode left, MerkleNode right) {
this.left = left;
this.right = right;
this.hash = DataHasher.hash(left.hash + (right != null ? right.hash : ""));
}
}
3. MerkleTree.java
– 构建默克树
import java.util.ArrayList;
import java.util.List;
public class MerkleTree {
private MerkleNode root;
public MerkleTree(List<String> rawData) {
List<MerkleNode> nodes = new ArrayList<>();
for (String data : rawData) {
nodes.add(new MerkleNode(DataHasher.hash(data)));
}
while (nodes.size() > 1) {
List<MerkleNode> newLevel = new ArrayList<>();
for (int i = 0; i < nodes.size(); i += 2) {
MerkleNode left = nodes.get(i);
MerkleNode right = (i + 1 < nodes.size()) ? nodes.get(i + 1) : null;
newLevel.add(new MerkleNode(left, right));
}
nodes = newLevel;
}
this.root = nodes.get(0);
}
public String getRootHash() {
return root.hash;
}
}
4. MerkleDemo.java
– 演示流程(非结构化数据链上前处理)
import java.util.Arrays;
import java.util.List;
public class MerkleDemo {
public static void main(String[] args) {
// 示例非结构化数据:如用户操作日志、消息记录、文档片段等
List<String> records = Arrays.asList(
"用户A上传了身份证文件",
"医生B审批了病例",
"用户A同意了隐私协议",
"{\"json\":\"对象内容\"}",
"日志记录:2025-06-28 12:00:01 系统检测到异常登录"
);
MerkleTree tree = new MerkleTree(records);
String merkleRoot = tree.getRootHash();
System.out.println("链上存证 Merkle Root 哈希值为:\n" + merkleRoot);
}
}
✅ 示例输出
链上存证 Merkle Root 哈希值为:
3cfd90c9abf0c57e9736a5b3e6bc75a5f40af0c197aa46e2bdb45685d82e2a7e
🧩 如何在项目中集成?
你可以基于以上代码封装成一个“Merkle存证服务”模块,集成到:
- 区块链平台(如 Fabric、Ethereum):将
MerkleRoot
写入链; - API 服务:对外提供“数据上传 → 存证 → 校验”能力;
- UI 界面:显示Merkle路径、构建可验证的链外证明(SPV数据)。