
零知识证明 – 电路及证明示例(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的散列函数。
技术改变世界
长按二维码关注我
比推快讯
更多 >>- 美股上市公司 Cosmos Health 增持 20 万美元 ETH,总投资达到 200 万美元
- 比特币矿企 Bitfarms 完成可转换优先票据发行募资净额约 5.68 亿美元
- Monad 生态 LST 协议 aPriori 疑似已注册空投申领相关的子域名
- 今晨 Tether Treasury 于以太坊链上新增铸造 10 亿枚 USDT
- 美国参议院两党关于加密货币监管的谈判陷入停滞
- “麻吉大哥”平仓 HYPE 多头头寸亏损 12.3 万美元,目前总亏损 1350 万美元
- Ethereal 推出主网 Alpha,开启 USDe 全生态布局
- 币安将移除 GALA/BTC 杠杆交易对
- Aerodrome 将推出代币发行平台 Aero Launch
- 数据:监测到 5,206.59 万 USDT 转入 Binance
- 加密货币 ETF 申请激增,分析师看好指数型产品前景
- 交易员 Eugene:市场仍处于地狱难度,优秀的交易员们也遭反复收割
- 美国百货连锁店 Bealls 宣布接受加密货币支付
- Ethereal 已正式上线主网 Alpha 版本
- Solana Mobile 将停止向第一代手机 Saga 提供软件更新支持
- Stellar 网络协议 24 升级在即,主网投票将于 17:00 UTC 举行
- DraftKings 收购获 CFTC 许可的预测市场交易所 Railbird
- 谷歌拟向 Anthropic 提供数百亿美元云算力
- ProShares 申请在纽交所上市ProShares CoinDesk Crypto20ETF
- 亚太地区三大证券交易所抵制上市公司转向加密财库(DAT)公司
- 数据:ETH 当前全网 8 小时平均资金费率为 0.0014%
- 以太坊基金会今晨内部转移 16 万枚 ETH,价值 6.54 亿美元
- 或属 Bitmine 的两个新建钱包从 FalconX 接收 4.58 万枚 ETH,价值 1.78 亿美元
- 1011 内幕巨鲸增加 BTC 空单至 2.26 亿美元,当前浮盈 615 万美元
- Jupiter 为庆祝 Ultra V3 推出举办价值 10 万美元的交易竞赛
- EigenCloud 与 Syndicate 合作推出 AVS 序列器网络
- Worldcoin 旗下 World App 集成 Polymarket Mini App
- Kadena 宣布停止运营,KDA 暴跌近六成
- 数据:过去 24h Binance 净流入 5.25 亿 USDT
- 特朗普:美联储主席鲍威尔即将离任,利率过高
- 美股收盘三大股指涨跌不一,贵金属概念领跌
- 美元指数上涨 0.35%,收于 98.934
- 标普 500 指数转跌,纳指跌幅达 0.2%,道指涨幅不足 0.6%
- 外媒:俄方上周末向美方重申全面控制顿巴斯立场
- 美联储 10 月降息 25 个基点的概率降至 96.7%
- 数据:ETH 全网合约持仓量 24h 增长 6.55%
- OpenAI 将发布新浏览器 ChatGPT ATLAS
- 比特币上涨触及 11.4 万美元
- “麻吉大哥”平掉 25 倍 ETH 多单转做 10 倍 HYPE 多单
- CZ:黄金不会归零,但比特币更好
- Moonshot 已上线索拉拉
- 欧洲和乌克兰已准备好一份计划,以结束俄乌冲突
- 纳斯达克 100 指数抹去跌幅,触及盘中高点
- 某高吸低抛的巨鲸近半小时花费 2914.6 万枚 DAI 购入 7221 枚 ETH
- Limitless 公布 LMTS 代币经济学,空投及激励占比 24.37%
- Base app 将于 10 月 25 日进行系统升级,部分功能将暂时不可用
- 格莱美奖得主 Imogen Heap、deadmau5 和 Richie Hawtin 已正式加入 Camp Network
- 据比推数据,ETH现报4074.39美元,1小时涨幅为5.11%,价格波动较大,请谨慎交易,控制风险。
- BitcoinOS 完成 1000 万美元融资,Greenfield Capital 领投
- 花旗给予Strategy买入评级,目标价485美元
比推专栏
更多 >>观点
比推热门文章
- Monad 生态 LST 协议 aPriori 疑似已注册空投申领相关的子域名
- 今晨 Tether Treasury 于以太坊链上新增铸造 10 亿枚 USDT
- 美国参议院两党关于加密货币监管的谈判陷入停滞
- “麻吉大哥”平仓 HYPE 多头头寸亏损 12.3 万美元,目前总亏损 1350 万美元
- Ethereal 推出主网 Alpha,开启 USDe 全生态布局
- 币安将移除 GALA/BTC 杠杆交易对
- Aerodrome 将推出代币发行平台 Aero Launch
- 数据:监测到 5,206.59 万 USDT 转入 Binance
- 加密货币 ETF 申请激增,分析师看好指数型产品前景
- 交易员 Eugene:市场仍处于地狱难度,优秀的交易员们也遭反复收割