#merkle-tree #smart-contracts #cosmwasm #variant #sparse #contract #history

cw-merkle-tree

CosmWasm 智能合约的稀疏 Merkle 树及其变体实现

3 个版本 (重大更新)

0.3.0 2023 年 5 月 5 日
0.2.0 2022 年 10 月 10 日
0.1.0 2022 年 10 月 7 日

#82#history

GPL-3.0-or-later

28KB
637

CW Merkle Tree

Crates.io docs.rs Crates.io

CosmWasm 智能合约的稀疏 Merkle 树及其变体实现

变体

稀疏 Merkle Tree

具有自定义树级别和默认叶子节点的普通稀疏 Merkle Tree。

带历史记录的稀疏 Merkle Tree

类似于稀疏 Merkle Tree,但能够检查所有先前根哈希的有效根哈希。

带历史记录限制的稀疏 Merkle Tree

类似于稀疏 Merkle Tree,但能够检查指定历史级别之前的先前根哈希的有效根哈希。

示例用法

哈希器

为所需的哈希器结构实现哈希器特质。

#[derive(Clone, Copy, Debug)]
pub struct Blake2;

impl Hasher<Uint256> for Blake2 {
    fn hash_two(&self, left: &Uint256, right: &Uint256) -> Result<Uint256, HasherError> {
        let mut hasher = Blake2b512::new();
        hasher.update(left.to_be_bytes());
        hasher.update(right.to_be_bytes());
        Ok(Uint256::from_be_bytes(
            hasher.finalize()[0..32]
                .try_into()
                .map_err(|e: TryFromSliceError| HasherError::Custom(e.to_string()))?,
        ))
    }
}

Merke Tree

首先,使用 new 构造函数实例化 Merkle 树,并指定叶子和哈希器类型。

const TREE: SparseMerkleTree<Uint256, Blake2> =
    SparseMerkleTree::new("hashes", "leafs", "level", "zeros");

然后通过调用 init 函数初始化树,最好在 instantiate 入口点调用。

  pub fn instantiate(
    deps: DepsMut,
    _env: Env,
    _info: MessageInfo,
    _msg: InstantiateMsg,
) -> Result<Response, ContractError> {
    let hashed_zero = Blake2.hash_two(&Uint256::zero(), &Uint256::zero())?;
    TREE.init(deps.storage, 20, hashed_zero, &Blake2)?;
    
    // ...
}

接下来,通过调用 insert 函数将一个叶子插入到树中下一个可用的索引,insert 将返回插入的索引和新根。

let leaf = Blake2.hash_two(&Uint256::one(), &Uint256::one())?;

let (index, new_root) = TREE.insert(&mut storage, leaf, &Blake2)?;

assert_eq!(index, 0);
assert_eq!(
    new_root,
    Uint256::from_str(
        "65270348628983318905821145914244198139930176154042934882987463098115489862117"
    )?
);
assert_eq!(new_root, TREE.get_latest_root(&storage)?);
assert!(TREE.is_valid_root(&storage, &new_root)?);

依赖项

~3.5–5.5MB
~117K SLoC