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 }