zkVM设计性能分析
1. 引言
本文主要参考:
- 2023年9月ZKSummit10 Wei Dai @1k(x) & Terry Chung @1k(x)分享视频 ZK10: Analysis of zkVM Designs - Wei Dai & Terry Chung
当前有各种zkVM,其设计思想各有不同,且各有取舍,本文重点对现有各zkVM设计进行分析。
zkVMs寒武纪大爆发:

- 2020年之前的zkVM方案均是学术性的,不具备实用性,具体有:
- TinyRAM(2013年)
- vnTinyRAM
- Buffet
- Geppetto
- Spice等
- 2021年之后开始有商业化的zkVM方案,特别是近两年来各种zkVM方案开始大爆发,有:
- Cairo-VM
- Risc-Zero
- zkSyncVM
- polygon zkEVM
- Scroll zkEVM
- Delphinus zkWasm
- Valida
- Triton VM
- powdr risc-v
- Fluent zkWasm
- Jolt
- polygon Miden等
本文内容框架为:
- 何为zkVMs?为何需要zkVMs?
- zkVM设计性能分析:
- ISA性能分析
- Arithmetization性能分析
- Proof system性能分析
- 结论及开放性问题
2. 何为zkVMs?为何需要zkVMs?
2.1 为何需要zkVMs?
zk Circuits vs. zkVMs:

- 编程语言:zk Circuits通常采用Circom、HDL等面向领域编程语言编写;而zkVMs采用Rust、WASM、Risc-V、LLVM等高级通用语言编写。
- 易用性及生态:难于用zk Circuits来表达具有很多分支的复杂逻辑;而zkVMs的程序有大量现有可靠的软件。
- 性能:zk Circuits性能较高,因其对特定计算的约束进行了手动调优;而zkVMs性能要慢约10~100倍。本文重点关注的是如何提升zkVMs的性能。
2.2 何为VMs?
虚拟机采用指令集架构(Instruction set architecture,ISA),即:
- 具有固定语义的一组有限数量的指令集。

虚拟机(Virtual Machine,VM)的主要结构有:
- 程序:由指令序列组成。虚拟机每次仅读取程序中的一条指令。
- 内存
- 虚拟机:主要工作为:
- 1)读取输入
- 2)对内存(RAM)读写
- 3)修改本地机器状态:内部机器状态为:Stack和(或)Registers。
- 4)写输出
- 5)中止执行
现有的VM/zkVM架构,以及内部机器状态内存模型,选型情况为:

2.2.1 VM选择——Harvard架构 vs. Von Neumann架构
前序博客见:
- 哈佛架构 VS 冯·诺依曼架构
在做zkVM设计时,对应虚拟机(VM)架构通常需考虑在哈佛架构 和 冯·诺依曼架构 之间二选一:
- 哈佛架构:程序和内存分属不同区域。
- 优点为:
- 无program loader
- 仅lookup table需要额外的cycles。
- 缺点为:
- 无JIT
- per program setup(需对每个程序做setup)
- 优点为:
- 冯·诺依曼架构:程序在内存中。
- 优点为:
- 通用,更接近现代CPUs
- 缺点为:
- 必须约束所取指令的正确性
- 需要program loader(来将程序加载到内存中), 意味着需要更多cycles
- 优点为:

2.2.2 VM内部机器状态内存模型选择——Stack, Register, vs. Direct Memory
虚拟机内部机器状态内存模型,通常有3种选择:
- 1)Stack Machine:通过访问stack top来进行数据移动,指令更简单。如:
- EVM
- Miden-asm
- Wasm
- 2)Register Machine:指令比Stack Machine要短,但更复杂,不过数据移动操作要少的多。如:
- RISC-V
- 3)Direct Memory Machine:无需数据移动(zero data movement),但有更多的读写操作。如:
- LLVM-IR


三种虚拟机内部机器状态内存模型的性能对比为:

- LLVM-IR
2.3 何为zkVMs?
zkVM的目的在于:
- 给定初始程序、初始程序输入、初始内部机器状态,证明以上VM的有效执行。
zkVMs主要分为四大阶段:
-
1)Setup阶段:根据参数(如最大trace行数、固定列数、哈希函数等),获得Proving key和Verification key。
-
2)生成Witness阶段:(Executor)根据程序和程序输入,生成execution trace(即witnesses)。该execution trace中包含了:
- 该程序的执行
- 以及,帮助约束该执行有效性的额外信息。
在生成Witness阶段,还包括将程序切分以供后续并行证明的工作。
-
3)Proving阶段:根据execution trace和Proving key,生成proof。
-
4)Verification阶段:根据proof和Verification key,生成验证是否通过的结果Y/N。

