
零知识证明 – 电路及证明示例(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的散列函数。
技术改变世界
长按二维码关注我
比推快讯
更多 >>- Tether CEO:将确保 USDT 符合《GENIUS 法案》规定,但仍计划推出专门针对美国的稳定币
- SharpLink Gaming 再增持 19,084 枚 ETH
- 美股收盘:三大股指涨跌不一,Circle 跌 4.71%,Coinbase 涨 2.2%
- Sharplink Gaming 计划发行 50 亿美元股票以购入 ETH
- Ether.fi 将上线 HyperLiquid 生态,推出 beHYPE 质押代币
- 黑客持续侦察 TeleMessage 漏洞,已有多起攻击尝试
- 分析:GENIUS 法案禁收益型稳定币,将利好以太坊 DeFi
- 加密交易所 Bullish 向纽交所申请上市
- Aether Holdings 将融资 4000 万美元,并购买比特币以启用比特币财务储备
- 支付公司 Block 将加入标普 500 指数
- Cantor Equity Partners IV 提交 IPO 申请
- WLFI 代币计划两月内全面上线,预售表现已使其市值跻身前11
- 美国总统特朗普:致力于在今年签署加密市场立法
- 特朗普:承诺绝不允许在美国创建央行数字货币(CBDC)
- 特朗普:当关税信函上面写明征收 35%、40% 关税的时候,那就是协议
- 特朗普:加密货币涨幅超过任何股票,加密货币对美元和国家都有好处
- 特朗普签署GENIUS 法案
- 特朗普:稳定币法案是对加密货币的重大认可
- 特朗普:将很快宣布重大贸易协议
- 美国总统特朗普:《GENIUS 法案》(天才法案)——他们以我的名字命名
- 特朗普:《GENIUS 法案》将确保美国在加密技术领域实现全球主导地位
- Galaxy Digital高管:投资者对加密行业的犹豫正迅速消散
- WLFI:WLFI 代币可交易性已获批准,预计将在 6 到 8 周内全面启动
- WLFI 增持价值约 4 万美元的 BANK 及 TAG 代币
- 摩根大通:在美国以外,代币化银行存款比稳定币更受监管青睐
- Aave Prime 上的 wstETH 存款突破 10 亿美元
- 美国参议院农业委员会下周一将就 Brian Quintenz 出任 CFTC 主席的提名进行投票
- 特朗普寻求对所有欧盟商品征收至少 15-20%的关税
- 德总理:欧美关税谈判进入最后阶段
- 过去一周 IBIT 资金流入跃居贝莱德旗下 ETF 排行榜榜首,ETHA 排在第五位
- Cardano 网络出现一笔交易费超 370 万枚 ADA 的转账,约合 303 万美元
- 美联储古尔斯比:未来一年利率有望大幅下降
- Bitcoin Treasury Capital 增持 4.5 枚比特币,累计持仓数升至 156 枚
- 特朗普今日将签署《GENIUS 法案》,正式成为法律
- 美国财政部副部长:加密货币规则进一步巩固美元作为标准货币
- AguilaTrades 关闭比特币多单并新开设 15 倍以太坊空单,爆仓价 4,091.77 美元
- 疑似 Trend Research 地址从 CEX 提出 100.45 万枚 UNI,价值超 1069 万美元
- Giants Protocol:正考虑锁定 90%团队代币
- 美国 7 月通胀预期连续回落,消费者信心变化不大
- 美股上市公司 BTCS 上涨 28.67%,此前以循环借贷的方式增持 ETH
- 美股 BTOG 涨超 46%,市值升至 5450 万美元
- 美国 7 月一年期通胀率预期初值 4.4%,预期 5.00%
- 观点:比特币巨鲸向 CEX 转账速度加快,可能表明出现资本轮动或获利了结趋势
- Coinbase 股价创下自 2021 年 IPO 以来新高
- 纳斯达克上市公司 BIYA 拟收购 UpTop.Meme 母公司 Starfish,进军 Web3 并预期增利 1500 万美元
- 特朗普:将在当地时间下午 2:30(北京时间次日凌晨 2:30)于白宫签署重要协议
- 美国运通 CEO:公司正在探索稳定币方面的机会
- 美国运通 CEO:稳定币更像是一种投资工具,不会取代法定货币
- Binance 将恢复多个 U 本位永续合约资金费率结算频率
- 上市公司 MEI Pharm 建立 LTC 财库,承诺投入超 1 亿美元
比推专栏
更多 >>观点
比推热门文章
- 黑客持续侦察 TeleMessage 漏洞,已有多起攻击尝试
- 分析:GENIUS 法案禁收益型稳定币,将利好以太坊 DeFi
- 加密交易所 Bullish 向纽交所申请上市
- Aether Holdings 将融资 4000 万美元,并购买比特币以启用比特币财务储备
- 支付公司 Block 将加入标普 500 指数
- “美元引擎”启动:稳定币合法化如何点燃以太坊的超级周期?
- Cantor Equity Partners IV 提交 IPO 申请
- WLFI 代币计划两月内全面上线,预售表现已使其市值跻身前11
- 美国总统特朗普:致力于在今年签署加密市场立法
- 特朗普:承诺绝不允许在美国创建央行数字货币(CBDC)