Gas优化利器:Merkle 树如何助力链上数据效率革命
目录
- 前言
- 原理
- Merkle树示意图
- 实战演示:构建 Merkle 树并在合约中验证
- 离线构建 Merkle 树(手动计算Merkle树、生成mermaid示意图)
- 编写Merkle.js脚本
- 执行Merkle.js脚本
- 执行结果展示
- mermaid流程图展示
- 离线构建 Merkle 树(merkletreejs计算Merkle树、验证哈希路径)
- 编写Merkle.js脚本
- 执行Merkle.js脚本
- 执行结果展示
- Solidity 合约中的验证逻辑
- 编写MerkleTest.sol合约
- 部署MerkleTest.sol合约
- 验证结果展示
- 典型应用场景
- 空投(Airdrop)验证
- 白名单验证
- 注意事项与优化建议
- 总结
前言
我们都知道,在链上进行数据验证,往往涉及大量存储与计算,而这两者在以太坊中都是“昂贵”的,首先storage 的写入操作是 Gas 消耗大户,其次,如果我们要在合约中存储或比对大量数据(如地址白名单、空投名单等),其成本是指数级增长的。而怎么解决这种问题呢?答案就是使用Merkle树,Merkle树可以将这大量的数据压缩成一个byte32的根节点,链上只需要保存这些根节点,链下保存Merkle树,当需要验证某项数据是否在链上时,只需要传递一个proof[](证明路径)即可完成验证,避免大规模数据上传与链上遍历
原理
哈希函数具备单向性:给定一段字符串,我们可以轻松计算其哈希值;但仅凭哈希值,几乎不可能还原出原始字符串。基于这一特性,我们可以将待验证的数据构建成一棵 Merkle 二叉树:
- 叶子节点:每个叶子节点存放的是原始数据的哈希值;
- 中间节点:每个非叶子节点的值,是其左右子节点哈希值拼接后,再次哈希计算所得;
- 根节点(Merkle Root):整棵树向上迭代合并,最终得到的顶层哈希