3. zkVM设计性能分析
传统虚拟机中,其效率分析的核心思想为:
- VM效率 约等于 (程序中的指令数 x 执行单条指令用时) ,即:
T ≈ P中指令数 × time instruction T\approx \text{P中指令数 }\times \frac{\text{time}}{\text{instruction}} T≈P中指令数 ×instructiontime
当使用zkVM证明某固定、抽象程序P时,借鉴相同的思想:
- zkVM效率 约等于 (程序中的指令数 x 单条指令的约束复杂度 x 单个约束证明用时) ,即:zkVM证明用时 T T T以如下公式来表示:
T ≈ P中指令数 × time instruction ≈ P中指令数 × "Constraint complexity" instruction × time "Constraint complexity" \begin{aligned}T &\approx \text{P中指令数 }\times \frac{\text{time}}{\text{instruction}} \\ &\approx\text{P中指令数 }\times \frac{\text{"Constraint complexity"}}{\text{instruction}} \times \frac{\text{time}}{\text{"Constraint complexity"}}\end{aligned} T≈P中指令数 ×instructiontime≈P中指令数 ×instruction"Constraint complexity"×"Constraint complexity"time
其中的“约束”为:
- 衡量某类proof system复杂度的单位。
取决于所采用的proof system类型,具体的“约束复杂度”是指,如:
- R1CS约束数
- 具有固定配置的Plonk电路中的cells数
- 具有固定depth的GKR电路中的wires数
为此,在对zkVM做性能分析时,将“(程序中的指令数 x 单条指令的约束复杂度 x 单个约束证明用时)”拆分成3个维度来分析,其中:
- 1)程序中的指令数:对应为ISA(Instruction set architecture)性能分析。
- 2)单条指令的约束复杂度:对应为Arithmetization性能分析。
- 3)单个约束证明用时:对应为Proof system性能分析。

3.1 ISA性能分析
ISA(Instruction set architecture)性能分析,主要关注的是程序中的指令数。
传统ISA和“ZK ISA”是针对不同的场景进行了优化:
-
传统ISA为:
- 内存局限性:处理器具有内存上限。
- 程序size(如压缩):无法有太多通用寄存器。
- 执行速度
-
"ZK ISA"为:
- 每个cycle,一条指令:具有指令上限。
- 指令大小的影响小:指令可包含更多信息,如引用更多寄存器或本地变量。
- 证明速度或性能。

以,在软件中实现SHA256 one-round压缩函数 所需的指令数,为例,不同虚拟机对比情况为:

其中:
- 前三种(EVM、Miden-asm、Wasm)为stack machine,具有相对更多的local data movement操作。
- RISC-V为register machine,具有少得多的local data movement操作。
- LLVM-IR为direct memory模式,具有虚拟寄存器,从而具有zero data movement。


由此可知,实际的ISA性能,取决于所采用的机器内部状态内存模型:
- 1)Stack machines:具有大量stack操作(数据移动操作)(高达50%~60%)。
- 2)Register machines:
- 当寄存器压力低时,其性能好。
- 当寄存器压力高时(~30%),需要大量的数据移动。
- 3)Direct memory machines:
- 消除了local data movement,即无需数据移动。
- Caveat(警告):可能会导致更复杂的arithmetization?

3.2 Arithmetization性能分析
Arithmetization性能分析,关注的是:
- 单条指令的约束复杂度。

实际在对Arithmetization性能分析时,主要分为2大块:
- Segment性能分析
- “Recursion复杂度”+“Continuation复杂度” 性能分析。
3.2.1 Segment性能分析
算术化是指将对程序执行segment的约束,转换为:
- Permutation check、
- Gate check、
- lookup、
- Copy check
等组合,然后进一步转换为2大类子约束表达:
- Zero check
- Product check
取决于具体所采用的PolyIOP方案,后续的方案以及影响性能的关键运算也有所不同:
- 单变量PolyIOP:相关方案有Plonk、STARK、Plookup等,对应为Quotient check,影响性能的关键运算为FFT。
- 多变量PolyIOP:相关方案有GKR、HyperPlonk、Jolt/Lasso、ProtoStar等,对应为Sum check,影响性能的关键运算为MLE。


