0

0

零知识证明的先进形式化验证:如何验证一条 ZK 指令

DDD

DDD

发布时间:2024-05-01 08:40:05

|

1161人浏览过

|

来源于ChainCatcher

转载

为了深入理解形式化验证技术是如何应用于 zkvm(零知识虚拟机)之上的,本文将聚焦于单条指令的验证。关于 zkp(零知识证明)先进形式化验证的总体情况,请查阅我们同期发布的「零知识证明区块链的先进形式化验证」文章。

什么是 ZK 指令的验证?

zkVM(零知识虚拟机)能够创建简短的证明对象,以作为证据来证明特定程序可以在某些输入上运行、并成功终止。在 Web3.0 领域,zkVM 的应用使得吞吐量变高,这是因为 L1 节点只需要验证智能合约从输入态到输出态转变过程的简短证明,而实际的合约代码执行则可以在链下完成。

zkVM 证明器首先会运行程序以生成每一步的执行记录,然后将执行记录的数据转换为一组数字表格(该过程被称为「算术化」)。这些数之间必须满足一组约束(即电路),其中包括了具体表单元格之间的联系方程、固定的常数、表间的数据库查找约束,以及每对相邻表行间所需要满足的多项式方程(亦即「门」)。链上验证可以由此确认的确存在某张能满足所有约束的表,同时又保证不会看到表中的具体数字。

每条 VM 指令的执行都面临很多这样的约束,这里我们将 VM 指令的这组约束简称为它的「ZK 指令」。下面是用 Rust 语言编写的一个 zkWasm 内存加载指令约束的示例。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

ZK 指令的形式化验证是通过对这些代码进行形式化推理来完成的,我们首先将其翻译成形式化语言。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

即便只有单个约束包含错误,攻击者都因此而有可能提交恶意的 ZK 证明。恶意证明所对应的数据表格并不对应智能合约的合法运行。与以太坊等非 ZK 链不同,后者有许多节点运行不同的 EVM(以太坊虚拟机)实现,从而不太可能在同时同地出现相同的错误,一个 zkVM 链则只有单一的 VM 实现。单就这个角度而言,ZK 链比传统的 Web3.0 系统更为脆弱。

更糟糕的是,和非 ZK 链不一样,由于 zkVM 交易的计算细节并没有被提交并存储在链上,在攻击发生后,不仅是要发现攻击的具体细节非常困难,甚至要识别攻击本身也会变得极具挑战性。

zkVM 系统需要极为严格的检视,不幸的是,zkVM 电路的正确性很难保证。

ZK 指令的验证为何很难?

VM(虚拟机)是 Web3.0 系统架构中最为复杂的部分之一。智能合约的强大功能是支撑 Web3.0 能力的核心,其力量源自于底层的 VM,它们既灵活又复杂:为了完成通用计算和存储任务,这些 VM 必须能够支持众多的指令和状态。比如,EVM 的 geth 实现需要超过 7500 行 Go 语言代码。类似的,约束这些指令执行的 ZK 电路也同样庞大而复杂。像在 zkWasm 项目中,ZK 电路的实现需要超过 6000 行 Rust 代码。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

zkWasm 电路架构

与专为特定应用(如私人支付)设计的 ZK 系统中使用的专用 ZK 电路相比,zkVM 电路的规模要大得多:其约束规则的数量可能比前者多出一到两个数量级,而其算术化表格则可能包括数百列、含有数以百万计的数字单元格。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

ZK 指令的验证意味着什么?

我们在这里想要去验证 zkWasm 中的 XOR 指令的正确性。从技术上讲,zkWasm 的执行表对应一个合法的 Wasm VM 执行序列。所以宏观来看,我们想要验证的是:每次执行这条指令总是会产生一个新的合法的 zkVM 状态:表中的每一行都对应 VM 的一个合法状态,而紧接着的一行则总是要通过执行相应的 VM 指令来生成。下图为 XOR 指令正确性的形式化定理。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

这里「state_rel i st」表明状态「st」是步骤「i」中智能合约的合法 zkVM 状态。 正如你可能猜测的那样,要证明「state_rel (i+1) …」不是轻而易举的。

如何验证 ZK 指令?

尽管 XOR 指令的计算语义很简单,就是计算两个整数的按位异或(bitwise xor)并返回整数结果,但它所涉及的方面却比较多:首先,它需要从栈内存中取出两个整数,进行异或计算,然后将这个计算得出的新整数存回同一个栈。此外,该指令的执行步骤应融入于整个智能合约的执行流程中,并且其执行顺序及时机必须正确。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

因此,XOR 指令的执行效果应该是从数据堆栈中弹出两个数,压入它们的 XOR 结果,同时增加程序计数器,以指向智能合约的下一条指令。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

不难看出,这里的正确性属性定义总体上与我们在验证传统字节码 VM(比如以太坊 L1 节点中的 EVM 解释器)的时候所面对的情况非常相似。它依赖于机器状态(这里指栈内存和执行流)的高级抽象定义,以及关于每条指令预期行为的定义(这里指算术逻辑)。

