github.com/incognitochain/go-incognito-sdk@v1.0.1/privacy/zkp/aggregaterange/bulletproofs/bulletproofs_helper.go (about)

     1  package bulletproofs
     2  
     3  import (
     4  	"github.com/incognitochain/go-incognito-sdk/privacy"
     5  	"github.com/incognitochain/go-incognito-sdk/privacy/privacy_util"
     6  	"github.com/pkg/errors"
     7  )
     8  
     9  // ConvertIntToBinary represents a integer number in binary
    10  func ConvertUint64ToBinary(number uint64, n int) []*privacy.Scalar {
    11  	if number == 0 {
    12  		res := make([]*privacy.Scalar, n)
    13  		for i := 0; i < n; i++ {
    14  			res[i] = new(privacy.Scalar).FromUint64(0)
    15  		}
    16  		return res
    17  	}
    18  
    19  	binary := make([]*privacy.Scalar, n)
    20  
    21  	for i := 0; i < n; i++ {
    22  		binary[i] = new(privacy.Scalar).FromUint64(number % 2)
    23  		number = number / 2
    24  	}
    25  	return binary
    26  }
    27  
    28  func computeHPrime(y *privacy.Scalar, N int, H []*privacy.Point) []*privacy.Point {
    29  	yInverse := new(privacy.Scalar).Invert(y)
    30  	HPrime := make([]*privacy.Point, N)
    31  	expyInverse := new(privacy.Scalar).FromUint64(1)
    32  	for i := 0; i < N; i++ {
    33  		HPrime[i] = new(privacy.Point).ScalarMult(H[i], expyInverse)
    34  		expyInverse.Mul(expyInverse, yInverse)
    35  	}
    36  	return HPrime
    37  }
    38  
    39  func computeDeltaYZ(z, zSquare *privacy.Scalar, yVector []*privacy.Scalar, N int) (*privacy.Scalar, error) {
    40  	oneNumber := new(privacy.Scalar).FromUint64(1)
    41  	twoNumber := new(privacy.Scalar).FromUint64(2)
    42  	oneVectorN := powerVector(oneNumber, privacy_util.MaxExp)
    43  	twoVectorN := powerVector(twoNumber, privacy_util.MaxExp)
    44  	oneVector := powerVector(oneNumber, N)
    45  
    46  	deltaYZ := new(privacy.Scalar).Sub(z, zSquare)
    47  	// ip1 = <1^(n*m), y^(n*m)>
    48  	var ip1, ip2 *privacy.Scalar
    49  	var err error
    50  	if ip1, err = innerProduct(oneVector, yVector); err != nil {
    51  		return nil, err
    52  	} else if ip2, err = innerProduct(oneVectorN, twoVectorN); err != nil {
    53  		return nil, err
    54  	} else {
    55  		deltaYZ.Mul(deltaYZ, ip1)
    56  		sum := new(privacy.Scalar).FromUint64(0)
    57  		zTmp := new(privacy.Scalar).Set(zSquare)
    58  		for j := 0; j < int(N/privacy_util.MaxExp); j++ {
    59  			zTmp.Mul(zTmp, z)
    60  			sum.Add(sum, zTmp)
    61  		}
    62  		sum.Mul(sum, ip2)
    63  		deltaYZ.Sub(deltaYZ, sum)
    64  	}
    65  	return deltaYZ, nil
    66  }
    67  
    68  func innerProduct(a []*privacy.Scalar, b []*privacy.Scalar) (*privacy.Scalar, error) {
    69  	if len(a) != len(b) {
    70  		return nil, errors.New("Incompatible sizes of a and b")
    71  	}
    72  	result := new(privacy.Scalar).FromUint64(uint64(0))
    73  	for i := range a {
    74  		//res = a[i]*b[i] + res % l
    75  		result.MulAdd(a[i], b[i], result)
    76  	}
    77  	return result, nil
    78  }
    79  
    80  func vectorAdd(a []*privacy.Scalar, b []*privacy.Scalar) ([]*privacy.Scalar, error) {
    81  	if len(a) != len(b) {
    82  		return nil, errors.New("Incompatible sizes of a and b")
    83  	}
    84  	result := make([]*privacy.Scalar, len(a))
    85  	for i := range a {
    86  		result[i] = new(privacy.Scalar).Add(a[i], b[i])
    87  	}
    88  	return result, nil
    89  }
    90  
    91  func setAggregateParams(N int) *bulletproofParams {
    92  	aggParam := new(bulletproofParams)
    93  	aggParam.g = AggParam.g[0:N]
    94  	aggParam.h = AggParam.h[0:N]
    95  	aggParam.u = AggParam.u
    96  	aggParam.cs = AggParam.cs
    97  	return aggParam
    98  }
    99  
   100  func roundUpPowTwo(v int) int {
   101  	if v == 0 {
   102  		return 1
   103  	} else {
   104  		v--
   105  		v |= v >> 1
   106  		v |= v >> 2
   107  		v |= v >> 4
   108  		v |= v >> 8
   109  		v |= v >> 16
   110  		v++
   111  		return v
   112  	}
   113  }
   114  
   115  func hadamardProduct(a []*privacy.Scalar, b []*privacy.Scalar) ([]*privacy.Scalar, error) {
   116  	if len(a) != len(b) {
   117  		return nil, errors.New("Invalid input")
   118  	}
   119  	result := make([]*privacy.Scalar, len(a))
   120  	for i := 0; i < len(result); i++ {
   121  		result[i] = new(privacy.Scalar).Mul(a[i], b[i])
   122  	}
   123  	return result, nil
   124  }
   125  
   126  // powerVector calculates base^n
   127  func powerVector(base *privacy.Scalar, n int) []*privacy.Scalar {
   128  	result := make([]*privacy.Scalar, n)
   129  	result[0] = new(privacy.Scalar).FromUint64(1)
   130  	if n > 1 {
   131  		result[1] = new(privacy.Scalar).Set(base)
   132  		for i := 2; i < n; i++ {
   133  			result[i] = new(privacy.Scalar).Mul(result[i-1], base)
   134  		}
   135  	}
   136  	return result
   137  }
   138  
   139  // vectorAddScalar adds a vector to a big int, returns big int array
   140  func vectorAddScalar(v []*privacy.Scalar, s *privacy.Scalar) []*privacy.Scalar {
   141  	result := make([]*privacy.Scalar, len(v))
   142  	for i := range v {
   143  		result[i] = new(privacy.Scalar).Add(v[i], s)
   144  	}
   145  	return result
   146  }
   147  
   148  // vectorMulScalar mul a vector to a big int, returns a vector
   149  func vectorMulScalar(v []*privacy.Scalar, s *privacy.Scalar) []*privacy.Scalar {
   150  	result := make([]*privacy.Scalar, len(v))
   151  	for i := range v {
   152  		result[i] = new(privacy.Scalar).Mul(v[i], s)
   153  	}
   154  	return result
   155  }
   156  
   157  // CommitAll commits a list of PCM_CAPACITY value(s)
   158  func encodeVectors(l []*privacy.Scalar, r []*privacy.Scalar, g []*privacy.Point, h []*privacy.Point) (*privacy.Point, error) {
   159  	if len(l) != len(r) || len(g) != len(l) || len(h) != len(g) {
   160  		return nil, errors.New("Invalid input")
   161  	}
   162  	tmp1 := new(privacy.Point).MultiScalarMult(l, g)
   163  	tmp2 := new(privacy.Point).MultiScalarMult(r, h)
   164  	res := new(privacy.Point).Add(tmp1, tmp2)
   165  	return res, nil
   166  }
   167  
   168  // bulletproofParams includes all generator for aggregated range proof
   169  func newBulletproofParams(m int) *bulletproofParams {
   170  	maxExp := privacy_util.MaxExp
   171  	numCommitValue := privacy_util.NumBase
   172  	maxOutputCoin := privacy_util.MaxOutputCoin
   173  	capacity := maxExp * m // fixed value
   174  	param := new(bulletproofParams)
   175  	param.g = make([]*privacy.Point, capacity)
   176  	param.h = make([]*privacy.Point, capacity)
   177  	csByte := []byte{}
   178  
   179  	for i := 0; i < capacity; i++ {
   180  		param.g[i] = privacy.HashToPointFromIndex(int64(numCommitValue+i), privacy.CStringBulletProof)
   181  		param.h[i] = privacy.HashToPointFromIndex(int64(numCommitValue+i+maxOutputCoin*maxExp), privacy.CStringBulletProof)
   182  		csByte = append(csByte, param.g[i].ToBytesS()...)
   183  		csByte = append(csByte, param.h[i].ToBytesS()...)
   184  	}
   185  
   186  	param.u = new(privacy.Point)
   187  	param.u = privacy.HashToPointFromIndex(int64(numCommitValue+2*maxOutputCoin*maxExp), privacy.CStringBulletProof)
   188  	csByte = append(csByte, param.u.ToBytesS()...)
   189  
   190  	param.cs = privacy.HashToPoint(csByte)
   191  	return param
   192  }
   193  
   194  func generateChallenge(hashCache []byte, values []*privacy.Point) *privacy.Scalar {
   195  	bytes := []byte{}
   196  	bytes = append(bytes, hashCache...)
   197  	for i := 0; i < len(values); i++ {
   198  		bytes = append(bytes, values[i].ToBytesS()...)
   199  	}
   200  	hash := privacy.HashToScalar(bytes)
   201  	return hash
   202  }