以基于STARK的zkVM为例,将程序正确执行的execution trace切分为多个segment。其Prover的证明用时由:
- 派生多项式,以及对多项式进行承诺
所主导。根据RISC0、Triton、Plonky2所提供的数据:
- 经典的STARK Provers有60%~80%的证明时长用于派生和commit多项式。
3.2.1.1 STARK VMs vs. SNARK VMs

当前基于STARK方案的zkVM有:
- Risc0
- Miden
- Cairo
- Valida
- Nock
- TritonVM
- zkSync VM
- Polygon zkEVM
这些STARK zkVMs的性能分析对比情况为:【关键数据见最后2列】

现有的基于SNARK方案的zkVMs,采用的都是基于Halo2的方案,具体有:
- zkWasm
- Powdr的Risc-v
- Scroll的zkEVM
这些SNARK zkVMs性能对比为:

3.2.2.2 segment性能提升措施
为提升Arithmetization segment性能,其目标应为:
- 尽可能使,单个指令的committed cells,数量最少。
具体措施有:
- 1)移除重复的cells。仅对每个指令的“state change”进行commit。
- 对“non-local” 数据/计算,采用permutation/lookups。
- powdr risc-v中的寄存器(编码在列中),占约50%的列。
- 2)采用表达性更好的IOP arguments:
- fixed lookup tables可改进bitwise运算性能。
- 改进关键IOP原语的性能,如在单个table中查找 M M M个列集合,采用更好的lookup argument会具有更好的性能:

- 3)具有“flexible area”的co-processors,有助于改进单个指令开销。

3.2.2“Recursion复杂度”和“Continuation复杂度” 性能分析

当将1个完整的execution trace切分为 t t t个segment时,总的复杂度为:
- 证明所有 t t t个(具有 n n n-step)segments复杂度
- 证明所有 t − 1 t-1 t−1个 recursive proofs的复杂度
相应的关键路径为:
- 1个segment proof
- log ( t ) \log(t) log(t)个recursive proofs

如Risc0中,有多达50%的开销用于对“continuation” state进行序列化。
对比SNARKs(Plonk)、Folding/Accumulation、STARKs等方案的recursion threshold开销为:


3.3 Proof system性能分析
Proof system性能分析,关注的是:
- 单个约束证明用时。
对于多项式承诺方案(PCS,Polynomial Commitment Scheme),基于FRI的PCS性能要由于基于MSM的多项式承诺方案性能:【其中y轴表示的是每秒承诺的域元素数】


4. 结论及开放性问题
关于ISA的开放性问题有:
- 如何将现有工具应用到zk-efficient ISA中?
- 可进一步消除data movement么?如对memcpy进行direct argument?
关于Arithmetization的开放性问题有:
- 降低单个指令的复杂度
- 降低递归(recursion)复杂度
- “doubly-fast”哈希函数(如Poseidon2、Tip5、XHash{8,12}、Monolith等)
- 降低"continuation"复杂度
关于proof system/PCS的开放性问题有:
- FFT、MLE、PCS应封装为库,项目方可受益于这些原语的更好实现。
- 更好的bench工具,来对比各个方案的性能。

