Merkle 树允许在链下数据上进行链上验证。通过在链上发布 Merkle 根,可以在链下生成可验证的真实数据证明。
有关 Merkle 库的实现详细信息,请参阅Sway Libs 文档 。
要使用 Merkle 库,必须将 Sway Libs 添加到Forc.toml
文件中,然后导入到您的 Sway 项目中。要将 Sway Libs 作为项目的依赖项添加到Forc.toml
文件中,请参阅入门指南 。
要将 Merkle 库导入到您的 Sway 智能合约中,请在您的 Sway 文件中添加以下内容:
use sway_libs::merkle::binary_proof::*;
一旦导入,使用 Merkle Proof 库就像调用所需的函数一样简单。以下是您可以使用的函数定义列表。
leaf_digest()
node_digest()
process_proof()
verify_proof()
二进制证明目前允许您在给定适当的哈希摘要的情况下计算 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);
}
注意 计算节点时顺序很重要。
要在给定证明的情况下计算 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);
}
要针对 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));
}
要为您的 Sway 智能合约生成 Merkle 树和相应的证明,请使用Fuel-Merkle crate。
要导入 Fuel-Merkle crate,应在项目的Cargo.toml
文件中的[dependencies]
下添加以下内容:
fuel-merkle = { version = "0.33.0" }
注意 确保使用最新版本的fuel-merkle crate。
要使用 Fuel-Merkle crate,应将以下内容添加到您的 Rust 文件中。
use fuel_merkle::binary::in_memory::MerkleTree;
使用 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);
}
要为特定叶子生成证明,必须具有叶子的索引或键。只需调用证明函数:
// 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);