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 }