3 个版本 (重大更新)
0.3.0 | 2023 年 5 月 5 日 |
---|---|
0.2.0 | 2022 年 10 月 10 日 |
0.1.0 | 2022 年 10 月 7 日 |
#82 在 #history
28KB
637 行
CW Merkle Tree
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