53class ZkProver :
public ProverLayers<Field> {
54 using super = ProverLayers<Field>;
57 using typename super::inputs;
62 : ProverLayers<Field>(F),
64 n_witness_(c_.ninputs - c_.npub_in),
74 log(INFO,
"ZK Commit start");
79 for (
size_t i = 0; i < n_witness_; ++i) {
80 witness_[i] = W.v_[i + c_.npub_in];
85 size_t subfield_boundary = 0;
86 if (c_.subfield_boundary >= c_.npub_in) {
87 subfield_boundary = c_.subfield_boundary - c_.npub_in;
92 ZkCommon<Field>::setup_lqc(c_, lqc_, n_witness_ );
95 lp_ = std::make_unique<LigeroProver<Field, ReedSolomonFactory>>(zkp.param);
96 lp_->commit(zkp.com, tp, &witness_[0], subfield_boundary, &lqc_[0], rsf_,
99 log(INFO,
"ZK Commitment done");
103 check(lp_ !=
nullptr,
"must run commit before prove");
107 ZkCommon<Field>::initialize_sumcheck_fiat_shamir(tsp, c_, W, f_);
112 auto V = super::eval_circuit(&in, &c_, W.clone(), f_);
114 log(ERROR,
"eval_circuit failed");
117 for (
size_t i = 0; i < V->n1_; ++i) {
118 if (V->v_[i] != f_.zero()) {
119 log(ERROR,
"V->v_[i] != F.zero()");
127 super::prove(&zkp.proof, &pad_, &c_, in, &aux, bnd, tsts, f_);
128 log(INFO,
"ZK sumcheck done");
132 std::vector<LigeroLinearConstraint<Field>> a;
134 size_t ci = ZkCommon<Field>::verifier_constraints(c_, W, zkp.proof, &aux, a,
135 b, tsp, n_witness_, f_);
136 log(INFO,
"ZK constraints done");
143 const LigeroHash hash_of_A{0xde, 0xad, 0xbe, 0xef};
144 lp_->prove(zkp.com_proof, tsp, ci, a.size(), &a[0], hash_of_A, &lqc_[0],
147 log(INFO,
"Prover Done: flag");
153 for (
size_t i = 0; i < c_.nl; ++i) {
154 for (
size_t j = 0; j < c_.logc; ++j) {
155 for (
size_t k = 0; k < 4; ++k) {
158 pad_.l[i].cp[j].t_[k] = r;
159 witness_.push_back(r);
161 pad_.l[i].cp[j].t_[k] = f_.zero();
165 for (
size_t j = 0; j < c_.l[i].logw; ++j) {
166 for (
size_t h = 0; h < 2; ++h) {
167 for (
size_t k = 0; k < 3; ++k) {
170 pad_.l[i].hp[h][j].t_[k] = r;
171 witness_.push_back(r);
173 pad_.l[i].hp[h][j].t_[k] = f_.zero();
178 for (
size_t k = 0; k < 2; ++k) {
181 witness_.push_back(r);
185 Elt rr = f_.mulf(pad_.l[i].wc[0], pad_.l[i].wc[1]);
186 witness_.push_back(rr);
191 const size_t n_witness_;
195 std::vector<Elt> witness_;
196 std::vector<LigeroQuadraticConstraint> lqc_;
197 std::unique_ptr<LigeroProver<Field, ReedSolomonFactory>> lp_;