#read-write #merkle-tree #cache #blockchain #computation #first #value

sov-first-read-last-write-cache

用于 Sovereign SDK 模块系统的专用缓存层

3 个版本 (重大更新)

0.3.0 2023年10月20日
0.2.0 2023年9月14日
0.1.0 2023年5月31日

#108 in #merkle-tree

Download history 32/week @ 2024-04-27 24/week @ 2024-05-04 34/week @ 2024-05-11 28/week @ 2024-05-18 39/week @ 2024-05-25 32/week @ 2024-06-01 18/week @ 2024-06-08 21/week @ 2024-06-15 40/week @ 2024-06-22 8/week @ 2024-06-29 23/week @ 2024-07-06 42/week @ 2024-07-13 23/week @ 2024-07-20 49/week @ 2024-07-27 32/week @ 2024-08-03 12/week @ 2024-08-10

每月128次 下载
用于 12 个crate(直接使用2个)

MIT/Apache

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