ethsnarks在libsnark的基础上,实现了以太坊上与zkSNARK相关的智能合约和电路。ethsnarks本身也是libsnark应用很好的学习示例。
ethsnarks的源代码地址:
https://github.com/HarryR/ethsnarks.git
本文中使用的ethsnarks源代码的最后一个commit如下:
commit 9adc64355adb9154ba5042c0fadf84c438b8a08a
Author: Wanseob Lim <email@wanseob.com>
Date: Fri Aug 16 01:49:19 2019 +0900
Add Fr field class to the field.py
源代码结构
contracts - 实现了groth16的验证智能合约(Verifier.sol),椭圆曲线的计算,MerkleTree以及MiMC Hash计算的智能合约。这些智能合约可以通过truffle进行部署测试。部署相关的脚本在migrations目录下。
ethsnarks - python实现的相关功能,包括pedersen/mimc/poseidon等hash函数,groth16验证,以及椭圆曲线的计算。
test - 以上两个功能的测试代码,采用python语言实现。
depends - 依赖库,包括libsnark,libfqfft等等。
src - 基于libsnark的gadget1库实现的更多的gadget。本文着重介绍这些gadget的实现。
gadget实现
2.1 ethsnarks.hpp
libsnark的gadget1库主要围绕sha256(基于bit的hash函数)实现各种gadgets。ethsnarks在alt_bn128这条椭圆曲线上实现了基于Field的hash函数(mimc,pedersen,poseidon等)。
libsnark的电路中各种定义都非常长。libsnark定义一个变量数组类型:pb_variable_array。
ethsnarks.hpp精简了在alt_bn128这条椭圆曲线相关的类型声明:
namespace ethsnarks {
typedef libff::bigint<libff::alt_bn128_r_limbs> LimbT;
typedef libff::alt_bn128_G1 G1T;
typedef libff::alt_bn128_G2 G2T;
typedef libff::alt_bn128_pp ppT;
typedef libff::Fq<ppT> FqT;
typedef libff::Fr<ppT> FieldT;
typedef libsnark::r1cs_constraint<FieldT> ConstraintT;
typedef libsnark::protoboard<FieldT> ProtoboardT;
typedef libsnark::pb_variable<ethsnarks::FieldT> VariableT;
typedef libsnark::pb_variable_array<FieldT> VariableArrayT;
typedef libsn