dusk-plonk电路构建核心解析:Composer、Witness与约束系统概念全解

发布时间:2026/10/28 6:15:28

dusk-plonk电路构建核心解析:Composer、Witness与约束系统概念全解 dusk-plonk电路构建核心解析Composer、Witness与约束系统概念全解【免费下载链接】plonkPure Rust implementation of the PLONK ZKProof System done by the Dusk team项目地址: https://gitcode.com/gh_mirrors/plo/plonkdusk-plonk 是 Dusk 团队用纯 Rust 实现的 PLONK 零知识证明ZKProof系统运行在 BLS12-381 曲线之上内置 KZG10 多项式承诺方案。要在这个库里搭电路、写证明绕不开的三大核心概念就是Composer电路构建器、Witness witness 变量和约束系统Constraint System。本文用尽量少的代码带你一次性把这三者的职责和关系讲清楚帮你快速上手 PLONK 电路构建。一张图看懂 dusk-plonk 的核心流程在深入细节之前先记住这条主线出自项目架构约定 CLAUDE.mdCircuit电路定义 → Composer约束系统 Witness 分配 → Compiler编译 → ProverKey / VerifierKey证明/验证密钥 → Proof证明→ Verify验证阶段核心类型职责电路定义Circuittrait声明要证明什么电路构建Composer分配 witness、追加 gate 约束编译Compiler生成 Prover / Verifier证明与验证Proof生成并校验零知识证明所有公开入口都集中在 prelude 模块中见 src/prelude.rs日常只需要use dusk_plonk::prelude::*就能拿到Composer、Witness、Constraint、Compiler等全部主力类型。Composer电路构建的总指挥Composer是整个约束系统的工地现场定义在 src/composer.rs 中。它内部维护了五样东西constraints: VecGate—— 所有已追加的门约束行witnesses: VecBlsScalar—— 所有 witness 的实际取值public_inputs—— 稀疏存储的公共输入行号 → 值perm—— 置换参数permutation用于 PLONK 的连线证明runtime—— 调试运行时输出 CDF 事件初始化为什么第一个 Composer 不是空的调用Composer::initialized()时系统会自动做三件事分配第 0 号 witness 为0、第 1 号 witness 为1见 src/composer.rs 中的ZERO/ONE常量这是 turbo composer 的硬性约定任何电路的 wire 0、wire 1 永远是零和一用断言把0、1这两个常量钉死在电路里防止被恶意 prover 篡改追加两个 dummy gate见append_dummy_gates防止 witness 多项式退化为零多项式、防止置换退化为恒等置换——这是 PLONK 完备性的关键细节。所以一个空电路其实已经有 4 个约束了。之后你再调用composer.constraints()统计大小时要记得把这部分算进去。常用构建 API 速查方法作用append_witness(x)分配一个新的私有 witness返回Witness索引append_public(x)分配 witness 并追加一个 gate将其标记为公共输入append_constant(x)分配 witness 并断言它等于常量 xgate_add(s)/gate_mul(s)追加一行算术 gate 并自动算出输出 witnessassert_equal(a, b)追加 gate 约束 a bassert_equal_constant(a, c, p)约束 a c可选携带公共输入 pcomponent_range_bits::N(a)范围约束证明 a 是一个 N 位数一个典型的加法约束长这样来自示例 examples/circuit.rslet constraint Constraint::new() .left(1) .right(1) .a(a) .b(b) .constant(BlsScalar::from(42)); let result composer.gate_add(constraint);gate_add的内部逻辑是把q_O设为 -1求解c q_L·a q_R·b q_F·d q_C PI把c作为新 witness 追加进电路再追加一行 gate见append_evaluated_output实现。注意源码里的注释特别强调这一行 gate 就是健全性边界——少了它恶意 prover 就能悄悄替换输出值。Witness电路里的变量盒Witness定义在 src/composer/constraint_system/witness.rs。它本身非常简单——只封装了一个索引pub struct Witness { index: usize }可以把它理解为电路中的接线端子你手里拿到的不是数值本身而是一个指向witnesses数组的号码牌。真正的值由 prover 在证明时填入由约束保证它必须正确。两个内置常量值得记住Witness::ZERO索引 0和Witness::ONE索引 1——对应初始化时钉死的 0 和 1Witness的Default值就是ZERO。每个 gate 有 4 根 wire左 a、右 b、输出 c、第四 dwire 属于哪个 gate 由WireData枚举Left(n)/Right(n)/Output(n)/Fourth(n)描述。置换参数perm正是靠追踪这些 wire 的流向来保证上一行的输出接到下一行的输入这一布线正确性。约束系统与 Gate一行多项式评估这是三件套中最数学的一环。核心类型有两个都在 src/composer/constraint_system/constraint.rsConstraint约束的草稿Constraint是一个 12 个系数 4 个 witness 槽位的结构体通过链式方法配置mult(1).left(1).a(x).b(y)等。系数通过Selector枚举寻址常见的外部选择器有Selector符号含义Multiplicationq_M乘积项系数Left/Rightq_L / q_R左、右 wire 系数Outputq_O输出 wire 系数Fourthq_F第四 wireadvice系数Constantq_C常数项PublicInputPI公共输入项剩下的Arithmetic、Range、Logic、GroupAddFixedBase、GroupAddVariableBase是 dusk-plonk 特有的内部选择器用来区分普通算术 gate 与 range/logic/ECC 加速 gate——这也是它相比标准 PLONK 的自定义门优化所在完整规格见 docs/dusk-plonk-specs.pdf。Gate约束的成品Composer::append_gate会把Constraint固化成一个Gate定义在 src/composer/gate.rs。算术 gate 强制执行的等式是q_M·a·b q_L·a q_R·b q_O·c q_F·d q_C PI 0所有 Gate 按行排成一列就是整条电路。每一列 wirea/b/c/d构成一个 witness 多项式配合 KZG10 承诺见 src/commitment_scheme/kzg10/和 FFTsrc/fft/最终被打包成 PLONK 证明。从示例电路串联三大概念回到 examples/circuit.rs 中的TestCircuit它证明了五件事a 2^6、b 2^4、a b 42 cc 为公共输入、a·b d 42、以及一次 JubJub 曲线上的标量乘法。整个circuit方法就是三大概念的完整演练分配 Witnesscomposer.append_witness(self.a)拿到a的端子加约束component_range_bits::6(a)用一组 gate 锁住 a 的位宽gate_addassert_equal完成加法暴露公共输入composer.append_public(self.c)让验证者无需信任 prover 就知道 c 的值。证明与验证只需三行Compiler::compile::TestCircuit(pp, label)生成 prover/verifierprover.prove(mut rng, circuit)产出Proofverifier.verify(proof, public_inputs)收尾。调试与进阶让电路构建更透明CDF 调试器开启debugfeature 后运行时事件witness 分配、约束追加会输出到 CDF 文件路径由CDF_OUTPUT环境变量指定实现位于 src/debugger.rs方便你逐行分析 gate 构成电路压缩Circuit::compress()可以把电路序列化为字节串之后直接编译而无需重跑电路定义适合嵌入式场景正确性测试tests/ 目录按功能拆分了boolean、range、logic、ecc等集成测试是理解每类 gate 行为的最好教材性能参考README 给出的基准是 2^16 约束规模下证明约 7.9 秒、验证约 2.8 毫秒验证时间与电路规模无关跑测试记得加--releasedebug 模式可能慢上百倍。总结三句话记住 dusk-plonk 的电路构建概念一句话定位关键文件Composer电路工地分配变量、追加 gate 的总指挥src/composer.rsWitness变量端子索引即身份0/1 号永远钉死src/composer/constraint_system/witness.rs约束系统每行 gate 是一个多项式等式整体构成电路src/composer/constraint_system/constraint.rs抓住Circuit → Composer → Compiler → Proof这条主线再对照 examples/circuit.rs 动手改一改你就能快速从读懂 dusk-plonk过渡到用 dusk-plonk 写自己的零知识电路。【免费下载链接】plonkPure Rust implementation of the PLONK ZKProof System done by the Dusk team项目地址: https://gitcode.com/gh_mirrors/plo/plonk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/24 21:28:33

