链资讯 链资讯
Ctrl+D收藏链资讯
首页 > ICP > 正文

零知识证明——基于libsnark的电路构造及证明示例

作者:

时间:

libsnark库代码层次非常清晰。libsnark也给出了SNARK相关算法的全貌,各种Relation,Language,Proof System。为了更好的生成R1CS电路,libsnark抽象出protoboard和gadget,方便开发者快速搭建电路。在阅读该示例代码前,请仔细阅读libsnark的源代码分析:零知识证明 - libsnark源代码分析

唯一有点遗憾的,libsnark没有给个完整的电路构造实例,入门者想搭建自己的电路,刚开始有点摸不着头脑。

为了方便入门者编写自己的电路,同事写了个基于libsnark构造电路,并生成并验证电路的实例:

https://github.com/StarLI-Trapdoor/libsnark_sample

入门者,可以基于这个示例开发自己的电路。选择默克尔树作为电路的示例,因为在零知识证明的应用中,大量的使用默克尔树数据结构。

该示例构造了一条merkle路径的验证电路,生成并验证证明。merkle树的深度为3,并且merkle树的计算采用sha256散列函数。代码结构比较清晰,merkle目录中的main.cpp是主函数。circuit目录下的merklecircuit.h是电路的实现。整个项目用cmake进行编译。

BTC跌破51200美元:BTC跌破51200美元,现报51196.5美元,日内跌幅达到0.48%,行情波动较大,请做好风险控制。[2021/12/28 8:08:29]

电路名为MerkleCircuit,主要依赖两个gadget:merkle_authentication_path_variable和merkle_tree_check_read_gadget。merkle_authentication_path_variable提供了merkle树的一条路径。merkle_tree_check_read_gadget检查给定一个叶子节点,是否能计算出正确的root。

实现一个电路,主要实现两个接口函数:

generate_r1cs_constraints - 生成R1CS,该电路比较简单,只要让依赖的两个gadget,生成R1CS即可。

generate_r1cs_witness - 给所有的变量进行赋值。该电路,需要赋值的变量有root,leaf(叶子节点),和叶子节点配套的默克尔路径,以及默克尔路径对应的地址信息(也就是每一层的节点的位置,左边还是右边)。

NFT市场OpenSea交易总额突破120亿美元 创历史新高:金色财经报道,据最新数据显示,NFT市场OpenSea交易总额已突破120亿美元,创下历史新高,本文撰写时为121.2亿美元,位列NFT市场交易额排名第一位;排名第二的是Axie Infinity,交易总额为36.2亿美元,第三位是CryptoPunks,交易总额为22.2亿美元。作为第一个在以太坊区块链上建立的NFT市场,OpenSea的交易量在过去一年中随着NFT的繁荣而激增,其交易总额在11月2日突破100亿美元,在11月18日突破110亿美元,这意味着在不到一个月时间里,Opensea交易额增长超过20亿美元。[2021/12/1 12:42:36]

整个电路最复杂的就是电路的构造函数,申请变量,创建gadget。其中重点讲一讲,set_input_sizes函数。libsnark的框架中,使用简单的区分public和private变量的模型。通过set_input_sizes函数,设置前几个变量为public变量。

摩根溪创始人Mark Yusko:比特币是世界上最稀有的资产:摩根溪创始人Mark Yusko在参与美国CNBC节目Squawk Box时表示:“根据S2F模型衡量,比特币实际上是世界上最稀有的资产。”昨天在该节目上贝莱德首席投资官Rick Rieder认为比特币的使用场景比黄金更多,未来有希望取代黄金的位置。[2020/11/21 21:36:56]

pb.set_input_sizes(root_digest->digest_size);也就是说,该电路的公开变量为root的bit个数。

确定了电路的实现,看看main函数,如何生成和验证证明。

在main函数中定义了merkle树计算需要的一些类型:

FieldT默认是bn256椭圆曲线的的Fr,默克尔树计算采用是sha256算法。

3.1 setup

实现了generate_read_keypair函数,生成pk/vk。仔细看一下generate_read_keypair函数,逻辑简单清晰:构造MerkleCircuit,在生成R1CS后,调用r1cs_gg_ppzksnark_generator生成pk/vk。

pk存放在merkle_pk.raw文件中,vk存放在merkle_vk.raw中。

