name: compact-core:ledger-adts description: 当使用Compact进行链上状态管理时,涉及Cell、Counter、Map、Set、List、MerkleTree或HistoricMerkleTree等账本抽象数据类型(ADT),或需要了解Compact与TypeScript中可用操作的差异时使用。
账本抽象数据类型(ADT)
Midnight链上状态管理所用账本抽象数据类型的参考文档。
可用ADT
| ADT | 用途 | 关键操作 |
|---|---|---|
Cell<T> |
单个可变值 | read(读取)、write(写入) |
Counter |
只增计数器 | increment(递增)、value(获取值) |
Map<K, V> |
键值存储 | lookup(查找)、insert(插入)、remove(移除) |
Set<T> |
成员集合 | member(检查成员)、insert(插入)、remove(移除) |
List<T> |
有序集合 | append(追加)、nth(获取第n个元素)、length(长度) |
MerkleTree<T> |
成员证明 | insert(插入)、root(根哈希)、pathForLeaf(叶节点路径) |
HistoricMerkleTree<T> |
历史根记录 | 同上 + resetHistory(重置历史) |
快速示例
计数器(Counter)
ledger counter: Counter;
export circuit increment(): Uint<64> {
counter.increment(1);
return counter.value();
}
映射(Map)
ledger balances: Map<Bytes<32>, Uint<64>>;
export circuit get_balance(user: Bytes<32>): Uint<64> {
const result = balances.lookup(user);
return if result is Maybe::Some(balance) { balance } else { 0 };
}
默克尔树(MerkleTree)
ledger members: MerkleTree<Bytes<32>>;
export circuit prove_membership(
leaf: Bytes<32>,
path: Vector<Bytes<32>, 20>
): Boolean {
const computed_root = merkleTreePathRoot(leaf, path);
return computed_root == members.root();
}
Compact与TypeScript操作对比
部分ADT操作仅在TypeScript中可用:
| ADT | Compact可用操作 | 仅TypeScript可用操作 |
|---|---|---|
| Counter | value、increment |
- |
| Map | lookup、insert、remove |
entries、keys |
| Set | member、insert、remove |
entries、size |
| List | nth、append |
entries、length |
| MerkleTree | insert、root |
pathForLeaf、迭代操作 |