http://www.c4dcn.com

零知识证明:ZoKrates 使用和案例说明 - 火星技术

零知识证明:ZoKrates 使用和案例说明 | 火星技术帖

零知识证明:ZoKrates使用和案例说明|火星技术帖声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。

边肖:记得要集中注意力。

来源:硬币探索

零知识证明:ZoKrates使用和案例说明|火星技术帖ZoKrates是一个面向以太坊的zk-SNARKs工具项目,可以轻松实现链下生成零知识证明,然后通过智能契约提交给以太坊链进行验证的功能。

ZoKrates本身主要由rust实现,底层zkp方案依赖于bellman,libsnark。

简要介绍了ZoKrates的用法,并用ZoKrates举例说明了V神zkSNARKs相关文章中的一个案例。

关于zkSNARKs,ZoKrates更详细的介绍和说明,请参考文末的参考。

命令行描述

编译

编译源代码:将zok源代码扁平化成逻辑条件语句,生成两个文件(默认为out,out.ztf),其中,ztf文件是可读的。

示例命令:zokratescompile[-oout]-isample.zok

Zok源代码文件sample.zok:

defmain(privatefielda,fieldb)->(field):fieldresult=ifa*a==bthen1else0fireturnresult

为以下对象生成ztf文件:

defmain(_0,_1)->(1):
(1*_0)*(1*_0)==1*_4#_2,_3=Rust::ConditionEq((-1)*_1+1*_4)((-1)*_1+1*_4)*(1*_3)==1*_2(1*~one+(-1)*_2)*((-1)*_1+1*_4)==0(1*~one)*(1*~one+(-1)*_2)==1*~out_0return~out_0

安装

可信启动:执行可信设置操作以生成CRS(公共引用字符串)。

示例命令:zokratessetup[-Iout][-sg16][-pprovideing.key][-vverification.key]

Setup输入为compile生成的out,在生成CRS之前生成R1CS,最后输出两个文件:proving.key和verification.key.

可以用参数-s指定零知识证明方案,目前支持G16、PGHR13、GM17,默认为G16。

生成的验证密钥:

vk.alpha=0x0570e3c9d82099fa7387140f1c16a521c600c62109cdc023a7dafd45698f22de,0x04ad4ecb02c73f674c264eab35f2ef763f0fc7b758fa554385cc419c72fa4b8cvk.beta=[0x0c81950e8454719fcdae412f554bac62071f0dcfbc0df5a10dbfe3530b5b980c,0x1cd6933716f38d239eb6fd2416c22f1e7ba3bbd367b007e9d94a29c243486858],[0x1bdcbd9b7306f051de4ff26979fddac6e376a94416521f30233451ef03d59b75,0x1165ef2b53fe7172d3bada68df3200db2931c991b4602299127f0195983575b8]vk.gamma=[0x0fa0718df95c498bc1f50ec2a5f4f7b1214bf0b5c3f28d439740588a4c42ece6,0x013f7042472ce1b5e8c546d18761c3a27ae786b1258050cc486d0258cc401e24],[0x0cf0f1d42a320b73e579d7828712c08b663ecec595bb3d893f10acebbb5d8658,0x296b67405655ee6d0edd69fbfcab20f400da0ad9b87cbca98a4fa96e133773e0]vk.delta=[0x063fa2f6cd8ad00b35af4348fd7e627dcf8bb3530d0e50e23046abe054900d06,0x06f008e36d2c0c05978785e4cce3dfc169fbb078aa891dc83a14f96d56572d52],[0x1347ce64162496c450dc725aef975e2a0744712a487106739883df311af91057,0x234e180f25487b444d0f1f8ac0c02b45ceeffc0ce171e2507e270d1aea44d67f]vk.gamma_abc.len=3vk.gamma_abc[0]=0x18149018b7c0ee29906ef20c544efb732a822d4a562100c20aef1a301bb1dc20,0x18a913b2026e7fb7fccef60c0b577dbd7a80b95c7575de8a5314ed88f0a1ae1bvk.gamma_abc[1]=0x17b95318ccf8382281b3f6811a44f107d3df1984bb8ce3d25bda15966e4ac243,0x05c08e28b1d45692a3bb7e51a7a784553695ee373047a095560d9702f02f46bcvk.gamma_abc[2]=0x2c820e3b6ca96c8a98a98085fe4d29b237a23dac00abb0cc5dcb7a96d45fa042,0x00937b10d0c409ab576d9739f895b4e8a4f0b3f0daa8bde00d83239a691e3471

