好好学习,天天向上

  • 后端开发
    • Rust
  • 区块链
    • BTC
    • Layer2
  • 经济投资
  • 文学创作
    • 哲学思考
    • 随笔
HhxxTtxs
人生到处知何似,应似飞鸿踏雪泥。
  1. 首页
  2. 零知识
  3. 正文

zkvm中内存一致性的实现方法

25 5 月, 2024 308点热度 0人点赞 0条评论

内存一致性校验( Memory Consistency Checks -- MCC )是保证zkvm在处理程序执行当中,读写的内存数据未被恶意攻击者篡改,目前主流的内存处理方式:
ROM:只读内存(例如:cairo )

RAM:随机读取内存(例如:risc0,sp1)

对于MCC常见处理方式如下

内容 隐藏
1 ROM(只读内存)
1.1 示例
2 RAM(随机读取内存)
2.1 示例

ROM(只读内存)

有两个vector,分别称为reads、writes,里面存储的数据项是item = (address,value,version)

  1. 将初始化的内存数据遍历,所有项均push到writes的vector中,每一项为item = (address,value,0) 即version为0
  2. 每次读的时候将对应的item=(address,value,version) push 到 reads 中,同时将对应item.version+1,并push到writes中
  3. 最后需要将writes中对应每个address的最新vesion item,都push 到reads vector中
  4. 此时 reads 与 writes 互为置换

示例

  • 假设有初始内存数据是[ (addr1,val1,ver0), (addr2,val2,ver0), (addr3,val3,ver0), (addr4,val4,ver0) ],reads和writes数组分别都是空[]。
  • 第一步将初始化的数据都push到writes中,则 writes_vector = [ (addr1,val1,ver0), (addr2,val2,ver0), (addr3,val3,ver0), (addr4,val4,ver0)]
  • 读取一个值addr1,则首先需将其数据push到reads_vector中,同时需要将version+1之后push到writes_vector中,则此时 reads_vector = [ (addr1,val1,ver0) ],writes_vector = [ (addr1,val1,ver0), (addr2,val2,ver0), (addr3,val3,ver0), (addr4,val4,ver0), (addr1,val1,ver1) ]
  • 假设我们只读取一次,则最后将writes中对应每个address的最新vesion item,都push到reads_vector中,则此时reads_vector = [ (addr1,val1,ver0),(addr2,val2,ver0), (addr3,val3,ver0),(addr4,val4,ver0),(addr1,val1,ver1)],writes_vector不做改变,此时reads_vector与writes_vector互为置换。

RAM(随机读取内存)

与ROM不同的是,RAM有一个校验:读取的时候,不能读取到未来写入的值。

有两个vector,分别称为reads、writes,里面存储的数据项是item = (address,value,timestamp)

  1. 将初始化的内存数据遍历,所有项均push到writes的vector中,每一项为item = (address,value,0) 即timestamp为0
  2. 读取数据的时候,将对应的item=(address,value,timestamp) push 到 reads 中,同时将对应item也push到writes中,即读的时候也写一份同样的数据到该地址
  3. 写入数据的时候,先将对应地址的item=(address,old_value,timestamp) push 到 reads 中,之后写入对应新的item=(address,old_value,timestamp) push 到 writes 中,即写的时候先读。
  4. 最后需要将writes中对应每个address的最新timestamp item,都push 到reads vector中
  5. 此时 reads 与 writes 互为置换
  6. 对于相同地址的读取,需要保证其读取时的timestamp 大于该地址在此次读取前最后一次写入时的timestamp,该校验可以通过lookup实现,即读取时的timestamp t_r减去写入时的timestamp t_w在表[1.....T]中,T代表整个timestamp的长度

示例

同ROM类似,只不过写入的时候,需要先将对应地址的item=(address,old_value,timestamp) push 到 reads 中,之后写入对应新的item=(address,old_value,timestamp) push 到 writes 中,即写的时候先读一次。(如果该内存未初始化,需要先写入一个默认值push到writes vector中,之后再进行写入的操作)

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: layer2
最后更新:28 6 月, 2024

hhxxttxs

五年服务端开发,现专职区块链,偏零知识Layer2工程方向

点赞
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

Archives

  • 2026 年 2 月
  • 2025 年 9 月
  • 2025 年 8 月
  • 2025 年 7 月
  • 2025 年 1 月
  • 2024 年 9 月
  • 2024 年 8 月
  • 2024 年 7 月
  • 2024 年 6 月
  • 2024 年 5 月
  • 2024 年 4 月
  • 2024 年 3 月

Categories

  • BTC
  • cuda
  • L2
  • rust
  • 其他
  • 区块链
  • 后端开发
  • 哲学思考
  • 文学创作
  • 算法
  • 经济投资
  • 链开发
  • 零知识

COPYRIGHT © 2024 好好学习,天天向上. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang