Risc0:使用Continunations来证明任意EVM交易

news2024/11/18 12:42:57

1. 引言

RISC Zero,设想了一个基于零知识证明的无限计算的未来。

2023年5月发布了RISC Zero zkVM v0.15版本,其中包含了一种重要feature:

  • continuations。

在RISC Zero zkVM中,continuations为一种机制:

  • 用于将大的程序,切分为多个更小的片段,使得这些小片段可独立计算和证明。

引入continuations机制的好处在于:

  • 并行证明
  • 启用暂停和恢复zkVM(类似于AWS Lambda上的“热启动”)
  • 限定所需内存为固定值,该内存值与程序大小无关

本文重点关注的是,借助continuations机制:

  • 不再限定程序 不超过某固定最大计算长度。
  • 使得程序可根据需要,运行任意多的指令。

但实际如何实现无上限cycle count的呢?

具有无限可能——因RISC Zero zkVM是通用的,可运行可编译为RISC-V的程序(如Rust、C++、Go等等)。

而且,引入了continuations机制之后,RISC Zero zkVM可执行任意时长的程序,如:

  • 在RISC Zero zkVM内,运行一个EVM引擎,并证明由某以太坊交易引起的状态改变。
    相关zkEVM demo示例见:
    • https://github.com/risc0/risc0/tree/main/examples/zkevm-demo(Rust)

2. 在RISC Zero zkVM中运行EVM

在2023年5月10日博客zkEVM vs zkVM: a Single Letter Can Make a Big Difference!中,Erik解释了RISC Zero zkVM与zkEVM的区别:

  • 在zkVM中:可运行在计算机上任意软件,都可运行在zkVM中,不仅限于运行在以太坊上的软件。

EVM是运行在某计算机是的软件,这即意味着,该EVM也可运行在RISC Zero zkVM中,之前相关的研究成果有:

  • Odra在2023年2月做了一个POC原型:在RISC Zero zkVM中实现了SputnikVM的solidity运行。
  • zkPoEx:使用SputnikVM来生成proofs of exploits。
    在这里插入图片描述

本文以revm EVM为例:

  • revm为基于Rust的EVM interpreter crate。

与其它大多数Rust crates类似,revm crate也可运行在RISC Zero zkVM中。https://github.com/risc0/risc0/tree/main/examples/zkevm-demo示例中即运行的是revm crate:

  • 当将其指向某以太坊交易时,将使用revm来执行该交易以计算新状态;
  • 然后创建a receipt,其中包含:交易执行前后的状态差异,以及,该结果正确的ZKP proof。

在引入continuations之前,该流程仅适于小交易:

  • 之前使用https://etherscan.io/tx/0x671a3b40ecb7d51b209e68392df2d38c098aae03febd3a88be0f1fa77725bbd7这笔小交易来展示,该小交易不会超过cycle上限限制。

引入continuations之后,不再有该限制:

  • 如,可运行类似https://etherscan.io/tx/0x600d18676aef439ec6ba33d143b78878a520682be7fd8331c74bdf672988a2b1这样的heavy交易,所调用的合约使用了ecrecover预编译合约以及多个KECCAK256。
    在M1 Max MacBook Pro上运行,用时约12分钟,内存12GB。
    • 用时取决于程序执行长度,但内存用量,与程序和操作系统等均无关。
  • 借助continuations,所有以太坊交易都可在https://github.com/risc0/risc0/tree/main/examples/zkevm-demo](https://github.com/risc0/risc0/tree/main/examples/zkevm-demo)示例中运行并证明,且无对交易大小的任务限制。

3. 何为continuation?

continuations为一种机制:

  • 用于将大的程序,切分为多个更小的片段,使得这些小片段可独立计算和证明。
  • 以内存image(和prorgam counter)的Merkle tree方式,来 跟踪每个小片段的起始和终止zkVM状态。从而可对比某片段的终止状态,与下一片段的起始状态。

zkVM程序,基于cycle count(即po2),自动切分为segment片段:

pub struct Segment {
    pub po2: usize, //The number of cycles in powers of 2.
    pub index: u32, //The index of this Segment within the Session
    pub insn_cycles: usize, //The number of cycles used to execute instructions.
    /* private fields */
}

若程序运行需要的cycle数多于单个segment所允许的数量,则会自动切分:

  • 使用"session":来表示一系列片段(sequence of segments)。其中第一个片段由用户初始化,最后一个片段由用户终止(不同于,自动生成切分的终止)。
  • 而“segment”:具有任意自动决定的边界,这些边界包含在per-segment cycle limit 范围内。
    sessions表示的是语义上的边界,其起始和终止均由用户来指定。

一个session receipt中包含了多个segment receipt:

pub struct Receipt {
    pub inner: InnerReceipt,
    pub journal: Vec<u8>,
}
pub enum InnerReceipt {
    Flat(SegmentReceipts),
    Succinct(SuccinctReceipt),
    Fake,
}

会确认session receipt的如下要素的有效性:

  • 1)每个segment receipt是有效的。
  • 2)每个sement的起始receipt,与前一segment的终止状态,匹配。
  • 3)初始状态(或image_id)与validator的期待匹配(即,该session运行的是该validator想要验证的同一代码)。

4. Continuations机制的好处

引入 continuations机制最明显的好处是:

  • 可运行任意长度程序。

除此之外,还有如下好处:

  • 1)可并行化:小片段可分发给多个计算机并行执行,以降低负载减少延迟。会在证明之前,通过“execution”阶段将程序切分为片段,并确定每个片段的内容。这样使得所证明的每个片段,均与其它片段内容无关。证明片段的高强度工作,可分发给多台机器,相比于在单一机器上生成完整proof,这样可并行化并降低总体延迟。
  • 2)暂停-恢复:借助continuations,zkVM程序可暂停并恢复。当描述片段时,其会持续,直到用户喊停。这可以是传统的中止,表示计算的中止。但其也可以是暂停,使得用户可"I want to do some computation now, and then come back at some later time and pick up where I left off."。
    如,想象某zkML工作负载,其构造了一个ML模型,加载了权重,提供了输入数据,并计算了输出。在这个例子中,zkVM可在加载权重之后,在提供输入之前暂停。这有几个优势:
    • 首先,模型构建和权重加载可以在用户提供输入之前执行,从而减少输入和输出之间的延迟。
    • 此外,这个初始设置阶段可以执行一次并暂停,然后针对不同的输入恢复多次,从而节省了重新执行共享设置的工作。
  • 3)固定内存用量:在引入continuations之前,若某zkVM程序的cycle数是2倍,则其runtime和内存需求均约是2倍。引入continuations之后,内存用量仅取决于segment length,而不是总程序长度,因此,任意长度的程序执行,所需的内存用量都是固定的。

5. Continuations和Bonsai

Continuations是一个强大的工具。

RISC Zero团队想要尽可能简化continuations的复杂度,同时让ZKP更通用。为此当前正致力于Bonsai:

  • 虽然通过并行化有可能大幅提高延迟,但zkVM代码中并没有构建程序片段的分配。
  • 当前只支持flat continuations,而不支持rollup continuations。
    • 通过flat continuations,每个片段都会生成自己的receipt。每个receipt都需要单独验证,虽然我们helper functions来证明整个程序,但所需的验证工作仍会随着执行时间的延长而增加。
    • rollup continuations将使用proofs of verification来递归地rollup这些单独的segment proofs。结果是,只需要验证一个receipt,验证时长将是恒定的,与执行时间长短无关。

参考资料

[1] RISC Zero团队2023年5月22日博客 Using Continuations to Prove Any EVM Transaction

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1124913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apollo与TypeScript:强大类型检查在前端开发中的应用

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

如何制作.exe免安装绿色单文件程序,将源代码打包成可独立运行的exe文件

环境: rustdesk编译文件和文件夹 文件程序制作工具 问题描述: 如何制作.exe免安装绿色单文件程序,将源代码打包成可独立运行的exe文件,像官网那种呢? 将下面编译好的rustdesk文件夹制作成一个.exe免安装绿色单文件程序,点击exe就可以运行 在github上找了半天也没有…

大模型的实践应用3-大模型的基础架构Transformer模型,掌握Transformer就掌握了大模型的灵魂骨架

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用3-大模型的基础架构Transformer模型,掌握Transformer就掌握了大模型的灵魂骨架。Transformer是一种基于自注意力机制的深度学习模型,由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它最初被设计用…

【Java集合类面试十一】、HashMap为什么用红黑树而不用B树?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;HashMap为什么用红黑树而…

第四章 路由基础

目录 4.1 路由器概述 4.1.1 路由器定义 4.1.2 路由器工作原理 4.1.3 路由表的生成方式 &#xff08;1&#xff09;直连路由 &#xff08;2&#xff09;静态路由 &#xff08;3&#xff09;动态路由 4.1.4 路由器的接口 &#xff08;1&#xff09;配置接口 &#xff0…

Java毕业设计 SpringBoot 美食推荐系统 美食分享系统

Java毕业设计 SpringBoot 美食推荐系统 美食分享系统 SpringBoot 美食推荐系统 功能介绍 首页 图片轮播 登录注册 美食信息 搜索 美食分享 美食教程 美食排行榜 个人中心 更新个人资料 我的分享 我的收藏 在线咨询 后台管理 登录 个人中心 修改密码 用户管理 美食信息管理 美…

Spring+spring mvc+mybatis整合的框架

Spring是一个轻量级的企业级应用开发框架&#xff0c;于2004年由Rod Johnson发布了1.0版本&#xff0c;经过多年的更新迭代&#xff0c;已经逐渐成为Java开源世界的第一框架&#xff0c;Spring框架号称Java EE应用的一站式解决方案&#xff0c;与各个优秀的MVC框架如SpringMVC、…

经典卷积神经网络 - VGG

使用块的网络 - VGG。 使用多个 3 3 3\times 3 33的要比使用少个 5 5 5\times 5 55的效果要好。 VGG全称是Visual Geometry Group&#xff0c;因为是由Oxford的Visual Geometry Group提出的。AlexNet问世之后&#xff0c;很多学者通过改进AlexNet的网络结构来提高自己的准确…

day03_pandas_demo

文章目录 pandas介绍为什么使用pandasDataFrameDataFrame属性DataFrame的索引修改行列的索引值重设索引值以某列设置新索引 MultiIndexSerias索引操作直接索引按名字索引按数值索引 赋值操作排序对内容排序按索引排序 DataFrame的运算算术运算逻辑运算逻辑运算符号 < > |…

uni-app 小宠物 - 会说话的小鸟

在 template 中 <view class"container"><view class"external-shape"><view class"face-box"><view class"eye-box eye-left"><view class"eyeball-box eyeball-left"><span class"…

搭建nexus私服部署项目

目录 1、前言 2、添加release和snapshot版本库 3、配置idea中的Maven设置 4、配置maven的settings.xml文件 5、项目中使用maven部署 1、前言 前文主要讲述了maven私服nexus的搭建&#xff1a;maven私服nexus搭建mybatisplus使用-CSDN博客 本文将继续讲述搭建nexus私服有…

img标签如何将<svg></svg>数据渲染出来

要将 ​​<svg></svg>​​​ 数据插入到 ​​<img>​​ 标签中&#xff0c;你可以使用以下两种方法&#xff1a; 方法一&#xff1a;使用 Data URL 你可以将 ​​<svg></svg>​​ 数据编码为 Data URL&#xff0c;并将其作为 ​​<img>​​…

“游蛇”黑产团伙专题分析报告

目录 ​编辑 01概览 02黑产团伙攻击手段 2.1 恶意程序传播 双击类恶意程序 跳图类恶意程序 损坏类恶意程序 2.2 恶意程序执行 可信站点 黑产团伙基础设施 03黑产团伙的几种变现方式 3.1 伪装身份后实施诈骗 3.2 恶意拉群后实施诈骗 04防护、排查与处置 01概览 “…

手写SVG图片

有时候QT中可能会需要一些简单的SVG图片,但是网上的质量参差不齐,想要满意的SVG图片,我们可以尝试直接手写的方法. 新建文本文档,将以下代码复制进去,修改后缀名为.svg,保存 <?xml version"1.0" encoding"utf-8"?> <svg xmlns"http://www…

QTday06(人脸识别项目前置知识)

qt版本5.4.0&#xff1a;旧版本的qt&#xff0c;为啥要用旧版本的我也不知道 实现结果&#xff1a; 调用系统摄像头&#xff0c;用红框框住画面中的人头 代码&#xff1a; pro&#xff1a; #------------------------------------------------- # # Project created by QtC…

通过热敏电阻计算温度(二)---ODrive实现分析

文章目录 通过热敏电阻计算温度&#xff08;二&#xff09;---ODrive实现分析测量原理图计算分析计算拟合的多项式系数根据多项式方程计算温度的函数温度计算调用函数 通过热敏电阻计算温度&#xff08;二&#xff09;—ODrive实现分析 ODrive计算热敏电阻的温度采用的时B值的…

计算机基础知识37

针对记录的SQL语句 记录: 表中的一行一行的数据称之为是一条记录 先有库---->表---->记录 C:\Users\26647>mysql -u root -p # 先登录 mysql> show databases&#xff1b; # 查看所有库 mysql> create database db1; # 创造库 mysql> use db1; # 引用…

Java逻辑运算符(、||和!),Java关系运算符

逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式&#xff0c;以判断程序中的表达式是否成立&#xff0c;判断的结果是 true 或 false。 逻辑运算符是对布尔型变量进行运算&#xff0c;其结果也是布尔型&#xff0c;具体如表 1 所示。 表 1 逻辑运算符的用…

科大讯飞星火认知大模型

哈喽&#xff0c;大家好&#xff01; 前段时间「科大讯飞版ChatGPT」上线&#xff0c;给大家推荐了一波&#xff0c;演示了其强大的功能&#xff0c;不少小伙伴都立马申请体验了一把&#xff0c;也有私信说非常强大&#xff0c;工作效率提高不少&#xff0c;支持国产大模型&am…