Icon LinkMerkle 库

Merkle 树允许在链下数据上进行链上验证。通过在链上发布 Merkle 根,可以在链下生成可验证的真实数据证明。

有关 Merkle 库的实现详细信息,请参阅Sway Libs 文档 Icon Link

Icon Link导入 Merkle 库

要使用 Merkle 库,必须将 Sway Libs 添加到Forc.toml文件中,然后导入到您的 Sway 项目中。要将 Sway Libs 作为项目的依赖项添加到Forc.toml文件中,请参阅入门指南

要将 Merkle 库导入到您的 Sway 智能合约中,请在您的 Sway 文件中添加以下内容:

use sway_libs::merkle::binary_proof::*;

Icon Link在 Sway 中使用 Merkle Proof 库

一旦导入,使用 Merkle Proof 库就像调用所需的函数一样简单。以下是您可以使用的函数定义列表。

  • leaf_digest()
  • node_digest()
  • process_proof()
  • verify_proof()

Icon Link基本功能

Icon Link计算叶子和节点

二进制证明目前允许您在给定适当的哈希摘要的情况下计算 Merkle 树的叶子和节点。

要计算叶子,请使用leaf_digest()函数:

fn compute_leaf(hashed_data: b256) {
    let leaf: b256 = leaf_digest(hashed_data);
}

要在给定两个叶子的情况下计算节点,请使用node_digest()函数:

fn compute_node(leaf_a: b256, leaf_b: b256) {
    let node: b256 = node_digest(leaf_a, leaf_b);
}
Icon InfoCircle

注意 计算节点时顺序很重要。

Icon Link计算 Merkle 根

要在给定证明的情况下计算 Merkle 根,请使用process_proof()函数。

fn process(key: u64, leaf: b256, num_leaves: u64, proof: Vec<b256>) {
    let merkle_root: b256 = process_proof(key, leaf, num_leaves, proof);
}

Icon Link验证证明

要针对 Merkle 根验证证明,请使用verify_proof()函数。

fn verify(
    merkle_root: b256,
    key: u64,
    leaf: b256,
    num_leaves: u64,
    proof: Vec<b256>,
) {
    assert(verify_proof(key, leaf, merkle_root, num_leaves, proof));
}

Icon Link使用 Fuels-rs 的 Merkle Proof 库

要为您的 Sway 智能合约生成 Merkle 树和相应的证明,请使用Fuel-Merkle Icon Linkcrate。

Icon Link导入到您的项目中

要导入 Fuel-Merkle crate,应在项目的Cargo.toml文件中的[dependencies]下添加以下内容:

fuel-merkle = { version = "0.33.0" }
Icon InfoCircle

注意 确保使用最新版本的fuel-merkle Icon Linkcrate。

Icon Link导入到您的 Rust 文件中

要使用 Fuel-Merkle crate,应将以下内容添加到您的 Rust 文件中。

use fuel_merkle::binary::in_memory::MerkleTree;

Icon Link使用 Fuel-Merkle

Icon Link生成树

使用 Fuel-Merkle 创建 Merkle 树就像将叶子按增加顺序推入一样简单。

// Create a new Merkle Tree and define leaves
let mut tree = MerkleTree::new();
let leaves = ["A".as_bytes(), "B".as_bytes(), "C".as_bytes()].to_vec();
 
// Hash the leaves and then push to the merkle tree
for datum in leaves.iter() {
    let mut hasher = Sha256::new();
    hasher.update(&datum);
    let hash = hasher.finalize();
    tree.push(&hash);
}

Icon Link生成和验证证明

要为特定叶子生成证明,必须具有叶子的索引或键。只需调用证明函数:

// Define the key or index of the leaf you want to prove and the number of leaves
let key: u64 = 0;
 
// Get the merkle root and proof set
let (merkle_root, proof_set) = tree.prove(key).unwrap();
 
// Convert the proof set from Vec<Bytes32> to Vec<Bits256>
let mut bits256_proof: Vec<Bits256> = Vec::new();
for itterator in proof_set {
    bits256_proof.push(Bits256(itterator.clone()));
}

生成证明后,可以调用 Sway 智能合约的verify_proof函数:

// Create the merkle leaf
let mut leaf_hasher = Sha256::new();
leaf_hasher.update(&leaves[key as usize]);
let hashed_leaf_data = leaf_hasher.finalize();
let merkle_leaf = leaf_sum(&hashed_leaf_data);
 
// Get the number of leaves or data points
let num_leaves: u64 = leaves.len() as u64;
 
// Call the Sway contract to verify the generated merkle proof
let result: bool = contract_instance
    .methods()
    .verify(
        Bits256(merkle_root),
        key,
        Bits256(merkle_leaf),
        num_leaves,
        bits256_proof,
    )
    .call()
    .await
    .unwrap()
    .value;
assert!(result);