Skip to content
This repository was archived by the owner on Oct 28, 2024. It is now read-only.

Commit 749dbfd

Browse files
authored
Merge pull request #34 from HarryR/reduce-build-times
Reduce build times + C++ style improvements
2 parents eac23e2 + 6bdadc4 commit 749dbfd

25 files changed

+316
-223
lines changed

Diff for: src/CMakeLists.txt

+25-19
Original file line numberDiff line numberDiff line change
@@ -4,73 +4,79 @@ include_directories(
44
${DEPENDS_DIR}/libsnark/depends/libff
55
${DEPENDS_DIR}/libsnark/depends/libfqfft)
66

7+
add_library(ethsnarks_common STATIC export.cpp import.cpp stubs.cpp utils.cpp)
8+
target_link_libraries(ethsnarks_common snark)
79

8-
add_library(miximus SHARED mod/miximus.cpp)
9-
target_link_libraries(miximus snark)
10-
set_property(TARGET miximus PROPERTY POSITION_INDEPENDENT_CODE ON)
10+
add_library(miximus_objs OBJECT mod/miximus.cpp)
11+
12+
add_library(miximus_static STATIC $<TARGET_OBJECTS:miximus_objs>)
13+
target_link_libraries(miximus_static ethsnarks_common)
1114

15+
add_library(miximus SHARED $<TARGET_OBJECTS:miximus_objs>)
16+
target_link_libraries(miximus miximus_static)
17+
set_property(TARGET miximus PROPERTY POSITION_INDEPENDENT_CODE ON)
1218

1319
add_library(hashpreimage SHARED mod/hashpreimage.cpp)
14-
target_link_libraries(hashpreimage snark)
20+
target_link_libraries(hashpreimage ethsnarks_common)
1521
set_property(TARGET hashpreimage PROPERTY POSITION_INDEPENDENT_CODE ON)
1622

1723

1824
add_executable(miximus_cli miximus_cli.cpp)
19-
target_link_libraries(miximus_cli snark)
25+
target_link_libraries(miximus_cli miximus_static)
2026

2127

2228
add_executable(hashpreimage_cli hashpreimage_cli.cpp)
23-
target_link_libraries(hashpreimage_cli snark)
29+
target_link_libraries(hashpreimage_cli ethsnarks_common)
2430

2531

2632
add_executable(verify verify.cpp)
27-
target_link_libraries(verify snark)
33+
target_link_libraries(verify ethsnarks_common)
2834

2935

3036
add_executable(test_vk_raw2json test/test_vk_raw2json.cpp)
31-
target_link_libraries(test_vk_raw2json snark)
37+
target_link_libraries(test_vk_raw2json ethsnarks_common)
3238

3339

3440
add_executable(test_load_proofkey test/test_load_proofkey.cpp)
35-
target_link_libraries(test_load_proofkey snark)
41+
target_link_libraries(test_load_proofkey ethsnarks_common)
3642

3743

3844
add_executable(test_shamir_poly test/test_shamir_poly.cpp)
39-
target_link_libraries(test_shamir_poly snark)
45+
target_link_libraries(test_shamir_poly ethsnarks_common)
4046

4147

4248
add_executable(test_sha256_full_gadget test/test_sha256_full_gadget.cpp)
43-
target_link_libraries(test_sha256_full_gadget snark)
49+
target_link_libraries(test_sha256_full_gadget ethsnarks_common)
4450

4551

4652
add_executable(test_proof_raw2json test/test_proof_raw2json.cpp)
47-
target_link_libraries(test_proof_raw2json snark)
53+
target_link_libraries(test_proof_raw2json ethsnarks_common)
4854

4955

5056
add_executable(test_field_packing test/test_field_packing.cpp)
51-
target_link_libraries(test_field_packing snark)
57+
target_link_libraries(test_field_packing ethsnarks_common)
5258

5359

5460
add_executable(test_hashpreimage test/test_hashpreimage.cpp)
55-
target_link_libraries(test_hashpreimage snark)
61+
target_link_libraries(test_hashpreimage ethsnarks_common)
5662

5763

5864
add_executable(test_one_of_n test/test_one_of_n.cpp)
59-
target_link_libraries(test_one_of_n snark)
65+
target_link_libraries(test_one_of_n ethsnarks_common)
6066

6167

6268
add_executable(test_longsightf test/test_longsightf.cpp)
63-
target_link_libraries(test_longsightf snark)
69+
target_link_libraries(test_longsightf ethsnarks_common)
6470

6571