3.2 prove

prove逻辑,首先从输入参数构造一个完整的merkle树,并根据输入选定了默克尔路径。通过generate_read_proof函数生成证明。该函数逻辑也比较清晰:

构造MerkleCircuit,在生成R1CS后,设置各个变量的值。接着通过r1cs_gg_ppzksnark_prover生成证明。

3.3 verify

在获知vk,证明以及公开信息(root)的基础上,调用r1cs_gg_ppzksnark_verifier_strong_IC的接口完成验证。这也就是verify_read_proof函数的逻辑。

在编译之前,同步该项目依赖的libsnark库:

git submodule update --init --recursive4.1 编译

mkdir build; cd build; cmake ..编译完成,merkle目录下会生成merkle的可执行文件。

4.2 可信设置(trusted setup)

./merkle setup4.3 生成证明

./merkle prove [data1] [data2] [data3] [data4] [data5] [data6] [data7] [data8] [index]prove命令,需要提供原始的3层merkle树的8个叶子节点,并指定需要证明的第几个叶子节点对应的路径(index指明)。

4.4 验证

./merkle verify [root]其中,root信息是在prove中生成过程中打印出来的root信息(也是公开信息)。如果验证通过,就说明存在一条能生成root的merkle路径,虽然没有公开路径的具体信息。

总结:

libsnark库代码层次非常清晰,并抽象出protoboard和gadget,方便开发者快速搭建电路。本文给出了一个基于libsnark库开发的完整电路示例。示例实现了3层默克尔树的一条默克尔路径的验证。其中默克尔树采用sha256的散列函数。

标签:ERKNARROOIBSMeta MeerkatCanaryXProof Of PepeSHIBSHABU币

ICP热门资讯
这一指标表明加密货币市场接近临界水平 或将决定2020年走势

过去两周对于加密货币市场而言一直处于动荡不安中,比特币和众多主流加密货币在几周前反弹至2020年新的高点,然后遇到了无法冲过的价格阻力,从而引发了强烈的下跌趋势。 现在,一位分析师指出,加密货币市场目前可能接近“成败的关键”水平,这会为未来几个月市场趋势定下了基调。

金色百科 | 什么是对冲?主要策略有哪些?

对冲交易简单地解释就是盈亏相抵的交易。在“对冲”的英文“Hedge”词意中包含了避险、套期保值的含义。如果更完整地表达,对冲交易即同时进行两笔行情相关、方向相反、数量相当、盈亏相抵的交易。 行情相关是指影响两种商品价格行情的市场供求关系存在同一性,供求关系若发生变化,同时会影响两种商品的价格,且价格变化的方向大体一致。

迪拜建立第一个区块链KYC平台 持牌企业可即时开设数字银行账户

迪拜国际金融中心(DIFC)和Mashreq 银行于3月1日宣布推出新的区块链数据共享平台。 这一平台将允许持牌企业和公司通过内部区块链平台验证其身份,即时开设数字银行账户。 Mashreq通过删除现有的基于纸张的KYC流程,并用以区块链为核心技术的数字化流程来代替。DIFC准备了一份新的有关每个公司的KYC记录,并将其作为该公司申请营业执照的一部分。

看看美股 再看看币圈 或许就有了方向

狂人说 隔夜,美股再次暴力上涨,我们也只能感慨,美股太硬了,啥时候咱A股也能如此硬气,中国的2亿股民也就真的扬眉吐气了。

毕马威: 自2017年有98亿美元加密货币被盗 机构托管是关键

根据毕马威(KPMG)3月2日与彭博社(Bloomberg)分享的一份报告,机构投资者仍然认为拥有加密货币是一种风险。该会计师事务所估计,自2017年以来,共计有价值98亿多美元的加密货币被盗。 调查结果显示,大多数盗窃案的罪魁祸首是安全制度不严格和代码的编写不当。

芝商所比特币期货交易量一周暴跌9亿美元 比特币能否触底反弹?

在经历了上周的暴跌之后,加密货币市场在本周以反弹拉开了序幕。目前,加密货币的总市值已经从近期约2407亿美元的低点反弹至2510亿美元。当然,最终的反弹的力度将会确认底部是否已经到位,或者说这只是一次假反弹,之后还会继续下行走势。