From 87f44f21df8562ff25815250fff87642c3b8088d Mon Sep 17 00:00:00 2001 From: arnaucube Date: Mon, 15 May 2023 22:22:27 +0200 Subject: [PATCH] add R1CS to CCS Sage impl (CCS: https://eprint.iacr.org/2023/552) --- notes_spartan.pdf | Bin 312472 -> 311947 bytes notes_spartan.tex | 3 +- r1cs-ccs.sage | 112 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 r1cs-ccs.sage diff --git a/notes_spartan.pdf b/notes_spartan.pdf index b1727aa024c98c7357bafd6fa5f696af646329fb..d7e50d6dacea0fd2da7d851ea9e9e3b5c7435261 100644 GIT binary patch delta 19547 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 P5vl}Xzje#N+>rfWZ#x`o diff --git a/notes_spartan.tex b/notes_spartan.tex index 9d6b7ff..ef71f50 100644 --- a/notes_spartan.tex +++ b/notes_spartan.tex @@ -135,8 +135,7 @@ Solution: combination of 3 protocols: \end{itemize} Observation: let $\widetilde{F}_{io}(r_x) = \overline{A}(r_x) \cdot \overline{B}(r_x) - \overline{C}(r_x)$, where -$$\overline{A}(r_x) = \sum_{y \in \{0,1\}} \widetilde{A}(r_x, y) \cdot \widetilde{Z}(y)$$ -$$\overline{B}(r_x) = \sum_{y \in \{0,1\}} \widetilde{B}(r_x, y) \cdot \widetilde{Z}(y)$$ +$$\overline{A}(r_x) = \sum_{y \in \{0,1\}} \widetilde{A}(r_x, y) \cdot \widetilde{Z}(y),~~\overline{B}(r_x) = \sum_{y \in \{0,1\}} \widetilde{B}(r_x, y) \cdot \widetilde{Z}(y)$$ $$\overline{C}(r_x) = \sum_{y \in \{0,1\}} \widetilde{C}(r_x, y) \cdot \widetilde{Z}(y)$$ Prover makes 3 separate claims: $\overline{A}(r_x)=v_A,~ \overline{B}(r_x)=v_B,~ \overline{C}(r_x)=v_C$, diff --git a/r1cs-ccs.sage b/r1cs-ccs.sage new file mode 100644 index 0000000..bf60dec --- /dev/null +++ b/r1cs-ccs.sage @@ -0,0 +1,112 @@ +# R1CS-to-CCS (https://eprint.iacr.org/2023/552) Sage prototype + +# utils +def matrix_vector_product(M, v): + n = M.nrows() + r = [F(0)] * n + for i in range(0, n): + for j in range(0, M.ncols()): + r[i] += M[i][j] * v[j] + return r +def hadamard_product(a, b): + n = len(a) + r = [None] * n + for i in range(0, n): + r[i] = a[i] * b[i] + return r +def vec_add(a, b): + n = len(a) + r = [None] * n + for i in range(0, n): + r[i] = a[i] + b[i] + return r +def vec_elem_mul(a, s): + r = [None] * len(a) + for i in range(0, len(a)): + r[i] = a[i] * s + return r +# end of utils + + +# can use any finite field, using a small one for the example +F = GF(101) + +# R1CS matrices for: x^3 + x + 5 = y (example from article +# https://www.vitalik.ca/general/2016/12/10/qap.html ) +A = matrix([ + [F(0), 1, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0], + [0, 1, 0, 0, 1, 0], + [5, 0, 0, 0, 0, 1], + ]) +B = matrix([ + [F(0), 1, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0], + ]) +C = matrix([ + [F(0), 0, 0, 1, 0, 0], + [0, 0, 0, 0, 1, 0], + [0, 0, 0, 0, 0, 1], + [0, 0, 1, 0, 0, 0], + ]) + +print("R1CS matrices:") +print("A:", A) +print("B:", B) +print("C:", C) + + +z = [F(1), 3, 35, 9, 27, 30] +print("z:", z) + +assert len(z) == A.ncols() + +n = A.ncols() # == len(z) +m = A.nrows() +# l = len(io) # not used for now + +# check R1CS relation +Az = matrix_vector_product(A, z) +Bz = matrix_vector_product(B, z) +Cz = matrix_vector_product(C, z) +print("\nR1CS relation check (Az ∘ Bz == Cz):", hadamard_product(Az, Bz) == Cz) +assert hadamard_product(Az, Bz) == Cz + + +# Translate R1CS into CCS: +print("\ntranslate R1CS into CCS:") + +# fixed parameters (and n, m, l are direct from R1CS) +t=3 +q=2 +d=2 +S1=[0,1] +S2=[2] +S = [S1, S2] +c0=1 +c1=-1 +c = [c0, c1] + +M = [A, B, C] + +print("CCS values:") +print("n: %s, m: %s, t: %s, q: %s, d: %s" % (n, m, t, q, d)) +print("M:", M) +print("z:", z) +print("S:", S) +print("c:", c) + +# check CCS relation +r = [F(0)] * m +for i in range(0, q): + hadamard_output = [F(1)]*m + for j in S[i]: + hadamard_output = hadamard_product(hadamard_output, + matrix_vector_product(M[j], z)) + + r = vec_add(r, vec_elem_mul(hadamard_output, c[i])) + +print("\nCCS relation check (∑ cᵢ ⋅ ◯ Mⱼ z == 0):", r == [0]*m) +assert r == [0]*m