3 个版本 (重大更新)
0.3.0 | 2023年10月20日 |
---|---|
0.2.0 | 2023年9月14日 |
0.1.0 | 2023年5月31日 |
#108 in #merkle-tree
每月128次 下载
用于 12 个crate(直接使用2个)
33KB
725 行
sov-first-read-last-write-cache
此crate提供sov-first-read-last-write-cache
数据结构,专门设计用于与模块系统中使用的sov-state::WorkingSet
集成。
为什么选择sov-first-read-last-write-cache
?
在零知识计算中模拟(稀疏)默克尔树相对低效,因为哈希在zk环境中通常是一个昂贵的操作。因此,我们希望最小化对MT的访问次数。为了进一步提高效率,我们寻求尽可能地进行“批处理”访问。这允许我们共享中间哈希计算,从而减少要执行的操作总数。
而不是立即验证/应用读写操作,我们建议将读写值存储在类似缓存的数据结构中,以供稍后批量验证。此结构(CacheLog
)将存储每个位置读取的第一个值和最后写入的值。假设黑盒VM实现的正确性,这两条信息对于验证所有状态访问和构建(验证过的)后状态是足够的。
示例
这是一个跟踪特定键的第一个读取和最后一个写入的缓存的实现。该缓存确保读写的一致性。
例如
键 | 操作1 | 操作2 | 操作3 | (第一个读取,最后一个写入) |
---|---|---|---|---|
k | 读取(1) | 写入(3) | 读取(3) | ((读取(1),写入(3)) |
k | 写入(3) | 读取(3) | 读取(3) | (_ ,写入(3)) |
k | 写入(5) | 读取(3) | ... | 不一致 |
使用方法
let mut cache = CacheLog::default();
let value = match cache.get_value(&key) {
ExistsInCache::Yes(value) => value,
ExistsInCache::No => {
// This is some "expensive" operation, for example a db lookup.
let new_value = Some(Arc::new(vec![4, 5, 6, 7]));
cache_log.add_read(key, new_value)?;
new_value
}
};
依赖项
~270–730KB
~17K SLoC