Cointime

扫码下载App
iOS & Android

Round 3-5 原理与代码讲解

项目方

由 EthStorage 特别赞助,Antalpha Labs 与 706 Creators 联合举办的 ZKP 零知识证明共学正顺利开展,大家踊跃讨论,互相帮助,积极主动分享—— 本篇文章就是由热心共学小伙伴 keep 带来关于 python 实现 PLONK 协议的讲解。

在 PLONK 协议中,Round 1 ~ 2 分别是对算术约束和复制约束的承诺,相对容易理解;在 Round 3 ~ 5 中,则主要是把门约束和门之间的一致性约束组合到一起,形成一个超大的多项式承诺。

1. 点值形式多项式的加法和乘法

有两个函数 f(x), g(x) ,  其系数形式如下:

其点值形式表示如下:

1.1 多项式加法

采用系数形式相加,容易得到 $f(x)+g(x)= 2x^2+1$。

采用点值形式相加,将相同 x 坐标对应的 y 值相加,得到:

不难看出,采用点值表示的多项式相加只要 将相同 x 坐标对应的 y 值相加即可,且结果与系数形式等价。

1.2 多项式乘法

采用系数形式相乘, 容易得到 $f(x)* g(x)= x^4+x^2$。

采用点值形式相乘,将相同 x 坐标对应的 y 值相乘,得到:

不难看出,采用点值表示的多项式相乘只要 将相同 x 坐标对应的 y 值相乘即可,且结果与系数形式等价。

2. Round3 Coset Operation

fft_extend/to_coset_extended_lagrange 的作用

  1. 将多项式的点值形式先转换为系数形式
  2. 再在系数形式后面补上 3* order 个 0,产生的多项式如下,然后再将系数多项式经过 fft 变成点值形式返回:
def to_coset_extended_lagrange(self, offset):        assert self.basis == Basis.LAGRANGE        group_order = len(self.values)        x_powers = self.ifft().values  # step1: 将多项式的点值形式通过 ifft 转换成系数形式 (f(x) = a_0+ a_1*x + a_2*x^2 + a_3*x^3 + ...+a_[order-1]*x^(order-1)        x_powers = [(offset**i * x) for i, x in enumerate(x_powers)] + [Scalar(0)] * (            group_order * 3        ) # step2: 将多项式表示为 f'(x) = a_0 + a_1*(offset *x) + a_2*(offsset*x)^2 + a_3*(offsset*x)^3 + ... +a_[order-1] * (offset *x)^(order-1) + 0*x^(order) +....+ 0*x^(4*order-1)        return Polynomial(x_powers, Basis.MONOMIAL).fft()  # 返回的结果用点值形式表示

对于

的多项式,假设 offset=1,扩展后的多项式满足

。简单的理解,就是将横坐标

映射到

