值得信赖的区块链资讯!
零知识证明 – 电路及证明示例(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的散列函数。
技术改变世界
长按二维码关注我
比推快讯
更多 >>- CZ:今年遭遇中文竞品 FUD,社区分裂不利于币价,呼吁专心建设
- 加密恐慌指数跌至 8,市场冷清依旧
- X 产品负责人再谈“智能标签”:X 不会直接负责执行交易或充当经纪商
- CZ:今年主要有家中文竞品在花钱黑我们,其他友商的竞争还算专业
- Galaxy Digital 高管:加密市场不会出现 V 型复苏,经历一段震荡期后才会逐步上涨
- Coinbase CEO:启用更多 x402 结账流程可使客服人员高效完成工作
- Polymarket 上预测本周六美国政府停摆概率降至 2%
- Binance 前上币负责人 Chase:比特币 2026 年必将创下历史新高
- 数据:310.01 枚 BTC 从匿名地址转出,经中转后流入 Kraken
- 持有 11 年比特币的巨鲸从币安提取 5300 万美元并偿还贷款
- 数据:过去 1 小时 Binance 净流出 4,814.61 万 USDT
- 当前主流 CEX、DEX 资金费率显示市场再度全面转向看空
- 数据:12 万枚 COMP 从 Coinbase Prime 转出,价值约 239 万美元
- 摩根大通:美元走弱将利好全球股市,而非拖累风险资产
- 数据:435.91 枚 BTC 从 Binance 转出,价值约 2071 万美元
- 长期做空 BTC巨鲸撤销 55,125 美元抄底BTC 限价买单
- 数据:过去 24 小时全网爆仓 3.23 亿美元,多单爆仓 4,926.27 万美元,空单爆仓 2.74 亿美元
- Vitalik:对预测市场现状感到担忧,应努力将其推向广义对冲用例
- 持有 11 年比特币 OG 向币安存入 5000 枚 BTC,价值 3.84 亿美元
- BTC OG 内幕巨鲸向 Binance 存入 5000 枚 BTC
- Vitalik Buterin:预测市场应转向风险对冲,而非短期投机
- 何一回应用户封控争议:涉 VPN 触发风控,账户转为提现模式
- 数据:4.85 万枚 SOL 从 Binance 转出,价值约 421 万美元
- 持有 6500 万美元资产的 Jake Paul 旗下基金投资 OpenAI 及 Polymarket
- 麻吉加仓 ETH 多单,现浮盈 15 万美元
- Zhu Su:加密货币未来几年可能将显著跑赢美股七巨头
- 比特币回升突破 7 万美元
- 数据:BTC 突破 70000 美元
- BTC 突破 70000 USDT,24H 涨幅 4.71%
- 本周美国以太坊现货 ETF 累计净流出 1.612 亿美元
- 数据:若 ETH 跌破 1,971 美元,主流 CEX 累计多单清算强度将达 8.39 亿美元
- X 产品负责人:即将允许用户直接基于时间线交易股票和加密货币
- 数据:218.6 枚 BTC 从 Bitstamp 转出,价值约 1.52 亿美元
- ARK Invest 再度买入约 1500 万美元 Coinbase 股票,结束此前减持
- HTX DAO 发布 2025 年度报告:生态建设、权益体系完善及全球化拓展持续推进
- 数据:ETH 全网合约持仓量 24h 增长 6.7%
- Ju.com 春节“主流币 8 折打新”首期 BTC 收官:逾万人参与,超募 740%
- 某鲸鱼向 MEXC 存入 200 万枚 PIPPIN,已实现盈利 360 万美元
- 先锋领航集团 CRCL 持仓已浮亏逾 4 亿美元
- F2Pool 联创 Wang Chun:聪明钱现在正买入比特币
- X 产品负责人:计划更新 API 政策,以阻止未经用户同意创建费用池的应用
- Solana 生态 Meme 币 BP 市值短时突破 1400 万美元,24 小时涨幅 160%
- DGrid 推出 Arena for Agent:让闲置 AI 模型自动为你赚钱
- 以太坊提币加速,过去 24 小时 CEX 净流出 10.12 万枚 ETH
- 累计做多 10.5 万枚 ETH 多头已扭亏为盈,现累计浮盈超 210 万美元
- 若比特币突破 7.1 万美元,主流 CEX 累计空单清算强度将达 8.83 亿
- 数据:ETH 当前全网 8 小时平均资金费率为 -0.0002%
- 观点:Meme 币市场出现经典投降信号,或酝酿反弹
- 传统指数震荡走高,Gate 指数专区交易热度稳步提升
- 比特币充币恢复,过去 24 小时 CEX 净流入 7,886.76 枚 BTC
比推专栏
更多 >>- Happy new year【Horse success】|0213Asian
- Was it finished?|0206 Asian
- 围猎以太坊多头:「巨鲸」们暴亏 70 亿美元,正被集体围观
- Challenge,risk And chances|0130 Asian
- Meta 豪赌 AI:砸钱 1350 亿美元,2026 的扎克伯格,值得相信么?
- Variables: Terrible snowstorm|0128 Asian
- 英特尔「生死线」时刻:在 ICU 门前,陈立武如何清算遗产并开启自救?
- 從1月13號到今天,提前到5100|0126Asian
- You Should work HARDER in 2026|0120 Asian
- 硅谷最聪明那群人的「终极推演」:2026,我们应该「All-In」什么?
观点
比推热门文章
- CZ:今年主要有家中文竞品在花钱黑我们,其他友商的竞争还算专业
- Galaxy Digital 高管:加密市场不会出现 V 型复苏,经历一段震荡期后才会逐步上涨
- Coinbase CEO:启用更多 x402 结账流程可使客服人员高效完成工作
- Polymarket 上预测本周六美国政府停摆概率降至 2%
- Binance 前上币负责人 Chase:比特币 2026 年必将创下历史新高
- 数据:310.01 枚 BTC 从匿名地址转出,经中转后流入 Kraken
- 持有 11 年比特币的巨鲸从币安提取 5300 万美元并偿还贷款
- 数据:过去 1 小时 Binance 净流出 4,814.61 万 USDT
- 当前主流 CEX、DEX 资金费率显示市场再度全面转向看空
- 数据:12 万枚 COMP 从 Coinbase Prime 转出,价值约 239 万美元
比推 APP



