零知识证明 - ethsnarks源代码导读
发布日期:2021-05-19 18:16:46 浏览次数:50 分类:精选文章

本文共 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在智能合约和负载均衡方面的优势,建议在相关领域的开发中进行参考。

    上一篇:零知识证明 - 深入理解ZoKrates
    下一篇:零知识证明 - bellman源码分析

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月16日 03时22分58秒