值得信赖的区块链资讯!
零知识证明 – 电路及证明示例(libsnark)
libsnark库代码层次非常清晰。libsnark也给出了SNARK相关算法的全貌,各种Relation,Language,Proof System。为了更好的生成R1CS电路,libsnark抽象出protoboard和gadget,方便开发者快速搭建电路。在阅读该示例代码前,请仔细阅读libsnark的源代码分析:
唯一有点遗憾的,libsnark没有给个完整的电路构造实例,入门者想搭建自己的电路,刚开始有点摸不着头脑。
为了方便入门者编写自己的电路,同事写了个基于libsnark构造电路,并生成并验证电路的实例:
https://github.com/StarLI-Trapdoor/libsnark_sample
入门者,可以基于这个示例开发自己的电路。选择默克尔树作为电路的示例,因为在零知识证明的应用中,大量的使用默克尔树数据结构。
1 代码结构
该示例构造了一条merkle路径的验证电路,生成并验证证明。merkle树的深度为3,并且merkle树的计算采用sha256散列函数。代码结构比较清晰,merkle目录中的main.cpp是主函数。circuit目录下的merklecircuit.h是电路的实现。整个项目用cmake进行编译。
2 电路实现
电路名为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(叶子节点),和叶子节点配套的默克尔路径,以及默克尔路径对应的地址信息(也就是每一层的节点的位置,左边还是右边)。
整个电路最复杂的就是电路的构造函数,申请变量,创建gadget。其中重点讲一讲,set_input_sizes函数。libsnark的框架中,使用简单的区分public和private变量的模型。通过set_input_sizes函数,设置前几个变量为public变量。
pb.set_input_sizes(root_digest->digest_size);
也就是说,该电路的公开变量为root的bit个数。
3 生成和验证证明
确定了电路的实现,看看main函数,如何生成和验证证明。
在main函数中定义了merkle树计算需要的一些类型:
typedef libff::default_ec_pp ppzksnark_ppT; typedef libff::Fr<ppzksnark_ppT> FieldT; typedef sha256_two_to_one_hash_gadget<FieldT> HashT;
FieldT默认是bn256椭圆曲线的的Fr,默克尔树计算采用是sha256算法。
3.1 setup
实现了generate_read_keypair函数,生成pk/vk。仔细看一下generate_read_keypair函数,逻辑简单清晰:构造MerkleCircuit,在生成R1CS后,调用r1cs_gg_ppzksnark_generator生成pk/vk。
protoboard<FieldT> pb; sample::MerkleCircuit<FieldT, HashT> mc(pb, tree_depth); mc.generate_r1cs_constraints(); r1cs_constraint_system<FieldT> cs = pb.get_constraint_system(); return r1cs_gg_ppzksnark_generator<ppzksnark_ppT>(cs);
pk存放在merkle_pk.raw文件中,vk存放在merkle_vk.raw中。
3.2 prove
prove逻辑,首先从输入参数构造一个完整的merkle树,并根据输入选定了默克尔路径。通过generate_read_proof函数生成证明。该函数逻辑也比较清晰:
protoboard<FieldT> pb; sample::MerkleCircuit<FieldT, HashT> mc(pb, tree_depth); mc.generate_r1cs_constraints(); mc.generate_r1cs_witness(pb, leaf, root, path, address, address_bits); return r1cs_gg_ppzksnark_prover<ppzksnark_ppT>(proving_key, pb.primary_input(), pb.auxiliary_input());
构造MerkleCircuit,在生成R1CS后,设置各个变量的值。接着通过r1cs_gg_ppzksnark_prover生成证明。
3.3 verify
在获知vk,证明以及公开信息(root)的基础上,调用r1cs_gg_ppzksnark_verifier_strong_IC的接口完成验证。这也就是verify_read_proof函数的逻辑。
4 编译和运行
在编译之前,同步该项目依赖的libsnark库:
git submodule update --init --recursive
4.1 编译
mkdir build; cd build; cmake ..
编译完成,merkle目录下会生成merkle的可执行文件。
4.2 可信设置(trusted setup)
./merkle setup
4.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的散列函数。
技术改变世界
长按二维码关注我
比推快讯
更多 >>- 马来西亚数字资产基金管理公司 Halogen Capital 完成 320 万美元融资,Kenanga Investment Bank 领投
- 半木夏:比特币均线粘合形成关键阻力,若突破将为关键看多信号
- 分析:比特币全平台杠杆率降至今年 5 月以来低点
- 某巨鲸以 8 倍杠杆开新 ETH 仓位,价值 1,700 万美元
- Bithumb 将上线 WET 韩元交易对
- 多哈银行发行 1.5 亿美元数字债券,采用 Euroclear DLT 平台实现即时结算
- BNB Chain Meme 代币 $COCO 突破 0.052 美金,当前市值约 5200 万美金
- 印度央行拒绝 G7 稳定币监管模式,坚守货币主权
- 巴西联邦警察开展“加密洗钱”行动,涉案资金超 27 亿雷亚尔
- Kevin Warsh 被特朗普提名为美联储主席的概率上升至 40%
- Bitunix 分析师:美国就业陷入僵局,宏观停滞风险仍存,加密市场关注关键清算区间
- 花旗:受短债推动,美债收益率曲线料将趋陡
- 美国就业、CPI、指数再平衡三箭齐发,本周流动性将成为焦点
- Muliticoin 联创:以太坊曾是我的加密引路者、第一桶金来源,且是历史上最快达到 1000 亿美元市值的资产,但 2017 年我就放弃了它
- 以太坊周度流出减缓,过去 7 日 CEX 累计净流出 2.51 万枚 ETH
- 日媒:日本央行预计将加息至 0.75%,为 30 年来最高
- 数据:监测到 6,772.51 万 USDT 转出 Binance
- 特斯拉或将于年内发布无需监管 FSD,内幕已提前三个月布局?
- 币安完成 The Sandbox (SAND) 于 Base 网络集成并开放充值、提现业务
- 现货黄金日内涨幅达 1.00%,现报 4343.39 美元/盎司
- 上周比特币全网算力下跌 17.25%
- 美元兑日元持续小幅走低,现报 155.1
- Curve 创始人提议捐赠 1700 万美元 CRV 资金用于研发团队
- 数据:StraitsX 向 Binance 转移 1219.91 万 XUSD,价值约 1219.91 万美元
- CZ:不持有法币,几乎没有现金
- 财新:3 万亿元应收账款电子凭证整改,探索区块链等技术“脱核”仍待突破
- Matrixport:比特币维持震荡格局,分析师建议耐心等待方向信号
- 在岸、离岸人民币对美元汇率创 14 个月新高
- Hashdex 预测 2026 年稳定币市值将翻倍,建议可将 5-10%资金配置于加密货币
- 巨鲸pension-usdt.eth平仓 BTC 空单后反手开多,持仓规模达 3211 万美元
- 数据:当前加密恐慌贪婪指数为 17,处于极度恐慌状态
- Aster 人机大赛周末过后两阵营均亏损,交易员阵营已有 12 位资金归零
- Bitget 第 16 期合约商城开放不限额兑换,凭积分兑换 LV、BURTON 滑雪服与双人北欧极光游等
- ZachXBT:edgeX 与加密交易平台 MEXC 存在高度关联
- 孙悟空(SunX)新增 PIEVERSE 合约交易
- CZ 回应绯闻传言:所有互动仅有 3 条信息来回和见面沟通 10 分钟
- 香港持牌加密交易所 HashKey IPO 集资 2.06 亿美元,定价接近区间上限
- Base 联创涉嫌为 RUG 代币引流,遭社区强烈抨击
- Nansen CEO:仍持仓 ETH,社区需有危机感,否则 5 年后将面临淘汰
- 数据:比特币现货 ETF 上周净流入 2.87 亿美元,贝莱德 IBIT 净流入 2.14 亿美元居首
- Lighter TGE 热议:TGE 时间与长期定位引发分歧
- Cathie Wood 最看好的三种加密资产:BTC/ETH/SOL
- 数据:RONIN 涨超 5%,多代币触及本周新低
- 数据:币安“全币持有者”流入量骤降至 2018 年来最低
- 数据:GMGN 热门板块 HERO 24h 涨幅达 +13K%
- 观点:若比特币遭量子破解,OG 将接盘中本聪的持仓
- 玄学项目 superfortune 推出 AI 驱动的 Web2 APP
- 安全公司:朝鲜黑客假 Zoom软件攻击已成日常威胁,窃取超 3 亿美元资产
- 某巨鲸向 HyperLiquid 存入 246 万美元 USDC 做空 ZEC
- 瑞士 AMINA 银行成首家上线 Ripple 支付的欧洲银行
比推专栏
更多 >>观点
比推热门文章
- 马来西亚数字资产基金管理公司 Halogen Capital 完成 320 万美元融资,Kenanga Investment Bank 领投
- 半木夏:比特币均线粘合形成关键阻力,若突破将为关键看多信号
- 分析:比特币全平台杠杆率降至今年 5 月以来低点
- 某巨鲸以 8 倍杠杆开新 ETH 仓位,价值 1,700 万美元
- Bithumb 将上线 WET 韩元交易对
- 多哈银行发行 1.5 亿美元数字债券,采用 Euroclear DLT 平台实现即时结算
- 疯狂建仓386万ETH,“无脑多头”Tom Lee的投资逻辑是什么?
- BNB Chain Meme 代币 $COCO 突破 0.052 美金,当前市值约 5200 万美金
- 印度央行拒绝 G7 稳定币监管模式,坚守货币主权
- 巴西联邦警察开展“加密洗钱”行动,涉案资金超 27 亿雷亚尔
比推 APP