计算见证

计算见证:这是生成一个证明的步骤,根据原计算问题的输入生成。

示例命令:zokratescompute-witness[-Iout][-owitness]-a416

命令的输入是由编译生成的out,以及计算问题的输入参数(函数);输出一个文件,默认文件名是witness。

生成证明

生成证明:基于约束系统(计算问题)和证人生成相应的零知识证明。

示例命令:zokrates生成证明[-Iout][-pprovideing.key][-wwitness][-sg16][-jproof.JSON]

命令的输入是compile和setup生成的(out,proving.key)和compute-witness生成的(witness);输出证明文件,默认是proof.json.

proof.json示例:

{"proof":{"a":["0x00079e628b230588e245fda5edf8866ce711c7de8d5cc37cf54b80f51aa37c37","0x167b3260cf4af269c4914dfbe180477097a988f6bb778705e76e489a42e0bfd0"],"b":[["0x1afb08d6f40254ef449b504d1f6530879ddb3effc7b729620a736701dec6d6dc","0x1e89599001bc3572bfefaf041c624d72be516ca3cb6be479fb4daf0442566c4d"],["0x24f83adc32a54235ad72c7e61e93990c1d97c3ef72417892b7bb01f64a53c42e","0x0adc5cb25f7de45483b027f9afa12eff92a910d277ccc28bf39e6d79f7c5569f"]],"c":["0x2019bdafca45c38f26a5e3ab23764e2650d13f0b64c2b4dee3ad705fbacbbafd","0x26aa019ae205ae1b91bf8dab69d16e24395b3e17983377f25d2f3730e53ae17d"]},"inputs":["0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000001"]}

导出验证器

出口合同:根据verification.key生成验证者合同.

示例命令:zokratesexport-verifier[-Iverification.key][-sg16][-overifier.sol]

证明方案

文档:证明方案

ZoKrates目前支持三种认证方案:

PGHR13:pghr13,取决于libsnark

G16:groth16,默认方案,不依赖libsnark,依赖bellman。

GM17:gm17,取决于libsnark

Setup、export-verifier和generate-proof可以通过-s指定证明方案,但它们必须一致。

要使用PGHR13或GM17,需要在编译zokrates命令时添加附加参数来添加libsnark:cargo+nightly-zpackage-featuresbuild-release-packagezokrates_CLI-features="libsnark"。

注:G16为延展性,所以推荐gm17。

验证方法

验证方法是调用export-verifier命令生成的verifier.sol契约的verifyTx函数。

函数verifyTx(uint[2]内存a,uint[2][2]内存b,uint[2]内存c,uint[2]内存输入)公共返回(boolr)

该函数的参数来自generate-proof命令的输出。

案例:x3+x3=35

这个案例来自维塔利科在QAP的文章:

二次算术程序:从零到英雄

白话零知识证明(2)

执行流程:

使用DSL编码问题:

main.zok

defmain(privatefieldx)->(bool):
x*x*x+x+5==35returntrue

编译:

命令:zokratescompile-imain.zok

结果:

Compilingmain.zok
Compiledprogram:defmain(_0)->(1):(1*_0)*(1*_0)==1*_1(1*_1)*(1*_0)==1*_2(1*~one)*(35*~one)==5*~one+1*_0+1*_2(1*~one)*(1*~one)==1*~out_0return~out_0Compiledcodewrittento'out'Humanreadablecodeto'out.ztf'Numberofconstraints:4

根据结果,我们可以知道:

~one=1
~out_0=1_0=x_1=_0*_1=x^3

设置

命令:zokrates设置

输出结果:

