zk-Snark的一些研究

前言

    最近因为工作需要研究了一下zk-Snark(非交互式零知识证明),写篇文章记录一下心得。下面是zk-snark的一些核心命令已经关键文件输出。


安装

    本文主要参考snarkjs进行安装调试。要使用zk-Snark主要需要安装node.jscircomsnarkjs这三个东西。我用的是window11。

    1、安装node.js,没啥好说的,就是版本不要太低,不然运行的时候容易出bug,我的版本是:v18.20.4

    2、安装snarkjs,这个更简单就一行命令:npm install -g snarkjs@latest

    3、安装circom,这个是零知识证明的核心之一,可以理解为电路编译器,将证明代码编译成电路。circom安装可以参考这篇文章,虽然有npm安装方式,但是不建议这么做,因为npm版本太低,安装之后用2.0.0的电路模板会有问题。其次,安装命令cargo build --release 在window上有问题的可以去掉--release,即在circom代码目录调用cargo build即可,然后就可以在/circom/target/debug目录中找到circom.exe可运行程序,如果嫌麻烦可以不用配置环境变量,直接将该exe文件copy到测试目录。

测试

    首先初始化Tau

    这个具体用处我也不是很清楚,先暂定为必要数据的初始化功能吧,跟着snarkjs的步骤执行即可

    1、执行:snarkjs powersoftau new bn128 14 pot14_0000.ptau -v 

    2、执行snarkjs powersoftau contribute pot14_0000.ptau pot14_0001.ptau --name="First contribution" -v

    3、执行:snarkjs powersoftau contribute pot14_0001.ptau pot14_0002.ptau --name="Second contribution" -v -e="some random text"

    4、执行下面三条语句

snarkjs powersoftau export challenge pot14_0002.ptau challenge_0003

snarkjs powersoftau challenge contribute bn128 challenge_0003 response_0003 -e="some random text"

snarkjs powersoftau import response pot14_0002.ptau response_0003 pot14_0003.ptau -n="Third contribution name"

4、执行:snarkjs powersoftau beacon pot14_0003.ptau pot14_beacon.ptau 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 10 -n="Final Beacon"

    5、执行:snarkjs powersoftau prepare phase2 pot14_beacon.ptau pot14_final.ptau -v

这个命令要执行很久,如果没出错最后会生成一个pot14_final.ptau的文件,这个就是后续需要使用到的关键文件之一了。

    编译电路

    1、创建电路代码,假定我们要验证A知道两个数,这两个数的乘积=33,我们假设A已经知道这个条件,我们将电路设计成A输入两个数值,并输出两个数值的乘积:   

2、执行命令:circom circuit.circom --r1cs --wasm --sym

生成r1cs文件、sym文件、*_js目录,js目录下有三个文件,即运行脚本电路文件

生成见证文件

    1、我们编译完电路之后,需要用户输入参数,然后生成一个见证文件,其实就是A要将数值输入到电路中得到一个中间文件。因此需要定义输入文件input.json

    

2、进入circuit_js目录,调用命令:node generate_witness.js circuit.wasm ../input.json ../witness.wtns

调用成功会在test目录生成一个wtns文件,这个就是一个见证文件了

创建公共参数

    公共参数创建需要使用r1cs和ptau文件,大体上可以理解为会创建一个私钥,将这两个文件数据进行组合运算,加上公钥数据,进行签名,然后销毁私钥,最后导出zkey类型的公共数据文件。这里面有三种验证系统:Groth16、plonk和fflonk,我们这边只使用plonk进行举例

    返回test目录,执行命令:snarkjs plonk setup circuit.r1cs pot14_final.ptau circuit_final.zkey

导出验证公钥

    从公共数据文件中导出验证公钥数据,执行命令:snarkjs plonk prove circuit_final.zkey witness.wtns proof.json public.json

生成证明文件

    证明文件需要公共参数文件zkey+见证文件wtns才能生成,然后生成proof.json,以及电路中定义的output等公共数据,执行命令:snarkjs plonk prove circuit_final.zkey witness.wtns proof.json public.json

数据验证

    数据验证则需要公钥zkey+proof.json+public.json进行验证,然后返回验证成功或者失败,执行命令:snarkjs plonk verify verification_key.json public.json proof.json

结束

    这里面只是简单试了一下zk-snark的调用,但是还有很多问题没有解决,比如电路文件是要由验证者编写,还是由证明者编写?如何确保证明者的输入是可靠的?题中的例子属于知道类型的证明,那么有/没有的类型应该如何设计电路?感觉要实际将零知识证明应用到项目中还有很多很多的问题啊,头大。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容