6672
add_executable(test_longsightf_bits test/test_longsightf_bits.cpp)
67-
target_link_libraries(test_longsightf_bits snark)
73+
target_link_libraries(test_longsightf_bits ethsnarks_common)
6874

6975

7076
add_executable(test_longsightf_merkletree test/test_longsightf_merkletree.cpp)
71-
target_link_libraries(test_longsightf_merkletree snark)
77+
target_link_libraries(test_longsightf_merkletree ethsnarks_common)
7278

7379

7480
add_executable(test_r1cs_gg_ppzksnark_zok r1cs_gg_ppzksnark_zok/tests/test_r1cs_gg_zok_ppzksnark.cpp)
75-
target_link_libraries(test_r1cs_gg_ppzksnark_zok snark)
81+
target_link_libraries(test_r1cs_gg_ppzksnark_zok ethsnarks_common)
7682

Diff for: src/ethsnarks.hpp

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef ETHSNARKS_HPP_
2+
#define ETHSNARKS_HPP_
3+
4+
#include <libff/algebra/curves/alt_bn128/alt_bn128_pp.hpp>
5+
#include <libsnark/gadgetlib1/protoboard.hpp>
6+
#include "r1cs_gg_ppzksnark_zok/r1cs_gg_ppzksnark_zok.hpp"
7+
8+
9+
namespace ethsnarks {
10+
11+
typedef libff::bigint<libff::alt_bn128_r_limbs> LimbT;
12+
typedef libff::alt_bn128_G1 G1T;
13+
typedef libff::alt_bn128_G2 G2T;
14+
typedef libff::alt_bn128_pp ppT;
15+
typedef libff::Fr<ppT> FieldT;
16+
typedef libsnark::protoboard<FieldT> ProtoboardT;
17+
18+
typedef libsnark::r1cs_gg_ppzksnark_zok_proof<ppT> ProofT;
19+
typedef libsnark::r1cs_gg_ppzksnark_zok_proving_key<ppT> ProvingKeyT;
20+
typedef libsnark::r1cs_gg_ppzksnark_zok_verification_key<ppT> VerificationKeyT;
21+
typedef libsnark::r1cs_gg_ppzksnark_zok_primary_input<ppT> PrimaryInputT;
22+
typedef libsnark::r1cs_gg_ppzksnark_zok_auxiliary_input<ppT> AuxiliaryInputT;
23+
24+
//using ProverF = libsnark::r1cs_gg_ppzksnark_zok_prover<ppT>;
25+
//typedef libsnark::r1cs_gg_ppzksnark_zok_verifier_strong_IC<ppT> VerifierF;
26+
//typedef libsnark::r1cs_gg_ppzksnark_zok_generator<ppT> GeneratorF;
27+
28+
}
29+
30+
#endif

Diff for: src/export.cpp

+11-17
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,17 @@
1717
along with Semaphore. If not, see <https://www.gnu.org/licenses/>.
1818
*/
1919

20-
#pragma once
21-
2220
#include <fstream>
2321
#include <iostream>
2422
#include <cassert>
2523
#include <iomanip>
2624

2725

28-
29-
#include "r1cs_gg_ppzksnark_zok/r1cs_gg_ppzksnark_zok.hpp"
30-
31-
#include <libff/algebra/curves/alt_bn128/alt_bn128_pp.hpp>
32-
3326
#include <libsnark/gadgetlib1/gadget.hpp>
3427

28+
#include "ethsnarks.hpp"
3529

