#merkle-tree #merkle-proof #constructing #ethereum #tree-structure #solidity #visualize

bin+lib eth_merkle_tree

Rust 库,用于构建和操作以太坊默克尔树

2 个版本

0.1.1 2023年8月16日
0.1.0 2023年8月16日

#21#merkle-proof

MIT 许可协议

320KB
381 行代码(不包括注释)

Ethereum 默克尔树库 (eth-merkle-tree-rs)

Static Badge Static Badge MIT License

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 行代码(约)