
本文共 2860 字,大约阅读时间需要 9 分钟。
ethsnarks项目是在libsnark的基础上实现的以太坊智能合约与zkSNARK相关的电路。该项目自身也是一套非常好的学习示例。ethsnarks主要关注了以太坊上基于ALT_BN128椭圆曲线的验证智能合约和特定算法的实现。
项目的源代码托管在GitHub上,但具体地址已在文本中标注。项目最后一次提交发生于2019年8月,主要 tension Add Fr field class to the field.py。Fr field的添加为后续功能的实现奠定了基础。
项目结构
项目的代码仓库分为多个部分:
contracts:实现了groth16验证智能合约、椭圆曲线计算、Merkle树以及MiMC哈希计算的智能合约。这些建议合同可以通过truffle部署并进行测试。部署脚本位于migrations目录中。
ethsnarks:提供了基于libsnark的Python实现,涵盖pedersen/mimc/poseidon等哈希函数、groth16验证以及椭圆曲线计算功能。
test:包含上述功能的测试代码,采用Python语言编写。
depends:依赖库包括libsnark、libfqfft等基础库。
src:基于libsnark的gadget1库,实现了更多高级功能。本文将重点介绍这些gadget的实现。
核心实现
ethsnarks项目的实现聚焦于以下几个方面:
ethsnarks.hpp:
- 该文件轻量化了在ALT_BN128上实现的类型声明,主要涉及:
- LimbT、G1T、G2T、ppT等椭圆曲线相关类型。
- ProtoboardT、VariableT、ConstraintT等电路构建相关类型。
- GadgetT等功能模块类型。
utils.hpp/utils.cpp:
- 实现了电路实现中常见的功能性函数,例如:
- make_variable用于创建VariableT对象。
- flatten函数用于将多个VariableArrayT合并成一个VariableArray。
r1cs_gg_ppzksnark_zok:
- 在libsnark的基础上,对预编译合约进行了修改,使其能够支持groth16验证。修改目的是为了兼容以太坊的拜占庭硬分叉后的预编译合约结构。
- 该修改主要涉及验证系数的调整以及验证等式的重新定义。
- 代码中提供了stubs.hpp/stubs.cpp模块,用于从JSON文件读取验证参数并执行验证。
poseidon:
- poseidon算法的实现位于gadgets/poseidon.hpp文件中。
- Poseidon128是Poseidon_gadget_T的一个实例,参数配置为:
- nInputs:输入数量。
- nOutputs:输出数量。
- constrainOutputs:是否对输出进行约束。
示例代码
在ethsnarks基础上,实现poseidon函数的电路非常简单。以下是一个示例:
#include "ethsnarks.hpp"#include "gadgets/poseidon.hpp"using namespace ethsnarks;namespace testproject { using TestHash = Poseidon128<2, 1>; class test_gadget : public GadgetT { public: VariableT output; VariableT input0; VariableT input1; TestHash tHash; test_gadget(ProtoboardT& pb, const std::string& prefix) : GadgetT(pb, prefix) { output = make_variable(pb, FMT(prefix, ".output")); input0 = make_variable(pb, FMT(prefix, ".input0")); input1 = make_variable(pb, FMT(prefix, ".input1")); tHash = TestHash(pb, create_var_array({input0, input1}), FMT(prefix, ".testhash")); } void generate_r1cs_witness(ethsnarks::FieldT w_input0, ethsnarks::FieldT w_input1, ethsnarks::FieldT w_output) { pb.val(input0) = w_input0; pb.val(input1) = w_input1; pb.val(output) = w_output; tHash.generate_r1cs_witness(); } void generate_r1cs_constraints() { pb.set_input_sizes(1); tHash.generate_r1cs_constraints(); pb.add_r1cs_constraint( ConstraintT(output, 1, tHash.result()), FMT(annotation_prefix, " output == Poseidon(input0 || input1) ") ); } };}
这个示例代码展示了如何在ethsnarks基础上构建poseidon算法的电路。通过该电路,可以实现基于ALT_BN128椭圆曲线的哈希计算。在测试环境中,可以通过truffle部署合约并执行验证。
总结
ethsnarks项目在libsnark基础上实现了以太坊上支持groth16验证的智能合约和相关电路。项目结构清晰,支持快速部署和测试。通过本文的介绍,可以清楚地看到ethsnarks在智能合约和负载均衡方面的优势,建议在相关领域的开发中进行参考。
发表评论
最新留言
关于作者
