Skip to content

Commit

Permalink
Constant refactoring
Browse files Browse the repository at this point in the history
fractasy committed Jan 10, 2022
1 parent a35a7dd commit dd3d0ad
Showing 14 changed files with 80 additions and 59 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
# zkproverc

sudo apt install libomp-dev
sudo apt install libgmp-dev
sudo apt install nlohmann-json3-dev
sudo apt install postgresql
sudo apt install libpqxx-dev libpqxx-doc
sudo apt install nasm
sudo apt install libsecp256k1-dev
33 changes: 18 additions & 15 deletions src/batchmachine_executor.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@

#include <iostream>
#include <fstream>
#include "batchmachine_executor.hpp"
#include "poseidon_opt/poseidon_opt.hpp"
#include "scalar.hpp"
#include "compare_fe.hpp"
#include "utils.hpp"
#include "config.hpp"


void batchMachineExecutor (RawFr &fr, Mem &mem, Script &script, json &proof)
void BatchMachineExecutor::execute (Mem &mem, json &proof)
{
Poseidon_opt poseidon;

@@ -413,9 +413,11 @@ void batchMachineExecutor (RawFr &fr, Mem &mem, Script &script, json &proof)
}
}

proof = dereference(fr, mem, script.output);
proof = dereference(mem, script.output);
//cout << "batchMachineExecutor() build proof:" << endl;
//cout << proof.dump() << endl;
//std::ofstream o("/home/fractasy/git/zkproverc/testvectors/pretty.json");
//o << /*std::setw(4) <<*/ proof << std::endl;
}

/*
@@ -443,14 +445,14 @@ function dereference(F, mem, o) {
}
*/

json dereference(RawFr &fr, Mem &mem, Output &output)
json BatchMachineExecutor::dereference (const Mem &mem, const Output &output)
{
if (output.isArray())
{
json j = json::array();
for (uint64_t i=0; i<output.array.size(); i++)
{
j[i] = dereference(fr, mem, output.array[i]);
j[i] = dereference(mem, output.array[i]);
}
return j;
}
@@ -459,13 +461,13 @@ json dereference(RawFr &fr, Mem &mem, Output &output)
json j = json::object();
for (uint64_t i=0; i<output.objects.size(); i++)
{
j[output.objects[i].name] = dereference(fr, mem, output.objects[i]);
j[output.objects[i].name] = dereference(mem, output.objects[i]);
}
return j;
}
else
{
return refToObject(fr, mem, output.ref);
return refToObject(mem, output.ref);
}
}

@@ -489,7 +491,7 @@ function refToObject(F, mem, ref) {
}
*/

json refToObject(RawFr &fr, Mem &mem, Reference &ref)
json BatchMachineExecutor::refToObject (const Mem &mem, const Reference &ref)
{
switch (ref.type)
{
@@ -499,7 +501,8 @@ json refToObject(RawFr &fr, Mem &mem, Reference &ref)
}
case rt_field:
{
return fr.toString(mem[ref.id].fe, 16);
RawFr::Element fe = mem[ref.id].fe; // TODO: pass mem[ref.id].fe directly when finite fields library supports const parameters
return fr.toString(fe, 16);
}
case rt_pol:
{
@@ -519,7 +522,7 @@ json refToObject(RawFr &fr, Mem &mem, Reference &ref)
}
}

