
零知识证明 – 电路及证明示例(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的散列函数。
技术改变世界
长按二维码关注我
比推快讯
更多 >>- 美联储传声筒:职位空缺与失业人数的比例自 2021 年初以来首次跌破 1
- Holoworld 基金会正式成立,并发布 HOLO 代币经济学
- 过去 1 小时全网爆仓超 2500 万美元,主爆空单
- American Bitcoin 触发临时停牌,停牌前上涨 31%
- 美国就业数据公布后,美联储 9 月降息概率上升至 98%
- 美联储博斯蒂克:2025 年降息一次是合适的
- 美元指数 DXY 短线下挫 10 点,现货黄金短线走高 5 美元
- 美联储博斯蒂克:疲软的就业市场意味着一些政策放松是适当的
- 美国 7 月 JOLTs 职位空缺 718.1 万人,预期 737.8 万人
- 特朗普家族比特币矿企 American Bitcoin 申请市价发行 21 亿美元
- SOL Strategies:8 月末 SOL 持有量达到 402,623 枚
- 美股三大股指开盘普涨,加密货币概念股普涨
- 以太坊提币趋势延续,过去 24 小时 CEX 净流出 885.51 枚 ETH
- 道琼斯指数开盘下跌 73.51 点,纳指上涨 164.23 点
- 美联储官员称部分通胀因关税所致
- 美联储穆萨莱姆表示经济已达到充分就业,将有序降温
- 美股开盘,道指跌 0.06%,标普 500 涨 0.4%
- 美股开盘加密板块涨跌不一,Bitmine 上涨 1.93%
- 上市公司 CDT Equity 批准加密货币储备策略
- Webus 与中国国航签署战略合作,开启会员接入并引入未来 XRP 支付解决方案
- Trust Wallet 推出代币化股票和 ETF 服务
- 美联储官员穆萨利姆对 9 月可能降息持怀疑态度
- AlphaTON Capital 宣布融资以收购 1 亿美元的 TON 代币
- 昊天国际拟将剩余 3.575 亿港元配售资金改投以太坊,预计在一个月内全部动用
- CleanSpark:8 月挖矿产出 657 枚 BTC,比特币持有量达 12827 枚
- pump.fun 新费用模式推出后 24 小时已向创作者发放 200 万美元
- 美联储官员指出劳动力市场和房地产市场面临下行风险
- ArbitrumDAO 批准 2400 万枚 ARB 代币的激励计划以推动 DeFi 增长
- 现货黄金站上 3550 美元/盎司,创历史新高
- Pineapple Financial 将启动 1 亿美元 INJ 金库,FalconX、Abraxas 等参投
- 纽交所上市公司 Pineapple Financial 拟募资 1 亿美元建立 INJ 数字资产财库
- Tom Lee:Bitmine 加密货币储备速度远快于 Strategy,现持有约 89.8 亿美元的 ETH
- 美联储理事沃勒强调独立性的重要性
- 美联储理事沃勒:已明确表示应该在下次会议上降息
- FATF 主席:各国必须披露空壳公司所有者,罪犯正利用加密货币跨境转移资金
- 美元上行动能或难以为继,缺乏基本面支撑
- 与特朗普家族相关的 American Bitcoin 即将在纳斯达克上市
- JOLTS 数据不太可能改变市场对美联储政策前景的现有预期
- 美国合众银行重新提供加密货币托管服务,扩大产品范围至比特币 ETF
- 分析:BTC 在 11.1 万美元徘徊,机构对 ETH 需求仍强劲增长
- Bitget Launchpool 项目 PTB 现已开放投入,锁仓 BGB、PTB 解锁 2240 万枚 PTB
- Etherealize 完成 4000 万美元融资,Electric Capital 和 Paradigm 领投
- AlloyX 集团以 3.5 亿美元估值与纳斯达克上市公司华赢控股达成合并协议
- 吴杰庄:预计明年初将发放首张稳定币牌照
- XPL 获利 3800 万美元巨鲸剩余 XPL 多单浮亏超 360 万美元
- Galaxy 创始人 Novogratz:AI 代理将成为稳定币最大用户
- 以太坊储备概念股盘前普涨,BMNR 涨 3.55%
- AEON Pay 上线巴西 PIX 扫码支付,支持加密货币结算
- 网络犯罪分子利用 AI 语音钓鱼攻击加密货币高管
- Galaxy Digital 宣布在 Solana 链上实现股权代币化
比推专栏
更多 >>观点
比推热门文章
- 过去 1 小时全网爆仓超 2500 万美元,主爆空单
- American Bitcoin 触发临时停牌,停牌前上涨 31%
- 美国就业数据公布后,美联储 9 月降息概率上升至 98%
- 美联储博斯蒂克:2025 年降息一次是合适的
- 美元指数 DXY 短线下挫 10 点,现货黄金短线走高 5 美元
- 美联储博斯蒂克:疲软的就业市场意味着一些政策放松是适当的
- 美国 7 月 JOLTs 职位空缺 718.1 万人,预期 737.8 万人
- 特朗普家族比特币矿企 American Bitcoin 申请市价发行 21 亿美元
- Linea空投争议:为何有人获数万枚,有人颗粒无收?
- SOL Strategies:8 月末 SOL 持有量达到 402,623 枚