github.com/consensys/gnark@v0.11.0/internal/generator/backend/template/zkpschemes/plonk/plonk.marshal.go.tmpl (about)

     1  import (
     2   	{{ template "import_curve" . }}
     3  	{{ template "import_kzg" . }}
     4  	"io"
     5  )
     6  
     7  // WriteRawTo writes binary encoding of Proof to w without point compression
     8  func (proof *Proof) WriteRawTo(w io.Writer) (int64, error) {
     9  	return proof.writeTo(w, curve.RawEncoding())
    10  }
    11  
    12  // WriteTo writes binary encoding of Proof to w with point compression
    13  func (proof *Proof) WriteTo(w io.Writer) (int64, error) {
    14  	return proof.writeTo(w)
    15  }
    16  
    17  func (proof *Proof) writeTo(w io.Writer, options ...func(*curve.Encoder)) (int64, error) {
    18  	enc := curve.NewEncoder(w, options...)
    19  
    20  	toEncode := []interface{}{
    21  		&proof.LRO[0],
    22  		&proof.LRO[1],
    23  		&proof.LRO[2],
    24  		&proof.Z,
    25  		&proof.H[0],
    26  		&proof.H[1],
    27  		&proof.H[2],
    28  		&proof.BatchedProof.H,
    29  		proof.BatchedProof.ClaimedValues,
    30  		&proof.ZShiftedOpening.H,
    31  		&proof.ZShiftedOpening.ClaimedValue,
    32  		proof.Bsb22Commitments,
    33  	}
    34  
    35  	for _, v := range toEncode {
    36  		if err := enc.Encode(v); err != nil {
    37  			return enc.BytesWritten(), err
    38  		}
    39  	}
    40  
    41  	return enc.BytesWritten(), nil
    42  }
    43  
    44  // ReadFrom reads binary representation of Proof from r
    45  func (proof *Proof) ReadFrom(r io.Reader) (int64, error) {
    46  	dec := curve.NewDecoder(r)
    47  	toDecode := []interface{}{
    48  		&proof.LRO[0],
    49  		&proof.LRO[1],
    50  		&proof.LRO[2],
    51  		&proof.Z,
    52  		&proof.H[0],
    53  		&proof.H[1],
    54  		&proof.H[2],
    55  		&proof.BatchedProof.H,
    56  		&proof.BatchedProof.ClaimedValues,
    57  		&proof.ZShiftedOpening.H,
    58  		&proof.ZShiftedOpening.ClaimedValue,
    59  		&proof.Bsb22Commitments,
    60  	}
    61  
    62  	for _, v := range toDecode {
    63  		if err := dec.Decode(v); err != nil {
    64  			return dec.BytesRead(), err
    65  		}
    66  	}
    67  
    68  	if proof.Bsb22Commitments == nil {
    69  		proof.Bsb22Commitments = []kzg.Digest{}
    70  	}
    71  
    72  	return dec.BytesRead(), nil
    73  }
    74  
    75  // WriteTo writes binary encoding of ProvingKey to w
    76  func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) {
    77  	return pk.writeTo(w, true)
    78  }
    79  
    80  // WriteRawTo writes binary encoding of ProvingKey to w without point compression
    81  func (pk *ProvingKey) WriteRawTo(w io.Writer) (n int64, err error) {
    82  	return pk.writeTo(w, false)
    83  }
    84  
    85  func (pk *ProvingKey) writeTo(w io.Writer, withCompression bool) (n int64, err error) {
    86  	// encode the verifying key
    87  	if withCompression {
    88  		n, err = pk.Vk.WriteTo(w)
    89  	} else {
    90  		n, err = pk.Vk.WriteRawTo(w)
    91  	}
    92  	if err != nil {
    93  		return
    94  	}
    95  
    96  	var n2 int64
    97  	// KZG key
    98  	if withCompression {
    99  		n2, err = pk.Kzg.WriteTo(w)
   100  	} else {
   101  		n2, err = pk.Kzg.WriteRawTo(w)
   102  	}
   103  	if err != nil {
   104  		return
   105  	}
   106  	n += n2
   107  	if withCompression {
   108  		n2, err = pk.KzgLagrange.WriteTo(w)
   109  	} else {
   110  		n2, err = pk.KzgLagrange.WriteRawTo(w)
   111  	}
   112  	if err != nil {
   113  		return
   114  	}
   115  	n += n2
   116  
   117  
   118  	return n, nil
   119  }
   120  
   121  // ReadFrom reads from binary representation in r into ProvingKey
   122  func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) {
   123  	return pk.readFrom(r, true)
   124  }
   125  
   126  // UnsafeReadFrom reads from binary representation in r into ProvingKey without subgroup checks
   127  func (pk *ProvingKey) UnsafeReadFrom(r io.Reader) (int64, error) {
   128  	return pk.readFrom(r, false)
   129  }
   130  
   131  func (pk *ProvingKey) readFrom(r io.Reader, withSubgroupChecks bool) (int64, error) {
   132  	pk.Vk = &VerifyingKey{}
   133  	n, err := pk.Vk.ReadFrom(r)
   134  	if err != nil {
   135  		return n, err
   136  	}
   137  
   138  	var n2 int64
   139  	if withSubgroupChecks {
   140  		n2, err = pk.Kzg.ReadFrom(r)
   141  	} else {
   142  		n2, err = pk.Kzg.UnsafeReadFrom(r)
   143  	}
   144  	n += n2
   145  	if err != nil {
   146  		return n, err
   147  	}
   148  	if withSubgroupChecks {
   149  		n2, err = pk.KzgLagrange.ReadFrom(r)
   150  	} else {
   151  		n2, err = pk.KzgLagrange.UnsafeReadFrom(r)
   152  	}
   153  	n += n2
   154  	return n, err
   155  }
   156  
   157  // WriteTo writes binary encoding of VerifyingKey to w
   158  func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) {
   159  	return vk.writeTo(w)
   160  }
   161  
   162  // WriteRawTo writes binary encoding of VerifyingKey to w without point compression
   163  func (vk *VerifyingKey) WriteRawTo(w io.Writer) (int64, error) {
   164  	return vk.writeTo(w, curve.RawEncoding())
   165  }
   166  
   167  func (vk *VerifyingKey) writeTo(w io.Writer, options ...func(*curve.Encoder)) (n int64, err error) {
   168  	enc := curve.NewEncoder(w)
   169  
   170  	toEncode := []interface{}{
   171  		vk.Size,
   172  		&vk.SizeInv,
   173  		&vk.Generator,
   174  		vk.NbPublicVariables,
   175  		&vk.CosetShift,
   176  		&vk.S[0],
   177  		&vk.S[1],
   178  		&vk.S[2],
   179  		&vk.Ql,
   180  		&vk.Qr,
   181  		&vk.Qm,
   182  		&vk.Qo,
   183  		&vk.Qk,
   184  		vk.Qcp,
   185  		&vk.Kzg.G1,
   186  		&vk.Kzg.G2[0],
   187  		&vk.Kzg.G2[1],
   188  		&vk.Kzg.Lines,
   189  		vk.CommitmentConstraintIndexes,
   190  	}
   191  
   192  	for _, v := range toEncode {
   193  		if err := enc.Encode(v); err != nil {
   194  			return enc.BytesWritten(), err
   195  		}
   196  	}
   197  
   198  	return enc.BytesWritten(), nil
   199  }
   200  
   201  // UnsafeReadFrom reads from binary representation in r into VerifyingKey.
   202  // Current implementation is a passthrough to ReadFrom
   203  func (vk *VerifyingKey) UnsafeReadFrom(r io.Reader) (int64, error) {
   204  	return vk.ReadFrom(r)
   205  }
   206  
   207  // ReadFrom reads from binary representation in r into VerifyingKey
   208  func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) {
   209  	dec := curve.NewDecoder(r)
   210  	toDecode := []interface{}{
   211  		&vk.Size,
   212  		&vk.SizeInv,
   213  		&vk.Generator,
   214  		&vk.NbPublicVariables,
   215  		&vk.CosetShift,
   216  		&vk.S[0],
   217  		&vk.S[1],
   218  		&vk.S[2],
   219  		&vk.Ql,
   220  		&vk.Qr,
   221  		&vk.Qm,
   222  		&vk.Qo,
   223  		&vk.Qk,
   224  		&vk.Qcp,
   225  		&vk.Kzg.G1,
   226  		&vk.Kzg.G2[0],
   227  		&vk.Kzg.G2[1],
   228  		&vk.Kzg.Lines,
   229  		&vk.CommitmentConstraintIndexes,
   230  	}
   231  
   232  	for _, v := range toDecode {
   233  		if err := dec.Decode(v); err != nil {
   234  			return dec.BytesRead(), err
   235  		}
   236  	}
   237  
   238  	if vk.Qcp == nil {
   239  		vk.Qcp = []kzg.Digest{}
   240  	}
   241  
   242  	return dec.BytesRead(), nil
   243  }