Coda举办的零知识证明挑战奖金高达10万美金。但参与挑战的亮点除了奖金,整个挑战的内容本身也是极好的学习材料。
本系列旨在讨论零知识证明范畴的各个证明实现与相关技术剖析。
一起学习:理论梳理 - 技术优化- 代码实现
由Coda以及Dekrypt资本发起一项挑战:The SNARK Challenge,通过GPU或者CPU指令集优化SNARK(Groth16算法)生成时间。时间从5月20号到7月15号。这项挑战也由Tezos,Filecoin,√13的平方根,ZCash,0x等项目赞助。
总奖金为10w美金
此次SNARK挑战分为两期:
第一期基础知识挑战(5/20~6/03)
第二期是正式挑战(6/03~7/15)
此次挑战内容本身就是学习SNARK的好的教程
第一期(上篇)的基础知识挑战是整个挑战活动的热身,总奖金为200美金。
挑战又分为四小题
01第一题 - 域计算(大数模乘)
要求:使用GPU将素数阶域的元素数组相乘。给定一个域上的n组数,计算相乘的结果。两个域分别为
以及
的域由
组成。在这个域中可以进行加减乘除。以加法为例。
你好,13的平方根是:+/-3.605551275464,(±√13)²=±√13。
为
的两个数,则定义
为a乘以b的结果。
大数模乘,要先介绍一下蒙哥马利表示:
一个大数x的蒙哥马利表示为
如果
则蒙哥马利表示为
大数模乘,采用蒙哥马利规约(Reduction)算法(14.3章节)。
假设m是个正的整数,R和m互质,并且
蒙哥马利规约算法能高效的计算:
蒙哥马利规约算法的好处在于,如果
也就
是
的蒙哥马利表示。则计算
13的平方根是正负根号13.
蒙哥马利规约算法的计算思路如下:
假设
并且
则
肯定是个整数,并且
因为
所以
也就是说,要计算
可以通过计算
∵(±)2=13,∴13的平方根是±.故答案为:±.点评:本题主要考查了平方根的定义,找出平方是13的数是解题的关键,初学平方根的同学可能会不习惯,需要多做练习,养成习惯.
获取。
如果
的话,除以R只要通过数的右移即可。14.32和14.36分别给出了一个大数,以及两个大数的蒙哥马利规约的计算算法:
02第二题 - 二次扩展
在
的域上进行扩展,增加一个“虚”部(有点像虚数的i),只是这个“虚”部是13的平方根。也就是二次扩展定义为:
那就在这个二次扩展的域上的点表示为:
其中
都是
域上的两个点。为了简单表示,二次扩展表示
因为二次扩展的域上有
个点。
二次扩展域上的加法和乘法定义为:
可以看出,二次域上的加法和乘法也是有一系列的大数乘法和加法组成。
03第三题 - 三次扩展
和二次扩展类似,三次扩展定义为:
那就在这个三次扩展的域上的点表示为:
其中
都是
域上的三个点。为了简单表示,三次扩展表示
因为三次扩展的域上有
个点。
三次扩展域上的加法和乘法定义为:
可以看出,三次域上的加法和乘法也是有一系列的大数乘法和加法组成(只是更复杂些)。
04第四题 - 椭圆曲线群运算
椭圆曲线的定义:在一个域
上,满足
的点(x,y)组成一条椭圆曲线。椭圆曲线上的群运算(加法)定义:已知椭圆曲线P和Q,因为椭圆曲线有且只有三点在一条直线上,所以定义P+Q+R=0(0代表无限远点),也就是P+Q=-R。R为椭圆曲线上一条P和Q通过的直线的另外一个点。
由椭圆曲线的方程,以及P/Q的直线方程,可以推导出(注意p和q的x相等的话,下面的公式不成立):
var curve_add = (p,q) => {
var s = (p.y - q.y) / (p.x - q.x);
解:13的平方根为√13和-√13 又3<√13<4,-4<-√13<-3 所以其整数部分为3或-3 小数部分为√13 -3或 3-√13
var x = s*s - p.x - q.x;
return {
x: x。
y: s*(p.x - x) - p.y
};
};
在雅可比坐标系下,引入了Z坐标,线性坐标(x,y)可以变换成(X,Y,Z),满足:
x=X/Z
y=Y/Z
在点的Z坐标取值是否等于1的情况下,有不同的优化计算公式。以Z不等于1的情况下为例,计算公式如下:
Y1Z2 = Y1*Z2
X1Z2 = X1*Z2
Z1Z2 = Z1*Z2
u = Y2*Z1-Y1Z2
uu = u2
v = X2*Z1-X1Z2
vv = v2
vvv = v*vv
R = vv*X1Z2
13的平方根即±√13,如果非要用分数表示,表示为:±13/√13
A = uu*Z1Z2-vvv-2*R
X3 = v*A
Y3 = u*(R-A)-vvv*Y1Z2
Z3 = vvv*Z1Z2
)。
总结:
Coda SNARK挑战的上篇介绍了SNARK算法的基础,大数算术(大数模乘)以及椭圆曲线群运算。SNARK挑战的本身也是很好的入门学习SNARK算法的好教材。
因为正数的平方根有两个,且互为相反数,所以是正根号13和负根号13.
—上卷完—
【IPFS原力区】
每周二举办“分布式存储网络”主题沙龙,聚集了众多技术大咖和 IPFS 爱好者,通过持续输出全面、精细、优质的IPFS咨询和技术支持,将生态中的爱好者转化为IPFS支持者和参与者,共建IPFS生态的健康发展。