零知识证明-ZK-SNARKs基础(七)

2024-09-05 23:36
文章标签 基础 知识 证明 zk snarks

本文主要是介绍零知识证明-ZK-SNARKs基础(七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言
这章主要讲述ZK-SNARKs 所用到的算术电路、R1CS、QAP等

1:算术电路
算术运算电路
1>半加器:实现半加运算的逻辑电路
2>全加器:能进行被加数,加数和来自低位的进位信号相加,并根据求和结果给出该位的进位信号
说明:2进制加,低位进位 相当于 结果S为 = A+B+C(地位进位)
高位进位 = A+B+C(地位进位) 三个中 有最少2个为1 高位就有进位了
在这里插入图片描述
【1】 方程转算术电路
电路实现参考 https://blog.csdn.net/qq_34793644/article/details/121146036
这里以程序角度去讲解
eg: x3 + x + 5 == 35

// Signal Definition:
// 1、所有的输入都是信号
// 2、每次将两个信号相乘时,都需要定义一个新的信号
// 3、一次只能占用两个信号来获取一个新的信号
// 4、所有的输出都是信号

sym1 = X * X
sym2 = sym1 * X
sym3 = sym2 + X
OUT = sym3 +5

约束 = 4 (上面共4条)

s={ONE,X,OUT,sym1,sym2,sym3} 一共6个 变量
m 为变量数(还需要加个ONE,所以为m+1)
在这里插入图片描述

【2】电路转换成R1CS(Rand-1 Constraint System)
表示计算式的电路转化为向量点积(内积)的形式,即一阶约束系统(Rank-1 Constraint System, R1CS)。R1CS是由三个向量(a, b, c)组成的序列,R1CS的解是一个向量s,其中s必须满足方程
s . a * s . b - s . c = 0

其中 . 代表内积运算。
对于每个门电路,需要定义一组向量(l, r, o),通过向量内积运算使得s∙l×s∙r-s∙o=0,其中s代表全部输入组成的向量,即s=[one, x,y,sym1,C](元素排列没有固定顺序),one表示值为1的虚拟变量
//有效的 R1CS 必须每个约束(在 R1CS 中的一行,在 Circom 中 <==)只有一个乘法。
//如果我们尝试做两个(或更多)乘法,
//这将失败。所有具有多个乘法的约束都需要拆分为两个约束
运算过程如下(手算步骤)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把一个解代入 得到 S 的列所有的值 这里 根是 3 , one 固定值
在这里插入图片描述
演算过程参考了 https://blog.csdn.net/jambeau/article/details/121175433

最后 A B C
A
[0, 1, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0]
[0, 1, 0, 0, 1, 0]
[5, 0, 0, 0, 0, 1]

B
[0, 1, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0]

C
[0, 0, 0, 1, 0, 0]
[0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 1]
[0, 0, 1, 0, 0, 0]

【3】R1CS 到 QAP
拉格朗日插值法
参考 https://www.bilibili.com/read/cv22217905/
先说插值法。插值法是做什么用的?插值法是通过已知点,求过这些点的未知函数的数学方法。
所以我们输入的,是一堆点,也就是一堆x和一堆y。
我们想要得到的,是一个函数,这个函数能完美的通过这一堆x和这一堆y。
那你要怎么解决这个问题呢?说白了很简单,就是一个开开关的问题。
这就是拉格朗日插值法的想法。

基本公式
P(X) = y0 *  L0(X) + y1 *  L1(X)
参考别人的 https://www.bilibili.com/read/cv22217905/
在这里插入图片描述
P(x) = P(x0)+P(x1)+P(x2) //X 下标从0 开始
L2(x)=l0(x)f(x0)+l1(x)f(x1)+l2(x)f(x2)

eg: 一个多项式经过(1,3),(2,2)和(3,4) ,求多项式
在这里插入图片描述
也可以用牛顿插值法 参考 https://www.bilibili.com/read/cv22217905/

现在我们要将四个长度为六的三向量组转化为六组多项式,每组多项式包括三个三阶多项式,我们在每个 x 点处来评估不同的约束,在这里,我们共有四个约束,因此我们分别用多项式在 x = 1,2,3,4 处来评估这四个向量组。
现在我们使用拉格朗日差值公式来将 R1CS 转化为 QAP 形式。我们先求出四个约束所对应的每个 a 向量的第一个值的多项式,也就是说使用拉格朗日插值定理求过点 (1,0), (2,0), (3,0), (4,0) 的多项式,类似的我们可以求出其余的四个约束所对应的每个向量的第i个值的多项式
结果如下
A polynomials
[-5.0, 9.166, -5.0, 0.833]
[8.0, -11.333, 5.0, -0.666]
[0.0, 0.0, 0.0, 0.0]
[-6.0, 9.5, -4.0, 0.5]
[4.0, -7.0, 3.5, -0.5]
[-1.0, 1.833, -1.0, 0.166]

B polynomials
[3.0, -5.166, 2.5, -0.333]
[-2.0, 5.166, -2.5, 0.333]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]

