#pragma once #include "expanders.h" #include "linear_code_encode.h" #include #include "utils.hpp" #include "merkle_tree.h" struct MT_proof{ F sibling; size_t idx; vector<__hhash_digest> path; vector direction; }; struct FRI_proof{ F sibling; vector> query_points; vector Proofs; }; struct Virgo_proof{ FRI_proof Fri; vector query_paths; vector> query_points; }; struct shockwave_data{ int k; int N; F **encoded_matrix = nullptr,**matrix = nullptr; vector> MT; shockwave_data(){ encoded_matrix = nullptr; matrix = nullptr; } ~shockwave_data(){ if(k > 0){ for(int i = 0; i < k; i ++){ delete[] encoded_matrix[i]; delete[] matrix[i]; } delete[] encoded_matrix; delete[] matrix; } } }; struct Whir_data{ int k; vector poly; vector poly_com; vector> MT; vector>> FRI_MT; vector> FRI_poly; }; struct PC_data{ int k; vector poly; vector> poly_com; vector aggr_poly_com; vector aggr_poly; vector> MT; vector> aggr_MT; vector>> FRI_MT; vector> FRI_poly; }; typedef struct MT_proof; typedef struct FRI_proof; typedef struct Virgo_proof; typedef struct PC_data; typedef struct Whir_data; typedef struct shockwave_data; void FRI_commit(vector &poly, PC_data &data); void Virgo_commit(vector &poly, vector &encoded_poly, vector> &hash_tree,int partitions); Virgo_proof Virgo_open(vector &poly,vector &encoded_poly, vector> &hash_tree ,vector r, int partitions); void MT_commit(vector &elements, vector> &hashes, int partitions); MT_proof MT_Open(size_t idx, vector> &hashes); void MT_verify(MT_proof P, vector elements, size_t idx); void fri_prove(PC_data &data, vector x); void whir_prove(PC_data &data, vector x, double &vt, double &ps); void change_form(vector &poly, int logn, int l,int pos); void _whir_prove(Whir_data &data, vector x, double &vt, double &ps); void whir_commit(vector &poly, Whir_data &data); F fold(int i, vector arr,vector a, int N, int k); void shockwave_prove(shockwave_data *data, vector x, double &vt, double &ps); shockwave_data* shockwave_commit(vector &poly, int k);