
零知识证明 – 电路及证明示例(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的散列函数。
技术改变世界
长按二维码关注我
比推快讯
更多 >>- Aevo 推出支持 1000 倍杠杆交易美股平台 Aevo Degen,已上线 COIN、HOOD、CRCL
- ETH 突破 2600 美元
- xStocks 将集成进即将上线的 Jupiter Lend
- 世界黄金协会:全球黄金 ETF 上半年增加 380 亿美元
- 美股加密货币概念盘初集体冲高,SharpLink Gaming 涨超 21%
- LibertyAgents.io 寻求战略投资者支持 WLFI 生态基础设施建设
- Tornado Cash 联创 Roman Storm 审判仍定于 7 月 14 日开始
- Resupply 上线 IP 留存激励计划,拟在 52 周内发放 250 万枚 RSUP
- DeFi Development 增持 47,272 枚 SOL,价值约合 719 万美元
- Greeks.live:部分加密交易者表现出“看涨但倾向于保护”态度
- MoonPay 在英美欧支持 Apple Pay 零手续费充值余额以购买加密货币
- 分析:日本 30 年国债收益率三天飙升逾 30 基点,或影响 BTC 等风险资产
- SharpLink 上周购入 7689 枚 ETH,总持仓突破 20 万枚并获 322 枚以太坊质押奖励
- 数据:过去 24 小时全网爆仓 1.66 亿美元,多单爆仓 1.06 亿美元,空单爆仓 6049.04 万美元
- 美股 BTCS 盘前涨 5%,此前宣布拟筹集 1 亿美元收购 ETH
- Robinhood CEO:收到大量公司请求发行代币化股票
- 特朗普媒体科技集团盘前上涨 1.5%,或受申请加密蓝筹 ETF 影响
- 以太坊执行客户端支持历史数据修剪,大幅节省节点存储空间
- 区块链技术上市公司 BTCS 拟年内募资 1 亿美元以战略收购 ETH
- 中信建投:稳定币合规化提速,资产代币化迎来“权益时代”
- MetaCene 显卡集群驱动的新链游《Cyber Crash》上线一周单日营收超 500 万美元
- 德银调查:特朗普政策加持推动美国加密货币采用率有所增长
- ETH 版微策略SharpLink 增持 7689 枚 ETH,买入均价 2501 美元
- Truth Social 加密蓝筹 ETF“篮子”内包括 BTC、ETH、SOL、XRP 和 Cronos
- 分析:BNB 价格窄幅波动,市场关注美国关税政策影响
- Truth Social 递交 S-1 文件,拟推出 Crypto Blue Chip ETF
- Circle 盘前下跌 3.3%,瑞穗银行首次给予“表现不佳”评级
- Hyperscale Data:6 月挖矿产出 13.7 枚 BTC,比特币持有量达 103.7 枚
- 市场猜测特朗普政府有意推动美元走弱
- Genius Group 购入 28 枚 BTC,比特币储备增至 148 枚
- 疑似 Arthapala 地址过去 5 小时再次向交易所充值 6570 枚 ETH,约 1677 万美元
- 义乌当地协会回应稳定币结算:几乎没有,认可度不高难以形成广泛流通
- Benchmark:给予 Semler Scientific“买入”评级,看好其比特币储备战略
- 巴基斯坦成立数字资产监管机构
- 特朗普宣布将对泰国征收 36%关税
- Orbiter Finance 与 Nano Labs 达成合作将推出合规稳定币跨链解决方案 NBNB.io
- Ego Death Capital 第二支基金完成 1 亿美元募资,专注支持比特币生态企业扩张
- KULR Technology 与 Coinbase Credit 达成 2000 万美元初始信贷融资协议
- Matador Technologies 在比特币链上推出数字黄金产品“Grammies”
- Tether 投资区块链取证公司 Crystal Intelligence
- ReserveOne 拟建立规模超 10 亿美元的加密货币储备
- 分析:美联储实质降息或在明年,利率年末料微降
- 某加密货币女性投资者在法国家中遭袭,警方以暴力抢劫未遂展开调查
- SOON 团队回应异常价格波动:未抛售代币,将持续推进产品开发
- 四部门启动 2025 年元宇宙典型案例推荐工作,聚焦数字人、产品、园区、标准
- Gyroscope 动态流动性池:上线以太坊主网,同时启动 LP 激励机制
- 派盾:Peapods Finance 出现可疑交易
- 比特币回升触及 10.9 万美元
- 数据:某地址向 HyperLiquid 存入 200 万枚 USDC 并 10 倍杠杆做多 SOL
- Falcon Finance 旗下稳定币 USDF 短暂脱锚至 0.9432 美元,现报 0.9932 美元
比推专栏
更多 >>观点
比推热门文章
- Aevo 推出支持 1000 倍杠杆交易美股平台 Aevo Degen,已上线 COIN、HOOD、CRCL
- ETH 突破 2600 美元
- xStocks 将集成进即将上线的 Jupiter Lend
- Vitalik 背叛 MIT 许可!Copyleft 才是开源救世主
- 世界黄金协会:全球黄金 ETF 上半年增加 380 亿美元
- 美股加密货币概念盘初集体冲高,SharpLink Gaming 涨超 21%
- LibertyAgents.io 寻求战略投资者支持 WLFI 生态基础设施建设
- Tornado Cash 联创 Roman Storm 审判仍定于 7 月 14 日开始
- Resupply 上线 IP 留存激励计划,拟在 52 周内发放 250 万枚 RSUP
- DeFi Development 增持 47,272 枚 SOL,价值约合 719 万美元