
零知识证明 – 电路及证明示例(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的散列函数。
技术改变世界
长按二维码关注我
比推快讯
更多 >>- Binance 接近达成协议,以解除美司法部强加的合规监督
- 英美两国将加强加密货币合作,重点关注稳定币事务
- Bitwise 提交稳定币与代币化 ETF 申请
- 分析师:美联储若确认多次降息,金价或再攀高峰
- Galaxy Digital 将推出代币化货币市场基金,与贝莱德和富兰克林邓普顿竞争
- 比特币短时拉升触及 11.6 万美元
- Movement Labs 正式转型为 L1 区块链,同时推出 Move 2.0
- 某巨鲸购入约 10 万美元的 STBL,浮盈 37 万美元
- 新建地址两日内从 OKX 提取 900 枚 BTC,价值逾 1 亿美元
- 特朗普家族旗下 American Bitcoin 今日在纳斯达克敲钟上市
- LimeWire 收购“Fyre Festival”品牌,计划于 2026 年以加密形式重启
- 中国驻法使馆提醒,警惕不法分子通过虚拟货币等诱饵吸引投资实施诈骗
- Keyrock 斥资 2780 万美元收购 Turing Capital,拓展至资管与财富管理领域
- 亚特兰大联储 GDPNow 模型预测美国第三季度 GDP 增速 3.4%
- Strategy 公司已将 470 亿美元固定收益和股权资本证券化为比特币
- MKR 超 75% 供应已升级为 SKY,延迟升级惩罚或将生效
- Tether Treasury 再次在以太坊链上新铸造 10 亿枚 USDT
- 鲍威尔本周对就业市场态度或指明未来降息政策方向
- 美财长为米兰辩护:人事安排非常合规,传递信号也很明确
- 英国搁置钢铁对美零关税配额计划,转谈永久性 25%关税
- 贝莱德买入 2.6 亿美元比特币,同时加码购入 3.6 亿美元以太坊
- 灰度:美元信誉受债务与通胀压力挑战,加密资产或成替代价值储藏
- 博雅互动斥资约 2816 万美元购入 245 枚比特币
- 调研:以太坊核心开发人员薪酬中位数约为 14 万美元,跳槽后可获翻倍薪酬
- 六大战略储备机构持有超百万枚 SOL,Forward Industries 位居首
- Tether 财库向 Binance 存入 5 亿枚 USDT
- 现货黄金首次登上 3700 关口
- 特朗普起诉《纽约时报》,因其损害特朗普声誉及 TRUMP 加密项目
- 美股早盘续涨,交易员为美联储降息做好准备
- 美国社区银行 Stablecore 完成 2,000 万美元融资,Coinbase Ventures 等参投
- 瑞士三家银行完成以太坊跨行支付试点
- 穆长春:数字人民币需在理论与实践上改革升级
- 欧股走低,德国 DAX 指数日内跌幅达 1%
- 美股开盘,道指涨 0.08%,台积电创历史新高
- 道琼斯指数开盘上涨 56.59 点,报 45,940.04 点
- 富国银行上调标普 500 指数 2026 年底目标至 7,400-7,600 点
- Falcon Finance 宣布成立 FF 基金会,暗示或即将 TGE
- 特朗普:已签署任命米兰担任美联储理事的文件,将移交美联储
- Circle 投资 HYPE 代币并考虑成为验证者
- 通胀回升与就业疲软并存,美联储降息面临两难局面
- Google 发布支持稳定币的 AI 支付协议,并与 Coinbase 达成合作
- 上市公司 GD Culture 收购 Pallas Capital 全部资产,包括 7,500 枚 BTC
- Hoth Therapeutics 更新加密货币财库策略,除 BTC 还将购买 ETH 和 SOL
- DOGE 财库公司 CleanCore 增持 1 亿枚 DOGE
- The Ether Machine 向美 SEC 提交 S-4 表格草案,推进公开上市进程
- 美国银行 CFO:立法明确性为稳定币开发铺平道路
- 美股上市公司 YSX Tech 与 XUnit 签署备忘录,共同建设合规驱动的 RWA 标准化平台
- Circle:原生 USDC 和 CCTP V2 已在 HyperEVM 上线
- 币安:STBL 代币空投目前遇到延迟
- 美国 8 月零售销售月率 0.6%,预期 0.2%