github.com/dusk-network/dusk-crypto@v0.1.3/rangeproof/generators/generator.go (about)

     1  package generator
     2  
     3  import (
     4  	ristretto "github.com/bwesterb/go-ristretto"
     5  )
     6  
     7  // This package will generate the generators for the pedersens and the bulletproof
     8  
     9  // Generator holds the information to generate a set of points
    10  // based on an initial byte slice; data
    11  type Generator struct {
    12  	data  []byte
    13  	Bases []ristretto.Point
    14  }
    15  
    16  // New will generate a generator which
    17  // will use data to generate `n` points
    18  func New(data []byte) *Generator {
    19  	return &Generator{
    20  		data:  data,
    21  		Bases: []ristretto.Point{},
    22  	}
    23  }
    24  
    25  //Clear will clear all of the Bases
    26  // but leave the counter as is
    27  func (g *Generator) Clear() {
    28  	g.Bases = []ristretto.Point{}
    29  }
    30  
    31  // Iterate will generate a new point using
    32  // the previous point's bytes as a seed or the original
    33  // nonce data, if no previous point is available
    34  func (g *Generator) Iterate() ristretto.Point {
    35  
    36  	p := ristretto.Point{}
    37  
    38  	if len(g.Bases) == 0 {
    39  		p.Derive(g.data)
    40  		return p
    41  	}
    42  
    43  	prevPoint := g.Bases[len(g.Bases)-1]
    44  	p.Derive(prevPoint.Bytes())
    45  
    46  	return p
    47  }
    48  
    49  // Compute will generate num amount of points, which will act as point generators
    50  // using the initial data.
    51  func (g *Generator) Compute(num uint32) {
    52  
    53  	for i := uint32(0); i < num; i++ {
    54  		g.Bases = append(g.Bases, g.Iterate())
    55  	}
    56  
    57  }