Java全栈工程师面试核心考察与准备指南

1. Java全栈工程师面试的核心考察维度作为经历过上百场技术面试的面试官,我发现Java全栈岗位的考察体系已经形成相对固定的模式。不同于单一方向的岗位,全栈工程师的面试往往采用"广度深度"的复合考察方式。具体来说主要分为五个核心维度&…

2026/10/26 1:00:03

Java 17与Spring AI技术解析及大厂面试实战

1. 项目概述:大厂技术栈深度解析与面试实战最近在准备顶级科技公司的技术面试时,我发现Java 17、Spring AI、RAG架构和Agent系统这四大技术栈频繁出现在面试题目中。这些技术不仅代表了当前企业级开发的最前沿,更是考察候选人综合能力的重要维…

2026/10/28 6:13:02

AI模型推理性能优化:计算、内存与框架调优实战

1. AI模型推理性能瓶颈的本质剖析在AI工程实践中,模型推理阶段往往会遇到三类典型瓶颈:计算资源受限、内存带宽不足和框架调度低效。以ResNet-50为例,当输入尺寸为224224时,单个样本的推理过程需要约4G FLOPs的计算量。若部署在配…

2026/10/28 6:13:02

数据迁移备份一体机实战:选型、架构、部署与故障排查全解析

数据迁移备份一体机这个品类,我在几个不同规模的项目里都实际落地过,从早期用纯软件方案拼凑,到后来上专用一体机设备,中间踩的坑能写满一个笔记本。很多团队一听到“企业级数据保护”就觉得是买台设备插上网线的事,真…

2026/10/28 6:13:02

YOLOv8杯子检测系统:从数据标注到模型部署全流程

1. 项目概述:基于YOLOv8的杯子检测系统全流程实现这个项目完整实现了从数据标注到模型部署的杯子检测全流程解决方案。作为一名长期从事计算机视觉开发的工程师,我深知目标检测项目落地过程中各个环节的痛点——数据标注费时费力、模型训练门槛高、部署环…

2026/10/28 6:13:02

Agent-Reach实践:智能体触达治理与可观测性平台落地

接手“Agent-Reach”这个项目的时候,我其实刚啃完上一轮Agent平台治理的硬骨头,人还没缓过来。但一看这两个单词组合在一起——“Agent”加“Reach”,我心里大概就有数了:这不是单纯做一个Agent,而是要解决Agent的“覆…

2026/10/28 6:13:02

400电话与CRM对接实战:呼叫链路、来电弹屏与通话数据回写

1. 打通之前先想清楚:400 电话与 CRM 的对接到底在解决什么问题做过企业通信和销售管理系统的朋友大概都有体会:400 电话本身只是一个号码接入服务,真正让它产生业务价值的,是它和 CRM 之间的数据流转。很多公司早期的情况是&…

2026/10/28 6:08:02

Cloudflare Workers 构建类操作系统服务架构

1. 这不是操作系统,是用 Cloudflare Workers 模拟 OS 行为的工程实践 “cloudflare-os”这个标题一出来,很多人第一反应是:Cloudflare 出操作系统了?小米澎湃OS、OpenHarmony、飞牛OS 刚刷完机,又来个新 OS&#xff1…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