零知识证明:ZoKrates 使用和案例说明 | 火星技术帖
声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。
边肖:记得要集中注意力。
来源:硬币探索
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.zokCompiledprogram: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/
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。