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  }