Performingsetup...
defmain(_0)->(1):(1*_0)*(1*_0)==1*_1(1*_1)*(1*_0)==1*_2(1*~one)*(35*~one)==5*~one+1*_0+1*_2(1*~one)*(1*~one)==1*~out_0return~out_0WARNING:YouareusingtheG16schemewhichissubjecttomalleability.Seezokrates.github.io/reference/proving_schemes.html#g16-malleabilityforimplications.Hasgenerated5points

生成验证合同

命令:zokrates导出验证器

编辑并发布合同。

使用remix和Metamask进行编译和发布。

在Rinkby上发布的合同,由源代码:0x53577a6d35d004D1c76397959c594d0426ECD1a认证

https://rinkeby.etherscan.io/address/0x53577a6d35da004D1c76397959c594d0426ECD1a

产生正确的证人和证据。

命令:zokratescompute-witness-a3owitness.很好

Computingwitness...
Witness:[true]

证人.好:

~out_01
~one1_03_19_227

生成正确的证明。

命令:zokratesgenerate-proof-wwitness.good-jproof-good.JSON

Generatingproof...
WARNING:YouareusingtheG16schemewhichissubjecttomalleability.Seezokrates.github.io/reference/proving_schemes.html#g16-malleabilityforimplications.generate-proofsuccessful:true

证明-好.json



{"proof":{"a":["0x110332d0c8e1d05ce9404fd93105c3fe4584d80ccb5ac717acadc7ebd0fc980e","0x030f5b5816274abb8eef5be4fd24991d0de600916d02338be72374e7b9bfdf6c"],"b":[["0x047db95379f2de8e6753fc26dfd0254d6f634526062ae70e3545bd50bf8be5df","0x187c8851eae58a5713dd46f18dc9598b67598a248edb0cee6b68f5d080f01e9b"],["0x05ae13857c3b68ea1728fcdf4f41883c78be1fda50b4a54f0aab8c27aa63fdf2","0x2402254c268795bb9c1ef973e4fb4a5eacc8e230793a1d6b8208666b436da00a"]],"c":["0x141b43d522d0cf6912c12efbb5c5bb783a21a1392573d9073db93f284ba6b008","0x2aa86a426ca6b2deeeaff97cbeef7299082cc9753635bb8dee1c8d87e9ef53c2"]},"inputs":["0x0000000000000000000000000000000000000000000000000000000000000001"]}%

调用验证器合同进行验证。

交易:0xf84aa9f7cc7b7ef7896f77b295bcce657c18c6053Fe33EBA0905f86131c6851f

https://rinkeby.etherscan.io/tx/0xf84aa9f7cc7b7ef7896f77b295bcce657c18c6053Fe33EBA0905f86131c6851f

根据verifier.sol,如果一个事务抛出一个事件,就意味着验证通过。

产生错误的证人和证据。

命令:zokratescompute-witness-a4-owitness.bad

Computingwitness...
Executionfailed:Expected35toequal73

无法生成Witness.bad。

伪造假证明,并基于上述proof-good.json数据任意修改。

调用验证器合同进行验证。

交易号:0x669936c392f39a10BC0ee594e1472b87a93b0370ed329ab03892e5f702fb1ea3

https://rinkeby.etherscan.io/tx/0x669936c392f39a10BC0ee594e1472b87a93b0370ed329ab03892e5f702fb1ea3

交易号:0x89689b344f88751995641f8f682768aaaf99b770f70f404BD003fedc6ECB50393

https://rinkeby.etherscan.io/tx/0x89689b344f88751995641f8f682768AAF99b770f70f404BD003fedc6ECB50393

有些交易会失败,有些交易会成功,但成功的交易也没有事件(表示验证失败,函数返回false)

参考数据

佐克拉特-吉图布

https://github.com/Zokrates/ZoKrates

zokrates文件

https://zokrates.github.io/

更夫

https://github.com/zkcrypto/bellman

libsnark

https://github.com/scipr-lab/libsnark

二次算术程序:从零到英雄

https://medium.com/@VitalikButerin/quadratic-algorithm-programs-from-zero-to-hero-f6d558CEA649

知识的零证明——对ZoKrates的深刻理解

https://learnblockchain.cn/2019/07/24/zokrates/

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。