void calculateH1H2 (RawFr &fr, Reference &f, Reference &t, Reference &h1, Reference &h2)
void BatchMachineExecutor::calculateH1H2 (Reference &f, Reference &t, Reference &h1, Reference &h2)
{
zkassert(t.type == rt_pol);
zkassert(f.type == rt_pol);
@@ -591,7 +594,7 @@ void calculateH1H2 (RawFr &fr, Reference &f, Reference &t, Reference &h1, Refere
*/
}

void batchInverse (RawFr &fr, Reference &source, Reference &result)
void BatchMachineExecutor::batchInverse (RawFr &fr, Reference &source, Reference &result)
{
zkassert(source.type == rt_pol);
zkassert(result.type == rt_pol);
@@ -640,7 +643,7 @@ void batchInverse (RawFr &fr, Reference &source, Reference &result)
free(pInvert);
}

void batchInverseTest (RawFr &fr)
void BatchMachineExecutor::batchInverseTest (RawFr &fr)
{
uint64_t N = 1000000;

@@ -672,7 +675,7 @@ void batchInverseTest (RawFr &fr)
TimerStopAndLog(BATCH_INVERSE_TEST_MANUAL);

TimerStart(BATCH_INVERSE_TEST_BATCH);
batchInverse(fr, source, result);
BatchMachineExecutor::batchInverse(fr, source, result);
TimerStopAndLog(BATCH_INVERSE_TEST_BATCH);

for (uint64_t i=0; i<source.N; i++) zkassert( fr.eq(inverse.pPol[i], result.pPol[i]) );
@@ -682,7 +685,7 @@ void batchInverseTest (RawFr &fr)
free(inverse.pPol);
}

void evalPol (RawFr &fr, RawFr::Element *pPol, uint64_t polSize, RawFr::Element &x, RawFr::Element &result)
void BatchMachineExecutor::evalPol (RawFr::Element *pPol, uint64_t polSize, RawFr::Element &x, RawFr::Element &result)
{
if (polSize == 0)
{
@@ -697,7 +700,7 @@ void evalPol (RawFr &fr, RawFr::Element *pPol, uint64_t polSize, RawFr::Element
}
}

void polMulAxi (RawFr &fr, RawFr::Element *pPol, uint64_t polSize, RawFr::Element &init, RawFr::Element &acc)
void BatchMachineExecutor::polMulAxi (RawFr::Element *pPol, uint64_t polSize, RawFr::Element &init, RawFr::Element &acc)
{
RawFr::Element r = init;
for (uint64_t i=0; i<polSize; i++)
23 changes: 15 additions & 8 deletions src/batchmachine_executor.hpp
Original file line number Diff line number Diff line change
@@ -4,13 +4,20 @@
#include "mem.hpp"
#include "script.hpp"

void batchMachineExecutor (RawFr &fr, Mem &mem, Script &script, json &proof);
json dereference(RawFr &fr, Mem &mem, Output &output);
json refToObject(RawFr &fr, Mem &mem, Reference &ref);
void calculateH1H2(RawFr &fr, Reference &f, Reference &t, Reference &h1, Reference &h2);
void batchInverse (RawFr &fr, Reference &source, Reference &result);
void batchInverseTest (RawFr &fr);
void evalPol (RawFr &fr, RawFr::Element *pPol, uint64_t polSize, RawFr::Element &x, RawFr::Element &result);
void polMulAxi (RawFr &fr, RawFr::Element *pPol, uint64_t polSize, RawFr::Element &init, RawFr::Element &acc);
class BatchMachineExecutor
{
RawFr &fr;
const Script &script;
public:
BatchMachineExecutor (RawFr &fr, const Script &script) : fr(fr), script(script) {};
void execute (Mem &mem, json &proof);
json dereference (const Mem &mem, const Output &output);
json refToObject (const Mem &mem, const Reference &ref);
void calculateH1H2(Reference &f, Reference &t, Reference &h1, Reference &h2);
static void batchInverse (RawFr &fr, Reference &source, Reference &result);
static void batchInverseTest (RawFr &fr);
void evalPol (RawFr::Element *pPol, uint64_t polSize, RawFr::Element &x, RawFr::Element &result);
void polMulAxi (RawFr::Element *pPol, uint64_t polSize, RawFr::Element &init, RawFr::Element &acc);
};

#endif
4 changes: 2 additions & 2 deletions src/context.hpp
Original file line number Diff line number Diff line change
@@ -45,8 +45,8 @@ class Context {
RawFr &fr; // Finite field reference
mpz_class prime; // Prime number used to generate the finite field fr
Pols &pols; // PIL JSON file polynomials data
Input &input; // Input JSON file data
Context(RawFr &fr, Pols &pols, Input &input) : fr(fr), pols(pols), input(input), db(fr) { ; }; // Constructor, setting finite field reference
const Input &input; // Input JSON file data
Context(RawFr &fr, Pols &pols, const Input &input) : fr(fr), pols(pols), input(input), db(fr) { ; }; // Constructor, setting finite field reference

// Evaluations data
uint64_t zkPC; // Zero-knowledge program counter
18 changes: 10 additions & 8 deletions src/database.cpp
Original file line number Diff line number Diff line change
@@ -37,7 +37,7 @@ eDbResult Database::read (RawFr::Element &key, vector<RawFr::Element> &value)
exit(-1);
}

eDbResult Database::write (RawFr::Element &key, vector<RawFr::Element> &value)
eDbResult Database::write (RawFr::Element &key, const vector<RawFr::Element> &value)
{
switch (state)
{
@@ -58,7 +58,7 @@ eDbResult Database::write (RawFr::Element &key, vector<RawFr::Element> &value)
exit(-1);
}

eDbResult Database::create (RawFr::Element &key, vector<RawFr::Element> &value)
eDbResult Database::create (RawFr::Element &key, const vector<RawFr::Element> &value)
{
switch (state)
{
@@ -100,13 +100,13 @@ eDbResult Database::readLocal (RawFr::Element &key, vector<RawFr::Element> &valu
return dbr_ok;
}

eDbResult Database::writeLocal (RawFr::Element &key, vector<RawFr::Element> &value)
eDbResult Database::writeLocal (RawFr::Element &key, const vector<RawFr::Element> &value)
{
db[key] = value;
return dbr_ok;
}

eDbResult Database::createLocal (RawFr::Element &key, vector<RawFr::Element> &value)
eDbResult Database::createLocal (RawFr::Element &key, const vector<RawFr::Element> &value)
{
db[key] = value;
return dbr_ok;
@@ -237,7 +237,7 @@ eDbResult Database::readRemote (RawFr::Element &key, vector<RawFr::Element> &val
return dbr_ok;
}

eDbResult Database::writeRemote (RawFr::Element &key, vector<RawFr::Element> &value)
eDbResult Database::writeRemote (RawFr::Element &key, const vector<RawFr::Element> &value)
{
try
{
@@ -250,7 +250,8 @@ eDbResult Database::writeRemote (RawFr::Element &key, vector<RawFr::Element> &va
string valueString;
for (uint64_t i = 0; i < value.size(); i++)
{
aux = fr.toString(value[i], 16);
RawFr::Element fe = value[i]; // TODO: pass value[i] directly when finite fields library supports const parameters
aux = fr.toString(fe, 16);
valueString += NormalizeToNFormat(aux, 64);
}
string query = "UPDATE " + tableName + " SET data = E\'\\\\x" + valueString + "\' WHERE key = E\'\\\\x" + keyString + "\';";
@@ -273,7 +274,7 @@ eDbResult Database::writeRemote (RawFr::Element &key, vector<RawFr::Element> &va
return dbr_ok;
}

eDbResult Database::createRemote (RawFr::Element &key, vector<RawFr::Element> &value)
eDbResult Database::createRemote (RawFr::Element &key, const vector<RawFr::Element> &value)
{
try
{
@@ -286,7 +287,8 @@ eDbResult Database::createRemote (RawFr::Element &key, vector<RawFr::Element> &v
string valueString;
for (uint64_t i = 0; i < value.size(); i++)
{
aux = fr.toString(value[i], 16);
RawFr::Element fe = value[i]; // TODO: pass value[i] directly when finite fields library supports const parameters
aux = fr.toString(fe, 16);
valueString += NormalizeToNFormat(aux, 64);
}
string query = "INSERT INTO " + tableName + " ( hash, data ) VALUES ( E\'\\\\x" + keyString + "\', E\'\\\\x" + valueString + "\' );";
12 changes: 6 additions & 6 deletions src/database.hpp
Original file line number Diff line number Diff line change
@@ -38,23 +38,23 @@ class Database
eDbResult initLocal (void);
eDbResult initRemote (void);
eDbResult readLocal (RawFr::Element &key, vector<RawFr::Element> &value);
eDbResult writeLocal (RawFr::Element &key, vector<RawFr::Element> &value);
eDbResult createLocal (RawFr::Element &key, vector<RawFr::Element> &value);
eDbResult writeLocal (RawFr::Element &key, const vector<RawFr::Element> &value);
eDbResult createLocal (RawFr::Element &key, const vector<RawFr::Element> &value);

// Remote database based on Postgres (PostgreSQL)
pqxx::connection * pConnection;
string tableName;
eDbResult readRemote (RawFr::Element &key, vector<RawFr::Element> &value);
eDbResult writeRemote (RawFr::Element &key, vector<RawFr::Element> &value);
eDbResult createRemote (RawFr::Element &key, vector<RawFr::Element> &value);
eDbResult writeRemote (RawFr::Element &key, const vector<RawFr::Element> &value);
eDbResult createRemote (RawFr::Element &key, const vector<RawFr::Element> &value);

public:
Database(RawFr &fr) : fr(fr) { state = dbs_uninitialized; pConnection = NULL; };
~Database();
eDbResult init (void);
eDbResult read (RawFr::Element &key, vector<RawFr::Element> &value); // TODO: key to be const when ffi library allows
eDbResult write (RawFr::Element &key, vector<RawFr::Element> &value);
eDbResult create (RawFr::Element &key, vector<RawFr::Element> &value);
eDbResult write (RawFr::Element &key, const vector<RawFr::Element> &value);
eDbResult create (RawFr::Element &key, const vector<RawFr::Element> &value);
void print (void);
};

6 changes: 3 additions & 3 deletions src/executor.cpp
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ using json = nlohmann::json;
#define CODE_OFFSET 0x100000000
#define CTX_OFFSET 0x400000000

void Executor::execute (Input &input, Pols &pols)
void Executor::execute (const Input &input, Pols &cmPols)
{
TimerStart(EXECUTE_INITIALIZATION);
#ifdef LOG_TIME
@@ -45,7 +45,7 @@ void Executor::execute (Input &input, Pols &pols)
#endif

// Create context and store a finite field reference in it
Context ctx(fr, pols, input);
Context ctx(fr, cmPols, input);
ctx.prime = prime;
ctx.db.init();

@@ -65,7 +65,7 @@ void Executor::execute (Input &input, Pols &pols)

#ifdef INIT_DATABASE_WITH_INPUT_DATA
/* Copy input database content into context database */
map< RawFr::Element, vector<RawFr::Element>, CompareFe >::iterator it;
map< RawFr::Element, vector<RawFr::Element>, CompareFe >::const_iterator it;
for (it=input.db.begin(); it!=input.db.end(); it++)
{
RawFr::Element fe;
6 changes: 3 additions & 3 deletions src/executor.hpp
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@ class Executor {
mpz_class prime; // Prime number used to generate the finite field fr

// ROM JSON file data:
Rom &romData;
const Rom &romData;

// Poseidon instance
Poseidon_opt poseidon;
@@ -31,9 +31,9 @@ class Executor {
Smt smt;

// Constructor requires a RawFR
Executor(RawFr &fr, Rom &romData) : fr(fr), romData(romData), smt(ARITY) { GetPrimeNumber(fr, prime); }; // Constructor, setting finite field reference and prime
Executor(RawFr &fr, const Rom &romData) : fr(fr), romData(romData), smt(ARITY) { GetPrimeNumber(fr, prime); }; // Constructor, setting finite field reference and prime

void execute (Input &input, Pols &pols);
void execute (const Input &input, Pols &cmPols);

private:

2 changes: 1 addition & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
@@ -267,7 +267,7 @@ int main (int argc, char** argv)
RawFr fr;

#ifdef DEBUG
batchInverseTest(fr);
BatchMachineExecutor::batchInverseTest(fr);
#endif

/*************************/
4 changes: 2 additions & 2 deletions src/output.hpp
Original file line number Diff line number Diff line change
@@ -13,8 +13,8 @@ class Output
Reference ref; // Contains data if array.size()==0
vector<Output> array;
vector<Output> objects;
bool isArray (void) { return array.size() > 0; }
bool isObject (void) { return objects.size() > 0; }
bool isArray (void) const { return array.size() > 0; }
bool isObject (void) const { return objects.size() > 0; }
};

#endif
5 changes: 3 additions & 2 deletions src/prover.cpp
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
#include "mem.hpp"
#include "batchmachine_executor.hpp"

void Prover::prove (Input &input)
void Prover::prove (const Input &input)
{
/************/
/* Executor */
@@ -34,7 +34,8 @@ void Prover::prove (Input &input)

TimerStart(BM_EXECUTOR);
json proof;
batchMachineExecutor(fr, mem, script, proof);
BatchMachineExecutor bme(fr, script);
bme.execute(mem, proof);
TimerStopAndLog(BM_EXECUTOR);

/****************/
14 changes: 7 additions & 7 deletions src/prover.hpp
Original file line number Diff line number Diff line change
@@ -10,17 +10,17 @@
class Prover
{
RawFr &fr;
Rom &romData;
const Rom &romData;
Executor executor;
Script &script;
Pil &pil;
Pols &constPols;
string &cmPolsOutputFile;
const Script &script;
const Pil &pil;
const Pols &constPols;
const string &cmPolsOutputFile;
public:
Prover(RawFr &fr, Rom &romData, Script &script, Pil &pil, Pols &constPols, string &cmPolsOutputFile) :
Prover(RawFr &fr, const Rom &romData, const Script &script, const Pil &pil, const Pols &constPols, const string &cmPolsOutputFile) :
fr(fr), romData(romData), executor(fr, romData), script(script), pil(pil), constPols(constPols), cmPolsOutputFile(cmPolsOutputFile) {};

void prove (Input &input);
void prove (const Input &input);
};

#endif
2 changes: 1 addition & 1 deletion src/scalar.cpp
Original file line number Diff line number Diff line change
@@ -116,7 +116,7 @@ void scalar2fe (RawFr &fr, mpz_class &scalar, RawFr::Element &fe)
fr.fromMpz(fe, scalar.get_mpz_t());
}

void scalar2fea (RawFr &fr, mpz_class &scalar, RawFr::Element &fe0, RawFr::Element &fe1, RawFr::Element &fe2, RawFr::Element &fe3)
void scalar2fea (RawFr &fr, const mpz_class &scalar, RawFr::Element &fe0, RawFr::Element &fe1, RawFr::Element &fe2, RawFr::Element &fe3)
{
mpz_class band(0xFFFFFFFFFFFFFFFF);
mpz_class aux;
2 changes: 1 addition & 1 deletion src/scalar.hpp
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ void fe2scalar (RawFr &fr, mpz_class &scalar, RawFr::Element &fe);
void fea2scalar (RawFr &fr, mpz_class &scalar, RawFr::Element &fe0, uint64_t fe1, uint64_t fe2, uint64_t fe3);
void fea2scalar (RawFr &fr, mpz_class &scalar, RawFr::Element &fe0, RawFr::Element fe1, RawFr::Element fe2, RawFr::Element fe3);
void scalar2fe (RawFr &fr, mpz_class &scalar, RawFr::Element &fe);
void scalar2fea (RawFr &fr, mpz_class &scalar, RawFr::Element &fe0, RawFr::Element &fe1, RawFr::Element &fe2, RawFr::Element &fe3);
void scalar2fea (RawFr &fr, const mpz_class &scalar, RawFr::Element &fe0, RawFr::Element &fe1, RawFr::Element &fe2, RawFr::Element &fe3);

// Converts an hexa string to a field element
void string2fe (RawFr &fr, string s, RawFr::Element &fe);

0 comments on commit dd3d0ad

Please sign in to comment.