值得信赖的区块链资讯!
零知识证明 – 电路及证明示例(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的散列函数。
技术改变世界
长按二维码关注我
比推快讯
更多 >>- 哈塞特成为下一任美联储主席概率升至 56%
- Fundstrat 加密策略主管回应与 Tom Lee 分歧:仍看好 BTC 和 ETH 冲击新高
- Techub News:公司创始人 Alma 与 Central Research 无创始关联,Big Demo Day 为公开活动
- 麻吉大哥已将 BTC 和 HYPE 多单全部平仓,单周净亏约 146 万美元
- 10x Research:市场低迷走势尚未扭转,BTC 矿企和加密公司本周表现不佳
- 10x Research:强制平仓、加密立法进展受阻等因素导致比特币下跌
- 某波段巨鲸半小时前从币安提取 2000 枚 ETH,价值 598 万美元
- 报告,巴西加密货币活动增长 43%,用户平均投资额超 1000 美元
- 美国议员提议对小额稳定币支付和质押奖励实行税收减免
- Ethereum 已成为全球美元流动性的结算层,日处理约 900 亿至 100 亿美元稳定币转账
- 观点:2021 年后加密货币最大的真相是风险偏好资金将持续流向 AI 与机器人领域
- F2Pool 联创王纯曾为测试私钥安全,向可疑地址转 500 枚比特币后损失 490 枚
- 数据:美国投资市场杠杆率激增,保证金债务与 M2 之比高于 2000 年互联网泡沫时期
- 数据:比特币 RSI 接近 3 年最低点
- 数据:18.51 万枚 LINK 从 Binance 转出,价值约 231.51 万美元
- 加密社区为 Lummis 不再连任表示惋惜,并肯定其对行业做出的贡献
- 分析:链上数据显示情绪修复,BTC 清仓地址数开始减少
- 朝鲜相关黑客 2025 年窃取 20.2 亿美元加密货币,创历史新高
- Binance:BTW Pre-TGE 奖励代币设有锁定期,解锁时间可能不会提前公布
- 24 小时现货资金流入/流出榜:UNI 净流入 1132 万美元,WET 净流出 1130 万美元
- 某巨鲸再度从 Binance 提现 246,259 枚 LINK,价值 308 万美元
- BTC OG 内幕巨鲸当前多单总价值超 7.3 亿美元,总亏损超 4100 万美元
- 数据:当前加密恐慌贪婪指数为 21,处于极度恐慌状态
- 分析师:5000 万枚 USDT 钓鱼者大概率不会还钱,资金已换成 ETH 并经 Tornado 洗走
- OpenAI 因 ChatGPT 涉嫌参与谋杀案遭起诉
- SUI 生态 DeFi 基础设施 NAVI Protocol 将推出 Premium Exchange(PRE DEX)生态,构建去中心化溢价发现机制
- 中国对外经贸大学校长:建议自贸区试点稳定币中国方案
- 慢雾 CISO:警惕某 Polymarket 跟单交易机器人程序中隐藏恶意代码窃取私钥
- 数据:MIRA 24 小时跌超 22%
- 科技日报:警惕不法分子收购数字人民币钱包实施电信诈骗等违法犯罪活动
- Bitdeer 本周挖矿产出 144.1 枚 BTC,总持仓量为 1,996.7 枚环比下降近 20%
- Dragonfly Capital 过去 7 天向 Bybit 存入 600 万枚 MNT,仍持有 1076 万美元代币
- Etherealize 联创:加密行业需要在特朗普离任前证明自身价值
- RootData:SIGN 将于一周后解锁价值约 308 万美元的代币
- Arthur Hayes 接收约 13.7 万枚 PENDLE,价值约合 26 万美元
- 下周宏观展望:市场聚焦美联储主席提名人选,GDP 数据检验美联储降息成果
- 数据:过去 24 小时全网爆仓 6,863.14 万美元,多单爆仓 2,698.1 万美元,空单爆仓 4,165.04 万美元
- Gensyn 完成代币 AI 公募,投入金额总计约 1614 万美元
- Vitalik:预测市场是社交媒体的解药,可化解情绪化话题的疯狂观点
- 数据:Hyperliquid 平台鲸鱼当前持仓 51.89 亿美元,多空持仓比为 0.94
- ETHFI 投资者 3 小时前向币安存入 90 万枚 ETHFI,累计向币安存入 3128 万枚 ETHFI,价值 3658 万美元
- 数据:本周 NFT 交易额上涨 11.31% 至 6898 万美元,买家数量激增 50.28%
- Etherealize 联合创始人:加密行业须在特朗普卸任前取得实质性进展
- 某巨鲸从币安提现 2.72 亿枚 PENGU,价值 252 万美元
- 数据:1889 枚 ETH 从 Binance 转入 Wintermute,价值约 562 万美元
- 以太坊“Glamsterdam”升级拟于 2026 年上线,目标改善 MEV 公平性
- 观点:加密市场尚未表现出足够的恐慌以确认触底
- James Wynn 于 4 小时前平仓比特币空单获利 2.1 万美元,随后开多
- 美众议院两党议员起草加密税收草案,涉及稳定币免税与质押挖矿收益延期缴税
- Tom Lee 回应本人看多与旗下基金展望矛盾:短期防御和长期看涨可以并存
比推专栏
更多 >>观点
比推热门文章
- 哈塞特成为下一任美联储主席概率升至 56%
- Fundstrat 加密策略主管回应与 Tom Lee 分歧:仍看好 BTC 和 ETH 冲击新高
- Techub News:公司创始人 Alma 与 Central Research 无创始关联,Big Demo Day 为公开活动
- 麻吉大哥已将 BTC 和 HYPE 多单全部平仓,单周净亏约 146 万美元
- 10x Research:市场低迷走势尚未扭转,BTC 矿企和加密公司本周表现不佳
- 10x Research:强制平仓、加密立法进展受阻等因素导致比特币下跌
- 某波段巨鲸半小时前从币安提取 2000 枚 ETH,价值 598 万美元
- 报告,巴西加密货币活动增长 43%,用户平均投资额超 1000 美元
- 美国议员提议对小额稳定币支付和质押奖励实行税收减免
- Ethereum 已成为全球美元流动性的结算层,日处理约 900 亿至 100 亿美元稳定币转账
比推 APP