def coset_extended_lagrange_test():    lagrange_poly = Polynomial(        # TODO(keep), 采用点值法表示,w =19540430494807482326159819597004422086093766032135589407132600596362845576832, 多项式点的坐标分别为 (w^0,1),(w^1,2),(w^2,3),....(w^7,8)        list(map(Scalar, [1, 2, 3, 4, 5, 6, 7, 8])), Basis.LAGRANGE         )    #原始多项式的点值表示:[1, 2, 3, 4, 5, 6, 7, 8]    print(f"original lagrange poly:{lagrange_poly.values}")    #原始多项式的系数表示:[10944121435919637611123202872628637544274182200208017171849102093287904247813, 16407567355707715082381689537916387329395994555403796510305004205827931381005, 21888242871839275220042445260109153167277707414472061641729655619866599103259, 16407567355707715086789610508212631171937308527291741914242101339246350165720, 10944121435919637611123202872628637544274182200208017171849102093287904247808, 5480675516131560135456795237044643916611055873124292429456102847329458329896, 2203960485148121921270656985943972701968548566709209392357, 5480675516131560139864716207340887759152369845012237833393199980747877114611]    print(f"original coeff poly:{lagrange_poly.ifft().values}")    #offset=1, 4 倍扩展后的多项式的点值表示,注意在 1/4/8/..的位置上值分别为 1/2/3... :[1, 10720100502214316017824502944044954065324060999235831025903844423091840349399, 9455244345631016631523862383826656817909262240618707851288319855253023724499, 2154739387933033111708037291544134707206872172371185076448386251812704236397, 2, 16557012320615716805371654510058109663243542056334255754346494402848129196434, 10961351032263120273117550959237409754492768732192557560880754261368126052155, 18363557546045068101357792595864568178482043948267994234220586583038506555553, 3, 6786126665617168635281695348901695604305505508243066572076512701156119512476, 12432998526208258595130464331726862113180416131685271896346981464741203555842, 17583891563112296716989958068669721717716064856305856073868243673723776631415, 4, 15235092695697612903221424418341788996225933052563558331936298540020231085964, 8526477789819225339470181130720054257555649678225561659213114114555273578202, 5748412396315429947679827564037304002141735973269128964907214524925412184424, 5, 8063712871896466710084708497040886506504371635794542014797783122244927830807, 12432998526208258595130464331726862113180416131685271896346981464741203555842, 6384725622872180445960462185068028976157210952995327774999033041321834967027, 6, 7423125919204651450688116196486815080908642277508115891487414498838949167610, 10961351032263120273117550959237409754492768732192557560880754261368126052155, 9959267747632339428749389803973233433288807182891237168523575569690515042210, 7, 1013927586174909651228671251775444917323622993703484604051271120508846640523, 9455244345631016631523862383826656817909262240618707851288319855253023724499, 12991963608384419706057798792240747034085871118455836070949939695446237712242, 8, 21753872925936258715284849814379405520357779078281283180193197937594190199291, 13327305889333084549971686500727188725472913714445501098547591469023253739310, 14366413615062333430482356679631362305114851397107572010875837406344246653236]    lagrange_coset_poly= lagrange_poly.to_coset_extended_lagrange(Scalar(1))    print(f"lagrange_coset_poly, offset=1:{lagrange_coset_poly.values}")    #offset=3, 4倍扩展后的多项式的点值表示,:[20675515612179202962216070186424682162618199731614332091699429061672282694725, 12176233492423905554052088791734959941094267405154917767703273057334496166085, 5917415089377289121590408955785178409647352913589873293489444488775637989917, 2752516302388842277837843623414582965521620079164918619152523122629779608930, 4169562684247585045898683445974163076520306259872602444382940816087435294801, 405974129629722533167980246725276196790448647122578773059926554710976033469, 16015793353021219580113202927438566307249046400631465629394870428808273269385, 10229243472545473685325496616621056338434159122035619201636505490363604037700, 4169562684247576371110213902966280955214409584396047496175782248639266976338, 5253968865549839538799666481628166409324748755474067887542850034795390306731, 5448982845895345419151791205795466600592293409442070602404591982746410109803, 6744796520889898167112801401869255476407161332739834968662727069566758151892, 1212727259660075433733434172128159555676224428122393086708711186165050793241, 322967646151623184877638486520441134119498412968113624552408193959018243483, 18024183386365665400514884144185330956959959158139700997404651630096754818232, 19482052846986908588806741073994758113640633859705256434234817575288965077623, 1212727259660075433733434172128159555676224428122393086708711186165050794882, 15659316895809636090874968052002070000216252850695980391535423378600348077893, 18315716487236118541742198333943662698829243458507744564312431379090458965882, 10510595262562575074793025571744230189431857025973620441791605645111860961441, 17718680187591687002644623685987545382281998381222741064605327309226848205368, 20159325449435371029217238441388109380740194409091738508163099259089186272494, 18587891620308261463443330180410826574514602508103652153546608225475836828557, 394344664035779568888350307535643007895240871168234908270745822756040235999, 17718680187591695677433093228995427503587895056699296012812485876675016525145, 18932442747777939648604146512737863718784200643866598521373172345132630858224, 14094371321169798076091610182981744959720702465139535664999676136322953049480, 18314296007598656137037071170514820954670799413013319519063761129019823716627, 20675515612179202962216070186424682162618199731614332091699429061672282698004, 14642742260579063309391895968292213573123846477290141900862663922681188024125, 13036860255822678508584602795745598935228621688526128812938746661562717446865, 19125126410348967389184293215334753308191985897863333281980130891566402192292]    lagrange_coset_poly= lagrange_poly.to_coset_extended_lagrange(Scalar(3))    print(f"lagrange_coset_poly, offset =3 :{lagrange_coset_poly.values}")    #offset =3, 消除4倍扩展后,多项式的系数表示,前8项系数不为0,剩余部分的系数均为0:[10944121435919637611123202872628637544274182200208017171849102093287904247813, 16407567355707715082381689537916387329395994555403796510305004205827931381005, 21888242871839275220042445260109153167277707414472061641729655619866599103259, 16407567355707715086789610508212631171937308527291741914242101339246350165720, 10944121435919637611123202872628637544274182200208017171849102093287904247808, 5480675516131560135456795237044643916611055873124292429456102847329458329896, 2203960485148121921270656985943972701968548566709209392357, 5480675516131560139864716207340887759152369845012237833393199980747877114611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]    # 前8项系数与原始多项式的系数相同。    coeff_coset_poly1 = lagrange_coset_poly.coset_extended_lagrange_to_coeffs(Scalar(3))    print(f"coeff_coset_poly, offset =3:{coeff_coset_poly1.values}")

3. Round3 扩展 ZH(x)

如果 offset =1,ZH 扩展后的多项式在

处的值都是 0,考虑到 ZH(x) 是计算商多项式的分母 ( 见下图 ), 为了使 ZH(x) 不为 0,因此取 offset != 1,可以简单的理解为取横坐标=

4. Round5 计算 r(x)

5. Round5 计算 q(x)

评论

所有评论

推荐阅读

  • 智谱预告GLM-5.1将开源

    据 1M AI News 监测,智谱 Z.ai 全球负责人李子玄在 X 上发文:「Don't panic. GLM-5.1 will be open source.」(别慌,GLM-5.1 将会开源。)未透露发布时间及模型细节。

  • Claude Code上线云端定时任务:自动审PR、升级依赖,无需本地运行

    据 1M AI News 监测,Anthropic 旗下 AI 编程工具 Claude Code 新增云端定时任务功能。用户可指定代码仓库、执行计划和提示词,Claude 将通过云端基础设施按计划自动执行,无需保持本地 Claude Code 运行。从产品界面看,用户可通过 Web 端配置定时任务,也可在已有会话中输入 /schedule 命令创建。示例任务包括每日自动审查所有开放 PR、标记超过两天无人处理的 PR、每周一自动升级补丁级依赖并提交 PR、每晚重跑失败的 CI 任务并为反复失败的用例建 ticket。

  • 美股三大指数收跌,加密货币概念股普跌

    3 月 21 日,据 Bitget 行情数据,美股低开低走,道指收跌 0.97%,标普 500 指数收跌 1.51%,纳指跌 2.01%。超微电脑 (SMCI.O) 跌超 33%,英伟达 (NVDA.O) 跌 3.2%,美光科技 (MU.O) 跌 4.8%。加密货币概念股方面,MSTR 跌 1.87%;COIN 跌 2.67%,CRCL 跌 1.79%;SBET 跌 3.65%;BMNR 跌 0.95%。

  • 特朗普:正考虑逐步降级对伊朗的军事行动

    3 月 21 日,美国总统特朗普发文表示,随着他们考虑逐步降级在中东针对伊朗政权所开展的各项重大军事行动,他们已非常接近实现既定目标:1. 彻底削弱伊朗的导弹能力、发射装置及所有相关设施。2. 摧毁伊朗的国防工业基础。3. 消灭伊朗海空军力量,包括防空武器系统。4. 绝不允许伊朗哪怕是接近拥有核能力;同时,美国必须始终保持一种态势,以便一旦出现此类情况,能够迅速且强有力地予以反击。5. 以最高级别的力度,保护美国在中东的盟友,包括以色列、沙特阿拉伯、卡塔尔、阿拉伯联合酋长国、巴林、科威特及其他国家。特朗普称,霍尔木兹海峡的守卫与巡航工作,应在必要时由其他使用该海峡的国家来承担,美国将不再承担此责任。若受邀协助,美国愿为这些国家在霍尔木兹海峡的行动提供支持,但一旦伊朗的威胁被彻底消除,此类协助便将不再必要。尤为重要的是,对于这些国家而言,这将是一次轻而易举的军事行动。

  • 美国防部已为在伊部署地面部队做好详细准备

    3 月 21 日,据美国哥伦比亚广播公司报道,多位听取了相关简报的消息人士透露,美国国防部官员已为向伊朗部署美国地面部队做好了详细准备。消息人士称,随着特朗普正在权衡由美以主导的对伊冲突中的行动方案,高级军事指挥官已提交了旨在为此类选项做准备的具体请求。消息人士表示,特朗普一直在审议是否在该地区部署地面部队。目前尚不清楚他在何种情况下会授权动用地面部队。周四,当在椭圆形办公室被问及地面部队问题时,他告诉记者:「不,我不会在任何地方部署军队,」但他随即补充道:「如果我要部署,也肯定不会告诉你。」两名消息人士称,军方还举行了会议,准备应对如果特朗普决定派遣美国地面部队,该如何处理行动中可能扣押的伊朗士兵和准军事行动人员,包括这些伊朗人将被送往何处。(金十)

  • 特朗普:目前不想停火,霍尔木兹海峡会自动开放

    3 月 21 日,特朗普最新表示,他可以与伊朗进行对话,但目前不想停火,并表示尽管盟友不愿提供协助,但他有信心霍尔木兹海峡将在某个时间点「自动」重新开放。特朗普周五在白宫称:「你要知道,当你正彻底歼灭对方时,你是不会停火的。北约本可以帮助我们,但到目前为止他们还没有这份勇气。其他人也可以帮忙,但我们并没有指望他们。」谈及霍尔木兹海峡,特朗普再次表示:「我们不需要它。是欧洲需要它,韩国、日本以及许多其他国家都需要它,所以他们在那个问题上必须得参与进来。」特朗普还说,到了一定程度,霍尔木兹海峡会自动开放。谈到国内民调,特朗普表示:「CNN 今天发布了一项民调,我的支持率达到了 100%。」(金十)

  • Hugging Face CEO:中国开源正在成为塑造全球AI技术栈的最大力量

    据 1M AI News 监测,Hugging Face 联合创始人兼 CEO Clément Delangue 就 Cursor Composer 2 以 Kimi K2.5 为基座一事发表评论,称此事印证了三点判断:- 开源始终是竞争最大的推动力- 中国开源「如今是塑造全球 AI 技术栈的最大力量」- 前沿竞争不再只是谁从头训练,而是谁适配、微调、产品化得最快(他以 OpenClaw 为例)

  • 更新:Cursor官方确认Kimi K2.5为基座,月之暗面:使用经过授权商业合作

    据 1M AI News 监测,月之暗面官方账号 @Kimi_Moonshot 发文祝贺 Composer 2 发布,并说明:「Cursor 通过 Fireworks AI 托管的 RL 与推理平台访问 Kimi K2.5,属于授权商业合作。」Kimi 官方声明发出后,Cursor 联合创始人 Aman Sanger 和开发者教育副总裁 Lee Robinson 先后公开确认基座来源,并披露更多技术细节。Sanger 称团队对多个基座进行了困惑度评测,Kimi K2.5「证明是最强的」,随后叠加继续预训练和 4 倍规模的高算力强化学习,并通过 Fireworks AI 的推理与 RL 采样器进行部署。Robinson 补充,最终模型中来自基座的算力约占 1/4,其余 3/4 来自 Cursor 自身训练。Robinson 转引 Kimi 官方推文,表示月之暗面已确认使用符合许可证要求。Sanger 与 Robinson 均承认,发布博客时未提及 Kimi 基座「是一个失误」,表示下一个模型发布时会在第一时间注明基座来源。此前相关争议迅速在社交媒体上发酵,Elon Musk 也在 @fynnso 的帖子下回复「Yeah, it's Kimi 2.5」,进一步放大了话题热度。

  • James Wynn使用Hyperliquid邀请奖励40倍做空BTC

    3 月 21 日,据 Onchain Lens 监测,James Wynn 从 Hyperliquid 领取 5565 美元奖励,随后开设 40 倍杠杆 BTC 空单,入场价 69959 美元。

  • Web3数据和AI公司Validation Cloud完成1000万美元新一轮融资

    Web3数据和AI公司Validation Cloud宣布从True Global Ventures获得1000万美元融资,该公司计划利用这笔资金扩展其AI产品,实现对Web3数据的无缝访问。 据介绍,该公司的产品平台由三个部分组成:质押、节点API以及数据和AI。在质押方面,Validation Cloud的质押资产已超过10亿美元。Validation Cloud的一些客户包括 Chainlink、Aptos、Consensys、Stellar和Hedera。