然而,如我们下面所将要看到的,由于 ZKP 和 zkVM 的特殊性,其正确性的验证过程经常与常规 VM 的验证很不一样。光是验证我们这里的单条指令,就要依赖于 zkWASM 中很多表的正确性:其中有一张用于限制数值大小的范围表,一张用于二进制位计算中间结果的位表(bit table),一张每行都存储恒定大小的 VM 状态的执行表(类似物理 CPU 中的寄存器和锁存器中的数据),以及代表动态可变大小的 VM 状态(内存、数据栈和调用栈)的内存表和跳转表。

第一步:栈内存

与传统 VM 类似,我们需要确保指令的两个整数参数可以从堆栈中读取,并且其异或结果值被正确地写回堆栈。堆栈的形式化表述看起来也相当熟悉(还有全局内存和堆内存,但 XOR 指令不使用它们)。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

zkVM 使用一种复杂的方案来表示动态数据,这是因为 ZK 证明器并不能原生支持像堆栈或数组这样的数据结构。相反的,对于压入堆栈的每个数值,内存表用单独的一行来记录,其中的某些列则用于指示该表项的生效时间。当然,这些表的数据可以被攻击者所控制,因此还必须加以一些约束,以确保表项真实对应于合约执行中的实际压栈指令。这是通过精心计算程序执行过程中的压栈次数来实现的。验证每一条指令时,我们需要确保这个计数始终正确。此外,我们还有一系列引理,将单条指令生成的约束与实现堆栈操作的表查找和时间范围检查相关联。从最顶层看,内存操作的计数约束定义如下。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

第二步:算术运算

与传统 VM 类似,我们希望确保位异或的运算正确无误。这看起来很容易,毕竟我们的物理计算机 CPU 都能够一次性完成这个操作。

但对于 zkVM 来说,这实际上并不简单。ZK 证明器原生支持的唯二算术指令是加法和乘法。为了进行二进制位运算,VM 使用了一个相当复杂的方案,其中一张表存放固定的字节级运算结果,另一张表则充当「草稿本」,用以在多个表行上展示如何将 64 位数字分解为 8 个字节,然后再重新组合出结果。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

zkWasm 位表规范的片段

在传统的编程语言中非常简单的异或运算,在这里则需要很多引理来验证这些辅助表的正确性。对于我们的指令,我们有:

零知识证明的先进形式化验证:如何验证一条 ZK 指令

第三步:执行流

与传统 VM 类似,我们需要确保程序计数器的数值正确更新。对于像 XOR 这样的顺序指令,每次执行步骤后,程序计数器需要加一。

由于 zkWasm 被设计用来运行 Wasm 代码,因此也要确保在整个执行过程中,Wasm 内存的不变性质始终得到保持。

传统的编程语言对布尔值、8 位整数、64 位整数等数据类型有原生支持,但在 ZK 电路中,变量始终是在大素数(≈ 2254)模下的整数范围内变化。由于 VM 通常以 64 位数运行,电路开发者需要使用一套约束系统来确保它们具有正确的数值范围,而形式化验证工程师则需要在整个验证过程中追踪关于这些范围的不变性质。对执行流和执行表的推理会涉及到所有的其他辅助表,因此我们需要检查所有表数据的范围是否正确。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

类似于内存操作数量管理的情形,zkVM 需要一组类似的引理来验证控制流。具体而言,每个调用和返回指令都需要使用调用栈。调用栈使用与数据栈类似的表方案来实现。对于 XOR 指令,我们并不需要修改调用栈;但验证整条指令时,仍然需要追踪并验证控制流操作计数是否正确。

零知识证明的先进形式化验证:如何验证一条 ZK 指令验证这条指令

让我们将所有步骤整合起来,验证 zkWasm XOR 指令的端到端正确性定理。以下验证是在交互式证明环境中完成的,其中每一个形式化构造和逻辑推理步骤都经过了最严格的机器检查。

零知识证明的先进形式化验证:如何验证一条 ZK 指令

如上所见,形式化验证 zkVM 电路是可行的。但这是一项艰巨的任务,需要理解和追踪很多复杂的不变性质。这反映了被验证软件本身的复杂性:验证中所涉及的每一条引理都需要得到电路开发者的正确处理。鉴于其中的风险很高,让它们由形式化验证系统进行机器检验,而不是仅仅依靠小心谨慎的人工审查,是非常有价值的。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全

C++系统编程中的内存管理是指 对程序运行时内存的申请、使用和释放进行精细控制的机制,涵盖了栈、堆、静态区等不同区域,开发者需要通过new/delete、智能指针或内存池等方式管理动态内存,以避免内存泄漏、野指针等问题,确保程序高效稳定运行。它核心在于开发者对低层内存有完全控制权,带来灵活性,但也伴随高责任,是C++性能优化的关键。

10

2025.12.22

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

539

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

21

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

28

2026.01.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

397

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

go语言基础与基本函数
go语言基础与基本函数

共17课时 | 3.1万人学习

Css3入门视频教程
Css3入门视频教程

共21课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号