github.com/incognitochain/go-incognito-sdk@v1.0.1/privacy/pedersen.go (about)

     1  package privacy
     2  
     3  import (
     4  	"github.com/pkg/errors"
     5  )
     6  
     7  const (
     8  	PedersenPrivateKeyIndex = byte(0x00)
     9  	PedersenValueIndex      = byte(0x01)
    10  	PedersenSndIndex        = byte(0x02)
    11  	PedersenShardIDIndex    = byte(0x03)
    12  	PedersenRandomnessIndex = byte(0x04)
    13  )
    14  
    15  var GBase, HBase *Point
    16  
    17  // PedersenCommitment represents the parameters for the commitment
    18  type PedersenCommitment struct {
    19  	G []*Point // generators
    20  	// G[0]: public key
    21  	// G[1]: Value
    22  	// G[2]: SNDerivator
    23  	// G[3]: ShardID
    24  	// G[4]: Randomness
    25  }
    26  
    27  func newPedersenParams() PedersenCommitment {
    28  	var pcm PedersenCommitment
    29  	const capacity = 5 // fixed value = 5
    30  	pcm.G = make([]*Point, capacity)
    31  	pcm.G[0] = new(Point).ScalarMultBase(new(Scalar).FromUint64(1))
    32  
    33  	for i := 1; i < len(pcm.G); i++ {
    34  		pcm.G[i] = HashToPointFromIndex(int64(i), CStringBulletProof)
    35  	}
    36  	GBase = new(Point).Set(pcm.G[1])
    37  	HBase = new(Point).Set(pcm.G[4])
    38  	return pcm
    39  }
    40  
    41  var PedCom = newPedersenParams()
    42  
    43  // CommitAll commits a list of PCM_CAPACITY value(s)
    44  func (com PedersenCommitment) commitAll(openings []*Scalar) (*Point, error) {
    45  	if len(openings) != len(com.G) {
    46  		return nil, errors.New("invalid length of openings to commit")
    47  	}
    48  
    49  	commitment := new(Point).ScalarMult(com.G[0], openings[0])
    50  
    51  	for i := 1; i < len(com.G); i++ {
    52  		commitment.Add(commitment, new(Point).ScalarMult(com.G[i], openings[i]))
    53  	}
    54  	return commitment, nil
    55  }
    56  
    57  // CommitAtIndex commits specific value with index and returns 34 bytes
    58  // g^v x h^rand
    59  func (com PedersenCommitment) CommitAtIndex(value, rand *Scalar, index byte) *Point {
    60  	//commitment := new(Point).ScalarMult(com.G[index], value)
    61  	//commitment.Add(commitment, new(Point).ScalarMult(com.G[PedersenRandomnessIndex], rand))
    62  	//
    63  	//return commitment
    64  	return new(Point).AddPedersen(value, com.G[index], rand, com.G[PedersenRandomnessIndex])
    65  }