github.com/consensys/gnark@v0.11.0/internal/generator/backend/template/representations/marshal.go.tmpl (about) 1 import ( 2 "io" 3 "encoding/binary" 4 "fmt" 5 6 "github.com/blang/semver/v4" 7 ) 8 9 // WriteTo encodes R1CS into provided io.Writer using cbor 10 func (cs *system) WriteTo(w io.Writer) (int64, error) { 11 b, err := cs.System.ToBytes() 12 if err != nil { 13 return 0, err 14 } 15 16 c := cs.CoeffTable.toBytes() 17 18 totalLen := uint64(len(b) + len(c)) 19 gnarkVersion := semver.MustParse(cs.GnarkVersion) 20 // write totalLen, gnarkVersion.Major, gnarkVersion.Minor, gnarkVersion.Patch using 21 // binary.LittleEndian 22 if err := binary.Write(w, binary.LittleEndian, totalLen); err != nil { 23 return 0, err 24 } 25 if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Major); err != nil { 26 return 0, err 27 } 28 if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Minor); err != nil { 29 return 0, err 30 } 31 if err := binary.Write(w, binary.LittleEndian, gnarkVersion.Patch); err != nil { 32 return 0, err 33 } 34 35 // write the system 36 n, err := w.Write(b) 37 if err != nil { 38 return int64(n), err 39 } 40 41 // write the coeff table 42 m, err := w.Write(c) 43 return int64(n+m) + 4*8, err 44 } 45 46 // ReadFrom attempts to decode R1CS from io.Reader using cbor 47 func (cs *system) ReadFrom(r io.Reader) (int64, error) { 48 var totalLen uint64 49 if err := binary.Read(r, binary.LittleEndian, &totalLen); err != nil { 50 return 0, err 51 } 52 53 var major, minor, patch uint64 54 if err := binary.Read(r, binary.LittleEndian, &major); err != nil { 55 return 0, err 56 } 57 if err := binary.Read(r, binary.LittleEndian, &minor); err != nil { 58 return 0, err 59 } 60 if err := binary.Read(r, binary.LittleEndian, &patch); err != nil { 61 return 0, err 62 } 63 // TODO @gbotrel validate version, duplicate logic with core.go CheckSerializationHeader 64 if major != 0 || minor < 10 { 65 return 0, fmt.Errorf("unsupported gnark version %d.%d.%d", major, minor, patch) 66 } 67 68 data := make([]byte, totalLen) 69 if _, err := io.ReadFull(r, data); err != nil { 70 return 0, err 71 } 72 n, err := cs.System.FromBytes(data) 73 if err != nil { 74 return 0, err 75 } 76 data = data[n:] 77 78 if err := cs.CoeffTable.fromBytes(data); err != nil { 79 return 0, err 80 } 81 82 return int64(totalLen) + 4*8, nil 83 }