36-
using namespace libsnark;
37-
using namespace libff;
30+
namespace ethsnarks {
3831

3932

4033
std::string HexStringFromBigint(libff::bigint<libff::alt_bn128_r_limbs> _x){
@@ -55,7 +48,7 @@ std::string HexStringFromBigint(libff::bigint<libff::alt_bn128_r_limbs> _x){
5548

5649
std::string outputPointG1AffineAsHex(libff::alt_bn128_G1 _p)
5750
{
58-
libff::alt_bn128_G1 aff = _p;
51+
G1T aff = _p;
5952
aff.to_affine_coordinates();
6053
//std::stringstream ss;
6154
//ss << "0x" << aff.X.as_bigint() << "," << aff.Y.as_bigint() << "," << aff.Z.as_bigint();
@@ -66,7 +59,7 @@ std::string outputPointG1AffineAsHex(libff::alt_bn128_G1 _p)
6659

6760
std::string outputPointG2AffineAsHex(libff::alt_bn128_G2 _p)
6861
{
69-
libff::alt_bn128_G2 aff = _p;
62+
G2T aff = _p;
7063

7164
if (aff.Z.c0.as_bigint() != "0" && aff.Z.c1.as_bigint() != "0" ) {
7265
aff.to_affine_coordinates();
@@ -79,8 +72,7 @@ std::string outputPointG2AffineAsHex(libff::alt_bn128_G2 _p)
7972
}
8073

8174

82-
template<typename ppT>
83-
std::string proof_to_json(r1cs_gg_ppzksnark_zok_proof<ppT> &proof, r1cs_primary_input<libff::Fr<ppT>> &input) {
75+
std::string proof_to_json(ProofT &proof, PrimaryInputT &input) {
8476
std::stringstream ss;
8577

8678
ss << "{\n";
@@ -104,8 +96,8 @@ std::string proof_to_json(r1cs_gg_ppzksnark_zok_proof<ppT> &proof, r1cs_primary_
10496
return(ss.str());
10597
}
10698

107-
template<typename ppT>
108-
std::string vk2json(r1cs_gg_ppzksnark_zok_verification_key<ppT> &vk )
99+
100+
std::string vk2json(VerificationKeyT &vk )
109101
{
110102
std::stringstream ss;
111103
unsigned icLength = vk.gamma_ABC_g1.rest.indices.size() + 1;
@@ -129,12 +121,14 @@ std::string vk2json(r1cs_gg_ppzksnark_zok_verification_key<ppT> &vk )
129121
}
130122

131123

132-
template<typename ppT>
133-
void vk2json_file(r1cs_gg_ppzksnark_zok_verification_key<ppT> &vk, std::string path )
124+
void vk2json_file(VerificationKeyT &vk, const std::string &path )
134125
{
135126
std::ofstream fh;
136127
fh.open(path, std::ios::binary);
137128
fh << vk2json(vk);
138129
fh.flush();
139130
fh.close();
140131
}
132+
133+
}
134+
// namespace ethsnarks

Diff for: src/export.hpp

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#ifndef ETHSNARKS_EXPORT_HPP_
2+
#define ETHSNARKS_EXPORT_HPP_
3+
4+
#include "ethsnarks.hpp"
5+
6+
namespace ethsnarks {
7+
8+
std::string HexStringFromBigint( LimbT _x);
9+
10+
std::string outputPointG1AffineAsHex( G1T _p );
11+
12+
std::string outputPointG2AffineAsHex( G2T _p );
13+
14+
std::string proof_to_json( ProofT &proof, PrimaryInputT &input );
15+
16+
std::string vk2json( VerificationKeyT &vk );
17+
18+
void vk2json_file( VerificationKeyT &vk, const std::string &path );
19+
20+
}
21+
22+
#endif

Diff for: src/gadgets/one_of_n.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@
66
#include <libsnark/gadgetlib1/gadget.hpp>
77
#include <libsnark/gadgetlib1/gadgets/basic_gadgets.hpp>
88

9+
#include "ethsnarks.hpp"
10+
911
using libsnark::gadget;
1012
using libsnark::pb_variable;
1113
using libsnark::pb_variable_array;
1214
using libsnark::protoboard;
1315
using libsnark::r1cs_constraint;
1416
using libsnark::generate_boolean_r1cs_constraint;
17+
using ethsnarks::FieldT;
1518

1619

1720
/**
@@ -42,7 +45,6 @@ using libsnark::generate_boolean_r1cs_constraint;
4245
*
4346
* This ensures that only 1 item is toggled, and whichever one it is is ours.
4447
*/
45-
template<typename FieldT>
4648
class one_of_n : public gadget<FieldT>
4749
{
4850
public:

Diff for: src/gadgets/sha256_full.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
#include <openssl/sha.h> // SHA256_CTX
1313

14-
#include "utils.cpp"
14+
#include "utils.hpp"
1515

1616
using namespace libsnark;
1717

Diff for: src/hashpreimage_cli.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
#include <fstream> // ofstream
77

88
#include "mod/hashpreimage.cpp"
9-
#include "utils.cpp" // hex_to_bytes
9+
#include "utils.hpp"
10+
#include "stubs.hpp"
1011

1112

1213
using std::cerr;
@@ -15,6 +16,9 @@ using std::ofstream;
1516
using std::ifstream;
1617
using std::stringstream;
1718

19+
using ethsnarks::stub_main_genkeys;
20+
using ethsnarks::stub_main_verify;
21+
1822

1923
static int main_prove( int argc, char **argv )
2024
{

Diff for: src/miximus_cli.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@
66
#include <fstream> // ofstream
77

88
#include "mod/miximus.cpp"
9-
#include "stubs.cpp"
10-
#include "utils.cpp" // hex_to_bytes
9+
#include "stubs.hpp"
10+
#include "utils.hpp" // hex_to_bytes
1111

1212

1313
using std::cerr;
1414
using std::cout;
1515
using std::endl;
1616
using std::ofstream;
1717

18+
using ethsnarks::stub_main_genkeys;
19+
using ethsnarks::stub_main_verify;
20+
1821

1922
static int main_prove( int argc, char **argv )
2023
{

Diff for: src/mod/hashpreimage.cpp

+14-13
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,23 @@
33

44
#include "hashpreimage.hpp"
55

6+
#include "ethsnarks.hpp"
7+
68
#include "gadgets/sha256_full.cpp"
7-
#include "utils.cpp"
8-
#include "export.cpp"
9+
#include "utils.hpp"
10+
#include "export.hpp"
911
#include "import.cpp"
10-
#include "stubs.cpp"
12+
#include "stubs.hpp"
1113

12-
#include <libff/algebra/curves/alt_bn128/alt_bn128_pp.hpp>
1314
#include <libff/algebra/fields/field_utils.hpp>
1415

1516
#include <openssl/sha.h>
1617

18+
using ethsnarks::FieldT;
19+
using ethsnarks::ProvingKeyT;
20+
using ethsnarks::ppT;
21+
using ethsnarks::proof_to_json;
1722

18-
template<typename FieldT>
1923
pb_variable_array<FieldT> pb_variable_array_allocate( protoboard<FieldT> &in_pb, size_t n, const std::string &annotation_prefix )
2024
{
2125
pb_variable_array<FieldT> res;
@@ -27,7 +31,6 @@ pb_variable_array<FieldT> pb_variable_array_allocate( protoboard<FieldT> &in_pb,
2731
/**
2832
* Verify that SHA256(private<512bit_block>) == public<output>
2933
*/
30-
template<typename FieldT>
3134
class mod_hashpreimage : public gadget<FieldT>
3235
{
3336
public:
@@ -64,7 +67,7 @@ class mod_hashpreimage : public gadget<FieldT>
6467
input_size_in_fields( libff::div_ceil(input_size_in_bits, FieldT::capacity()) ),
6568

6669
// packed input, given to prover/verifier
67-
input_as_field_elements( pb_variable_array_allocate<FieldT>(in_pb, input_size_in_fields, FMT(annotation_prefix, " input_as_field_elements")) ),
70+
input_as_field_elements( pb_variable_array_allocate(in_pb, input_size_in_fields, FMT(annotation_prefix, " input_as_field_elements")) ),
6871

6972
// public input digest, must match output
7073
expected_digest(in_pb, SHA256_digest_size, FMT(annotation_prefix, " expected_digest")),
@@ -149,12 +152,10 @@ class mod_hashpreimage : public gadget<FieldT>
149152

150153
char *hashpreimage_prove( const char *pk_file, const uint8_t *preimage_bytes64 )
151154
{
152-
typedef libff::alt_bn128_pp ppT;
153-
typedef libff::Fr<ppT> FieldT;
154155
ppT::init_public_params();
155156

156157
protoboard<FieldT> pb;
157-
mod_hashpreimage<FieldT> mod(pb, "module");
158+
mod_hashpreimage mod(pb, "module");
158159
mod.generate_r1cs_constraints();
159160
mod.generate_r1cs_witness(preimage_bytes64);
160161

@@ -163,7 +164,7 @@ char *hashpreimage_prove( const char *pk_file, const uint8_t *preimage_bytes64 )
163164
return nullptr;
164165
}
165166

166-
auto proving_key = loadFromFile<r1cs_gg_ppzksnark_zok_proving_key<ppT>>(pk_file);
167+
auto proving_key = loadFromFile<ProvingKeyT>(pk_file);
167168
// TODO: verify if proving key was loaded correctly, if not return NULL
168169

169170
auto primary_input = pb.primary_input();
@@ -176,11 +177,11 @@ char *hashpreimage_prove( const char *pk_file, const uint8_t *preimage_bytes64 )
176177

177178
int hashpreimage_genkeys( const char *pk_file, const char *vk_file )
178179
{
179-
return stub_genkeys<mod_hashpreimage>(pk_file, vk_file);
180+
return ethsnarks::stub_genkeys<mod_hashpreimage>(pk_file, vk_file);
180181
}
181182

182183

183184
bool hashpreimage_verify( const char *vk_json, const char *proof_json )
184185
{
185-
return stub_verify( vk_json, proof_json );
186+
return ethsnarks::stub_verify( vk_json, proof_json );
186187
}

0 commit comments

Comments
 (0)