arnaucube
arnaucube/go-snarkPublic Self-hosted repository
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}