go-snark/wasm/utils/utils.go
wasm/utils/utils.goRaw
1package utils
2
3import (
4 "errors"
5 "math/big"
6
7 snark "github.com/arnaucube/go-snark"
8 "github.com/arnaucube/go-snark/circuitcompiler"
9)
10
11// []*big.Int
12func ArrayBigIntToString(b []*big.Int) []string {
13 var o []string
14 for i := 0; i < len(b); i++ {
15 o = append(o, b[i].String())
16 }
17 return o
18}
19func ArrayStringToBigInt(s []string) ([]*big.Int, error) {
20 var px []*big.Int
21 for i := 0; i < len(s); i++ {
22 param, ok := new(big.Int).SetString(s[i], 10)
23 if !ok {
24 return nil, errors.New("error parsing px from pxString")
25 }
26 px = append(px, param)
27 }
28 return px, nil
29}
30
31// [3]*big.Int
32func String3ToBigInt(s [3]string) ([3]*big.Int, error) {
33 var o [3]*big.Int
34 for i := 0; i < len(s); i++ {
35 param, ok := new(big.Int).SetString(s[i], 10)
36 if !ok {
37 return o, errors.New("error parsing [3]*big.Int from [3]string")
38 }
39 o[i] = param
40 }
41 return o, nil
42}
43func BigInt3ToString(b [3]*big.Int) [3]string {
44 var o [3]string
45 o[0] = b[0].String()
46 o[1] = b[1].String()
47 o[2] = b[2].String()
48 return o
49}
50
51// [][3]*big.Int
52func Array3StringToBigInt(s [][3]string) ([][3]*big.Int, error) {
53 var o [][3]*big.Int
54 for i := 0; i < len(s); i++ {
55 parsed, err := String3ToBigInt(s[i])
56 if err != nil {
57 return o, err
58 }
59 o = append(o, parsed)
60 }
61 return o, nil
62}
63func Array3BigIntToString(b [][3]*big.Int) [][3]string {
64 var o [][3]string
65 for i := 0; i < len(b); i++ {
66 o = append(o, BigInt3ToString(b[i]))
67 }
68 return o
69}
70
71func String2ToBigInt(s [2]string) ([2]*big.Int, error) {
72 var o [2]*big.Int
73 for i := 0; i < len(s); i++ {
74 param, ok := new(big.Int).SetString(s[i], 10)
75 if !ok {
76 return o, errors.New("error parsing [2]*big.Int from [2]string")
77 }
78 o[i] = param
79 }
80 return o, nil
81}
82
83// [3][2]*big.Int
84func String32ToBigInt(s [3][2]string) ([3][2]*big.Int, error) {
85 var o [3][2]*big.Int
86 var err error
87
88 o[0], err = String2ToBigInt(s[0])
89 if err != nil {
90 return o, err
91 }
92 o[1], err = String2ToBigInt(s[1])
93 if err != nil {
94 return o, err
95 }
96 o[2], err = String2ToBigInt(s[2])
97 if err != nil {
98 return o, err
99 }
100 return o, nil
101}
102func BigInt32ToString(b [3][2]*big.Int) [3][2]string {
103 var o [3][2]string
104 o[0][0] = b[0][0].String()
105 o[0][1] = b[0][1].String()
106 o[1][0] = b[1][0].String()
107 o[1][1] = b[1][1].String()
108 o[2][0] = b[2][0].String()
109 o[2][1] = b[2][1].String()
110 return o
111}
112
113// [][3][2]*big.Int
114func Array32StringToBigInt(s [][3][2]string) ([][3][2]*big.Int, error) {
115 var o [][3][2]*big.Int
116 for i := 0; i < len(s); i++ {
117 parsed, err := String32ToBigInt(s[i])
118 if err != nil {
119 return o, err
120 }
121 o = append(o, parsed)
122 }
123 return o, nil
124}
125func Array32BigIntToString(b [][3][2]*big.Int) [][3][2]string {
126 var o [][3][2]string
127 for i := 0; i < len(b); i++ {
128 o = append(o, BigInt32ToString(b[i]))
129 }
130 return o
131}
132
133// Setup
134type SetupString struct {
135 // public
136 G1T [][3]string
137 G2T [][3][2]string
138 Pk struct {
139 A [][3]string
140 B [][3][2]string
141 C [][3]string
142 Kp [][3]string
143 Ap [][3]string
144 Bp [][3]string
145 Cp [][3]string
146 Z []string
147 }
148 Vk struct {
149 Vka [3][2]string
150 Vkb [3]string
151 Vkc [3][2]string
152 IC [][3]string
153 G1Kbg [3]string
154 G2Kbg [3][2]string
155 G2Kg [3][2]string
156 Vkz [3][2]string
157 }
158}
159
160func SetupToString(setup snark.Setup) SetupString {
161 var s SetupString
162 s.G1T = Array3BigIntToString(setup.G1T)
163 s.G2T = Array32BigIntToString(setup.G2T)
164 s.Pk.A = Array3BigIntToString(setup.Pk.A)
165 s.Pk.B = Array32BigIntToString(setup.Pk.B)
166 s.Pk.C = Array3BigIntToString(setup.Pk.C)
167 s.Pk.Kp = Array3BigIntToString(setup.Pk.Kp)
168 s.Pk.Ap = Array3BigIntToString(setup.Pk.Ap)
169 s.Pk.Bp = Array3BigIntToString(setup.Pk.Bp)
170 s.Pk.Cp = Array3BigIntToString(setup.Pk.Cp)
171 s.Pk.Z = ArrayBigIntToString(setup.Pk.Z)
172 return s
173}
174func SetupFromString(s SetupString) (snark.Setup, error) {
175 var o snark.Setup
176 var err error
177 o.G1T, err = Array3StringToBigInt(s.G1T)
178 if err != nil {
179 return o, err
180 }
181 o.G2T, err = Array32StringToBigInt(s.G2T)
182 if err != nil {
183 return o, err
184 }
185 o.Pk.A, err = Array3StringToBigInt(s.Pk.A)
186 if err != nil {
187 return o, err
188 }
189 o.Pk.B, err = Array32StringToBigInt(s.Pk.B)
190 if err != nil {
191 return o, err
192 }
193 o.Pk.C, err = Array3StringToBigInt(s.Pk.C)
194 if err != nil {
195 return o, err
196 }
197 o.Pk.Kp, err = Array3StringToBigInt(s.Pk.Kp)
198 if err != nil {
199 return o, err
200 }
201 o.Pk.Ap, err = Array3StringToBigInt(s.Pk.Ap)
202 if err != nil {
203 return o, err
204 }
205 o.Pk.Bp, err = Array3StringToBigInt(s.Pk.Bp)
206 if err != nil {
207 return o, err
208 }
209 o.Pk.Cp, err = Array3StringToBigInt(s.Pk.Cp)
210 if err != nil {
211 return o, err
212 }
213 o.Pk.Z, err = ArrayStringToBigInt(s.Pk.Z)
214 if err != nil {
215 return o, err
216 }
217 return o, nil
218
219}
220
221// circuit
222type CircuitString struct {
223 NVars int
224 NPublic int
225 NSignals int
226 PrivateInputs []string
227 PublicInputs []string
228 Signals []string
229 Witness []string
230 Constraints []circuitcompiler.Constraint
231 R1CS struct {
232 A [][]string
233 B [][]string
234 C [][]string
235 }
236}
237
238func ArrayArrayBigIntToString(b [][]*big.Int) [][]string {
239 var o [][]string
240 for i := 0; i < len(b); i++ {
241 o = append(o, ArrayBigIntToString(b[i]))
242 }
243 return o
244}
245func ArrayArrayStringToBigInt(s [][]string) ([][]*big.Int, error) {
246 var o [][]*big.Int
247 for i := 0; i < len(s); i++ {
248 parsed, err := ArrayStringToBigInt(s[i])
249 if err != nil {
250 return o, err
251 }
252 o = append(o, parsed)
253 }
254 return o, nil
255}
256func CircuitToString(c circuitcompiler.Circuit) CircuitString {
257 var cs CircuitString
258 cs.NVars = c.NVars
259 cs.NPublic = c.NPublic
260 cs.NSignals = c.NSignals
261 cs.PrivateInputs = c.PrivateInputs
262 cs.PublicInputs = c.PublicInputs
263 cs.Signals = c.Signals
264 cs.Witness = ArrayBigIntToString(c.Witness)
265 cs.Constraints = c.Constraints
266 cs.R1CS.A = ArrayArrayBigIntToString(c.R1CS.A)
267 cs.R1CS.B = ArrayArrayBigIntToString(c.R1CS.B)
268 cs.R1CS.C = ArrayArrayBigIntToString(c.R1CS.C)
269 return cs
270}
271func CircuitFromString(cs CircuitString) (circuitcompiler.Circuit, error) {
272 var c circuitcompiler.Circuit
273 var err error
274 c.NVars = cs.NVars
275 c.NPublic = cs.NPublic
276 c.NSignals = cs.NSignals
277 c.PrivateInputs = cs.PrivateInputs
278 c.PublicInputs = cs.PublicInputs
279 c.Signals = cs.Signals
280 c.Witness, err = ArrayStringToBigInt(cs.Witness)
281 if err != nil {
282 return c, err
283 }
284 c.Constraints = cs.Constraints
285 c.R1CS.A, err = ArrayArrayStringToBigInt(cs.R1CS.A)
286 if err != nil {
287 return c, err
288 }
289 c.R1CS.B, err = ArrayArrayStringToBigInt(cs.R1CS.B)
290 if err != nil {
291 return c, err
292 }
293 c.R1CS.C, err = ArrayArrayStringToBigInt(cs.R1CS.C)
294 if err != nil {
295 return c, err
296 }
297 return c, nil
298}
299
300// Proof
301type ProofString struct {
302 PiA [3]string
303 PiAp [3]string
304 PiB [3][2]string
305 PiBp [3]string
306 PiC [3]string
307 PiCp [3]string
308 PiH [3]string
309 PiKp [3]string
310}
311
312func ProofToString(p snark.Proof) ProofString {
313 var s ProofString
314 s.PiA = BigInt3ToString(p.PiA)
315 s.PiAp = BigInt3ToString(p.PiAp)
316 s.PiB = BigInt32ToString(p.PiB)
317 s.PiBp = BigInt3ToString(p.PiBp)
318 s.PiC = BigInt3ToString(p.PiC)
319 s.PiCp = BigInt3ToString(p.PiCp)
320 s.PiH = BigInt3ToString(p.PiH)
321 s.PiKp = BigInt3ToString(p.PiKp)
322 return s
323}
324func ProofFromString(s ProofString) (snark.Proof, error) {
325 var p snark.Proof
326 var err error
327
328 p.PiA, err = String3ToBigInt(s.PiA)
329 if err != nil {
330 return p, err
331 }
332 p.PiAp, err = String3ToBigInt(s.PiAp)
333 if err != nil {
334 return p, err
335 }
336 p.PiB, err = String32ToBigInt(s.PiB)
337 if err != nil {
338 return p, err
339 }
340 p.PiBp, err = String3ToBigInt(s.PiBp)
341 if err != nil {
342 return p, err
343 }
344 p.PiC, err = String3ToBigInt(s.PiC)
345 if err != nil {
346 return p, err
347 }
348 p.PiCp, err = String3ToBigInt(s.PiCp)
349 if err != nil {
350 return p, err
351 }
352 p.PiH, err = String3ToBigInt(s.PiH)
353 if err != nil {
354 return p, err
355 }
356 p.PiKp, err = String3ToBigInt(s.PiKp)
357 if err != nil {
358 return p, err
359 }
360 return p, nil
361}