2 个版本
0.1.1 | 2023年8月16日 |
---|---|
0.1.0 | 2023年8月16日 |
#21 在 #merkle-proof
320KB
381 行代码(不包括注释)
Ethereum 默克尔树库 (eth-merkle-tree-rs
)
Ethereum 的默克尔树结构的 Rust 库和命令行界面 (CLI)。
目录
安装
要将 eth-merkle-tree-rs
包含到您的项目中,将其添加到您的 Cargo.toml
[dependencies.lib]
petgraph = "0.6"
hex = "0.4"
rust-crypto = "0.2"
[dependencies.bin]
petgraph = "0.6"
hex = "0.4"
rust-crypto = "0.2"
structopt = "0.3"
csv = "1.1"
colored = "2.0"
库使用
构建默克尔树
use eth_merkle_tree::tree::MerkleTree;
let data = vec![
String::from("0x901Ab22EdCA65188686C9742F2C88c946698bc90, 100"),
String::from("0x7b95d138cD923476b6e697391DD2aA01D15BAB27, 100"),
];
let tree = MerkleTree::new(data).expect("Tree creation error.");
let root = tree.root.expect("Unable to access root");
println!("Root: {}", root.data);
或
use eth_merkle_tree::tree::MerkleTree;
let data = vec![
String::from("0x901Ab22EdCA65188686C9742F2C88c946698bc90"),
String::from("0x7b95d138cD923476b6e697391DD2aA01D15BAB27"),
];
let tree = MerkleTree::new(data).expect("Tree creation error.");
let root = tree.root.expect("Unable to access root");
println!("Root: {}", root.data);
可视化树
可以使用提供的可视化工具可视化树结构
注意:要可视化默克尔树,请确保您的系统上已安装 Graphviz。
use eth_merkle_tree::graph::visualizer::graphviz;
graphviz(&tree).expect("Visualization Error!");
CLI 使用
此库还包含一个用于与默克尔树交互的命令行界面。
可视化树
要可视化树,请使用 -v 或 --visualize 标志
$ emtr -- ./example.txt -v
生成默克尔证明
要为特定叶子生成默克尔证明
$ emtr -- ./example.txt --proof 0x901Ab22EdCA65188686C9742F2C88c946698bc90
在 Solidity 中验证证明
一旦生成了证明,就可以使用 MerkleProof 在 Solidity 中进行验证,如下例所示
pragma solidity >=0.8.0 <0.9.0;
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
contract Verifier {
bytes32 private root;
constructor(bytes32 _root) {
root = _root;
}
function verify(
bytes32[] memory proof,
address addr,
uint256 amount
) public view {
bytes32 leaf = keccak256(abi.encode(addr, amount));
require(MerkleProof.verify(proof, root, leaf), "Invalid proof");
}
function verify(
bytes32[] memory proof,
address addr
) public view {
bytes32 leaf = keccak256(abi.encodePacked(addr));
require(MerkleProof.verify(proof, root, leaf), "Invalid proof");
}
}
许可协议
本项目采用 MIT 许可协议。有关详细信息,请参阅 LICENSE 文件。
依赖关系
~9–20MB
~199K 行代码(约)