diff --git a/groth16/bn128/arrays.nim b/groth16/bn128/arrays.nim index 4856d77..18146e3 100644 --- a/groth16/bn128/arrays.nim +++ b/groth16/bn128/arrays.nim @@ -55,7 +55,7 @@ func trueIndices*( bs: seq[bool] ): seq[int] = idxs[j] = i j += 1 return idxs - + func falseIndices*( bs: seq[bool] ): seq[int] = let k = countFalses(bs) var idxs: seq[int] = newSeq[int]( k ) @@ -66,6 +66,17 @@ func falseIndices*( bs: seq[bool] ): seq[int] = j += 1 return idxs +func selectTrues*[T]( bs: seq[bool] , xs: seq[T] ): seq[T] = + assert( bs.len == xs.len ) + let k = countTrues(bs) + var ys: seq[T] = newSeq[T]( k ) + var j = 0 + for (i,b) in bs.pairs: + if b: + ys[j] = xs[i] + j += 1 + return ys + func notBoolSeq*( us: seq[bool]): seq[bool] = let n = us.len var ws: seq[bool] = newSeq[bool]( n ) @@ -138,6 +149,33 @@ func sumSeqFr*(xs : seq[Fr[BN254_Snarks]]): Fr[BN254_Snarks] = s += xs[i] return s +func countNonZerosFr*( xs: seq[Fr[BN254_Snarks]] ): int = + var cnt = 0 + for x in xs: + if not isZeroFr(x): + cnt += 1 + return cnt + +# returns a mask and a filtered vector +func selectNonZerosFr*( xs: seq[Fr[BN254_Snarks]] ): (seq[bool] , seq[Fr[BN254_Snarks]]) = + var cnt = 0 + var mask: seq[bool] = newSeq[bool]( xs.len ) + for (i,x) in xs.pairs: + if isZeroFr(x): + mask[i] = false + else: + mask[i] = true + cnt += 1 + + var k = 0 + var short: seq[Fr[BN254_Snarks]] = newSeq[Fr[BN254_Snarks]]( cnt ) + for (i,x) in xs.pairs: + if mask[i]: + short[k] = x + k += 1 + + return (mask,short) + #------------------------------------------------------------------------------- # G1 arrays diff --git a/groth16/dynamic/finish.nim b/groth16/dynamic/finish.nim index 5976a4a..8247581 100644 --- a/groth16/dynamic/finish.nim +++ b/groth16/dynamic/finish.nim @@ -13,18 +13,26 @@ import std/options +import taskpools + import constantine/math/arithmetic import constantine/named/properties_fields import groth16/bn128 import groth16/bn128/arrays +import groth16/misc import groth16/zkey_types +import groth16/files/witness import groth16/math/domain import groth16/math/ntt import groth16/math/poly +import groth16/prover/types +import groth16/prover/shared +import groth16/partial/finish + import groth16/dynamic/types import groth16/dynamic/setup import groth16/dynamic/shared @@ -94,3 +102,59 @@ proc testCrossTermCoeffs*(N : int): bool = return (smart === reference) #------------------------------------------------------------------------------- + +proc finishDynaProofWithMaskV1*( zkey: ZKey, wtns: Witness, dynaPreProof: DynaPreProofV1, mask: Mask, pool: Taskpool, printTimings: bool): Proof = + + let N = zkey.header.domainSize + let M = zkey.header.nvars + let D = createDomain( N ) + + let partialMask = dynaPreProof.partialProof.partial_mask + + var deltaAB: OnlyAB + var witnessDelta: seq[Option[F]] = newSeq[Option[F]]( M ) + withMeasureTime(printTimings,"building deltaAz, deltaBz"): + for j in 0..