C polynomials
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[-1.0, 1.833, -1.0, 0.166]
[4.0, -4.333, 1.5, -0.166]
[-6.0, 9.5, -4.0, 0.5]
[4.0, -7.0, 3.5, -0.5]

怎么算的呢这里以A 为例(参考 https://blog.csdn.net/smilejiasmile/article/details/122664331)
多项式在 x = 1,2,3,4 处来评估这四个向量组 (这个就是假设 x 过1,2,3,4点,你也可以用其他的点)
A
[0, 1, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0]
[0, 1, 0, 0, 1, 0]
[5, 0, 0, 0, 0, 1]
那么点就是 (1,y0), (2,y1), (3,y2), (4,y3) 因为 假设的 x 过1,2,3,4点
把A的第一列 4个数字带入 y 得
(1,0), (2,0), (3,0), (4,5)

再用拉格朗日插值法求多项式在这里插入图片描述同理 可以算出 A得第2列…第N列
同理 也可以算出 B,C 的第1列 …第N列

0.833 * x3 - 5 * x2 + 9.166 * x - 5 = -5 + 9.166 * x + 5 * x2 + 0.833 * x3
[-5.0, 9.166, -5.0, 0.833] 系数是升序排序的即 a+b X+ c X2 + d X3 (a b c d为系数)

最后得

A polynomials
[-5.0, 9.166, -5.0, 0.833]
[8.0, -11.333, 5.0, -0.666]
[0.0, 0.0, 0.0, 0.0]
[-6.0, 9.5, -4.0, 0.5]
[4.0, -7.0, 3.5, -0.5]
[-1.0, 1.833, -1.0, 0.166]

B polynomials
[3.0, -5.166, 2.5, -0.333]
[-2.0, 5.166, -2.5, 0.333]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]

C polynomials
[0.0, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[-1.0, 1.833, -1.0, 0.166]
[4.0, -4.333, 1.5, -0.166]
[-6.0, 9.5, -4.0, 0.5]
[4.0, -7.0, 3.5, -0.5]

抄下别人的
在这里插入图片描述
演示:
A1(x) * B1(x)-C1(x)= 0
A1(x) = [-5.0, 9.166, -5.0, 0.833] = -5 + 9.166 * X -5.0 * X2 + 0.833 * X3
B1(x) = [3.0, -5.166, 2.5, -0.333] = 3.0 - 5.166 * X +2.5 * X2 - 0.333 * X3
C1(x) = [0.0, 0.0, 0.0, 0.0] = 0 + 0 * X +0 * X2 + 0* X3 = 0

当 X = 1 时
A1(x) = -5 + 9.166 * X -5.0 * X2 + 0.833 * X3 = -5+9.166 -5+0.833 = 0
B1(x) = 3.0 - 5.166 * X +2.5 * X2 - 0.333 * X3 = 3.0 -5.166 +2.5 -0.333 = 0
当x = 2时
A1(x) = -5 + 9.166 * X -5.0 * X2 + 0.833 * X3 = -5+9.166 * 2 -5 * 22+0.833 * 23 = -5+18.332-20+6.664 = 0
B1(x) = 3.0 - 5.166 * X +2.5 * X2 - 0.333 * X3 =3.0- 5.166 * 2+2.5 * 22 -0.333 * 23 = 3.0 -10.332+10-2.664 = 0

同理 X=2 也可以计算出来
最后返现 A(x) * B(x) - C(x) = 0 #当X =(1,2,3,4)j就是假设 X通过的点

最后也抄下别人的,难打字画图了(参考 https://blog.csdn.net/smilejiasmile/article/details/122664331)
在这里插入图片描述

Circom snarkjs 都有相应的程序库,有空讲述下用程序实现

如果觉得有用,麻烦点个赞,加个收藏

这篇关于零知识证明-ZK-SNARKs基础(七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140376

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

c++基础版

c++基础版 Windows环境搭建第一个C++程序c++程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针数组函数无返回值函数和void类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是