nova-simplified.sage 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #!/usr/bin/env sage
  2. """
  3. Implements the simplified Nova scheme introduced in [1] Section 5.1
  4. [1] Nova: Recursive Zero-Knowledge Arguments from Folding Schemes
  5. https://eprint.iacr.org/2021/370.pdf
  6. [2] Nova: The ZK Bug of the Year (by Wilson Nguyen)
  7. https://www.youtube.com/watch?v=SOAQCL1NaYY
  8. """
  9. q = 0x40000000000000000000000000000000224698fc0994a8dd8c46eb2100000001
  10. K = GF(q)
  11. hash_table = {}
  12. def hash(key):
  13. if key in hash_table:
  14. return hash_table[key]
  15. c = K.random_element()
  16. while c > 2**250 - 1:
  17. c = K.random_element()
  18. hash_table[key] = c
  19. return c
  20. def fold(U, u):
  21. return U + (u,)
  22. z0 = 5
  23. F = lambda z, ω: 5*z
  24. i = 0
  25. ω0 = ()
  26. z1 = F(z0, ω0)
  27. u1 = hash((1, z0, z1, ()))
  28. U1 = ()
  29. # ZK proof
  30. assert u1 == hash((1, z0, z1, ()))
  31. i = 1
  32. ω1 = ()
  33. U2 = fold(U1, u1)
  34. z2 = F(z1, ω1)
  35. u2 = hash((i+1, z0, z2, U2))
  36. assert u1 == hash((i, z0, z1, U1))
  37. assert U2 == fold(U1, u1)
  38. assert u2 == hash((i+1, z0, z2, U2))
  39. i = 2
  40. ω2 = ()
  41. U3 = fold(U2, u2)
  42. z3 = F(z2, ω2)
  43. u3 = hash((i+1, z0, z3, U3))
  44. assert u2 == hash((i, z0, z2, U2))
  45. assert U3 == fold(U2, u2)
  46. assert u3 == hash((i+1, z0, z3, U3))
  47. # We've now made a proof of what 5^4 is
  48. assert z0 == 5
  49. assert z1 == 5*5
  50. assert z2 == 5*5*5
  51. assert z3 == 5^(i+2)