参考资料
[1] 2023年9月ZKSummit10 Wei Dai @1k(x) & Terry Chung @1k(x)分享视频ZK10: Analysis of zkVM Designs - Wei Dai & Terry Chung【1k(x)为早期密码学投资基金】
相关文章:
zkVM设计性能分析
1. 引言 本文主要参考: 2023年9月ZKSummit10 Wei Dai 1k(x) & Terry Chung 1k(x)分享视频 ZK10: Analysis of zkVM Designs - Wei Dai & Terry Chung 当前有各种zkVM,其设计思想各有不同,且各有取舍,本文重点对现有各z…...
调用gethostbyname实现域名解析(附源码)
VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…...
面向无线传感器网络WSN的增强型MODLEACH设计与仿真(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
前端页面初步开发
<template><div><el-card class"box-card" style"height: 620px"><el-input v-model"query.name" style"width:200px" placeholder"请输入用户姓名"></el-input>   …...
【赠书活动第3期】《构建新型网络形态下的网络空间安全体系》——用“价值”的视角来看安全
目录 一、内容简介二、读者受众三、图书目录四、编辑推荐五、获奖名单 一、内容简介 经过30多年的发展,安全已经深入到信息化的方方面面,形成了一个庞大的产业和复杂的理论、技术和产品体系。 因此,需要站在网络空间的高度看待安全与网络的…...
基于SpringBoot的智能推荐的卫生健康系统
目录 前言 一、技术栈 二、系统功能介绍 用户管理 科室类型管理 医生信息管理 健康论坛管理 我的发布 我的收藏 在线咨询 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在…...
几种开源协议的区别(Apache、MIT、BSD、MPL、GPL、LGPL)
作为一名软件开发人员,你一定也是经常接触到开源软件,但你真的就了解这些开源软件使用的开源许可协议吗? 你不会真的认为,开源就是完全免费吧?那么让我们通过本文来寻找答案。 一、开源许可协议简述 开源许可协议是指开…...
通过usb串口发送接收数据
USB通信使用系统api,USB转串口通信使用第三方库usb-serial-for-android, 串口通信使用Google官方库android-serialport-api。x 引入包后在本地下载的位置:C:\Users\Administrator\.gradle\caches\modules-2\files-2.1 在 Android 中&#x…...
Python3数据科学包系列(三):数据分析实战
Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 国庆中秋宅家自省: Pyth…...
UE4.27.2 自定义 PrimitiveComponent 出现的问题
目录 CreatePrimitiveUniformBufferImmediateFLocalVertexFactory 默认构造函数GetTypeHashENQUEUE_RENDER_COMMANDnull resource entry in uniform buffer parameters FLocalVertexFactory 在看大象无形,其中关于静态物体网络绘制的代码出错的 bug 我也搞了一会………...
【docker】数据卷和数据卷容器
一、如何管理docker容器中的数据? 二、数据卷 1、数据卷原理 将容器内部的配置文件目录,挂载到宿主机指定目录下 数据卷默认会一直存在,即使容器被删除 宿主机和容器是两个不同的名称空间,如果想进行连接需要用ssh,…...
HTML——列表,表格,表单内容的讲解
文章目录 一、列表1.1无序(unorder)列表1.2 有序(order)列表1.3 定义列表 二、表格**2.1 基本的表格标签2.2 演示 三、表单3.1 form元素3.2 input元素3.2.1 单选按钮 3.3 selcet元素 基础部分点击: web基础 一、列表 …...
Mongodb学习
一、初步了解 1.1 Mongodb 是什么 MongoDB 是一个基于分布式文件存储的数据库,官方地址 https://www.mongodb.com/ 1.2 数据库是什么 数据库(DataBase)是按照数据结构来组织、存储和管理数据的 应用程序 1.3 数据库的作用 数据库的主要…...
2024届计算机毕业生福利来啦!Python毕业设计选题分享Django毕设选题大全Flask毕设选题最易过题目
💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…...
网络爬虫指南
一、定义 网络爬虫,是按照一定规则,自动抓取网页信息。爬虫的本质是模拟浏览器打开网页,从网页中获取我们想要的那部分数据。 二、Python为什么适合爬虫 Python相比与其他编程语言,如java,c#,Cÿ…...
9、媒体元素标签
9、媒体元素标签 一、视频元素 video标签 二、音频元素 audio标签 <!--音频和视频 video:视频标签 audio:音频标签 controls:控制选项,可以显示进度条 autoplay:自动播放 -->示例 <!DOCTYPE html> &…...
php单独使用think-rom数据库 | thinkphp手动关闭数据库连接
背景(think-orm2.0.61) 由于需要长时间运行一个php脚本,而运行过程并不是需要一直与数据库交互,但thinkphp主要是为web站点开发的框架,而站点一般都是数据获取完则进程结束,所以thinkphp没提供手动关闭数据…...
337. 打家劫舍 III
题目描述 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两…...
tio-websocket-spring-boot-starter的最简单实例,看完你一定有所收获
前言 我最近一个月一直在寻找能够快速开发实时通讯的简单好用的模块,所以我就去寻找了一下相关的内容.在此之前我使用的是Spring原生的webSocket,她有个弊端就是设置组不容易设置,而且配置上也稍微复杂一点,需要配置拦截器和处理器,还需要把它放入到Springboot的启动容器里面,也…...
列出连通集
输入样例: 8 6 0 7 0 1 2 0 4 1 2 4 3 5 输出样例: { 0 1 4 2 7 } { 3 5 } { 6 } { 0 1 2 7 4 } { 3 5 } { 6 } solution #include <stdio.h> #include <string.h> int arcs[10][10]; int visited[10] {0}; void DFS(int n, int v); void BFS(int n , int i)…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...
iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)
崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题,不一定会立刻崩,但一旦积累,就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能,而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...
