sizes, less than 1 Kb for most cases. Fast verification with Ristretto and AVX2; scales well via batching and aggregation. No trusted setup - cheap on-the-fly initialization of verification circuit Blockchain requirement Constrained proof size (all nodes must receive and verify proofs) Fast verification (low latency - all verifiers must sync quickly) Ad hoc logic (different value flows, custom smart contracts)
bhi a' c' = <a', b'> a' = alo·x + ahi·x-1 b' = blo·x-1 + bhi·x c' = < alo·x + ahi·x-1, blo·x-1 + bhi·x > Prover gets random challenge scalar x from verifier b'
bhi c' = <a', b'> = <alo, blo> + <ahi, bhi> + x2·<alo, bhi> + x-2·<ahi, blo> same as c a' a' = alo·x + ahi·x-1 b' = blo·x-1 + bhi·x c' = < alo·x + ahi·x-1, blo·x-1 + bhi·x > b'
bhi c' = <a', b'> = <alo, blo> + <ahi, bhi> + x2·<alo, bhi> + x-2·<ahi, blo> let’s call this L let’s call this R same as c a' a' = alo·x + ahi·x-1 b' = blo·x-1 + bhi·x c' = < alo·x + ahi·x-1, blo·x-1 + bhi·x > b'
bhi c' = <a', b'> = <alo, blo> + <ahi, bhi> + x2·<alo, bhi> + x-2·<ahi, blo> c' = c + x2·L + x-2·R let’s call this L let’s call this R same as c a' a' = alo·x + ahi·x-1 b' = blo·x-1 + bhi·x c' = < alo·x + ahi·x-1, blo·x-1 + bhi·x > b'
bhi c' = <a', b'> let’s call this L let’s call this R Prover sends L, R to verifier Repeat! same as c = <alo, blo> + <ahi, bhi> + x2·<alo, bhi> + x-2·<ahi, blo> c' = c + x2·L + x-2·R a' a' = alo·x + ahi·x-1 b' = blo·x-1 + bhi·x c' = < alo·x + ahi·x-1, blo·x-1 + bhi·x > b'
generated (Fiat-Shamir) • All operations are actually over commitments instead of plain values • How we can use multi-exponentiation to acheive faster verification
1 1 v = Σ x 20 21 22 23 Let’s call the vector of bits aL Let’s make a vector aR that is aL - 1n. aL = bits of v aR = bits of v - 1n = aL - 1n Iff the bits of v are actually bits (0s or 1s), then this will be true: aL ∘aR = 0n -1 -1 0 0 0 0 0 0 0 0 1 1
want to prove: We can do this by proving: 1) v = ⟨aL,2n⟩ 2) aL∘aR = 0n 3) aR = aL - 1n binary structure of v bits are actually bits (0s or 1s) relation between bit representations
Verifier provides a random challenge scalar Prover combines the original statements: Since the prover cannot predict x, if the latter statement holds then with probability 1-1/p the first statements hold.
Prover combines the original statements: Since the prover cannot predict y, if the latter statement holds then with probability 1-n/p the first statements hold. This can also be written as: This can also be written as: Verifier provides a random challenge scalar
product: v = ⟨aL,2n⟩ aL ∘aR = 0n aR = aL - 1n aL ∘aR = 0n aL - 1n - aR = 0n ⟨aL ∘aR , yn⟩= 0 ⟨aL - 1n - aR , yn⟩ = 0 Verifier provides a random challenge scalar y:
generated (Fiat-Shamir) • How the commitments work (Pedersen Commitments, homomorphism) • How the values are blinded, and how we commit to the blinding factors
3x faster than libsecp256k1, 7x faster than Monero. 2x faster than libsecp256k1, 4.6x faster than Monero. with SIMD backends in curve25519-dalek AVX2 = 1.04 milliseconds