github.com/cranelv/ethereum_mpc@v0.0.0-20191031014521-23aeb1415092/mpcService/step/generator/generator_test.go (about) 1 package generator 2 3 import ( 4 "math/big" 5 "testing" 6 "github.com/ethereum/go-ethereum/mpcService/protocol" 7 "github.com/ethereum/go-ethereum/mpcService/crypto" 8 "github.com/ethereum/go-ethereum/p2p/discover" 9 ) 10 11 func makeZero(degree, peerNum int, peerInfo []protocol.PeerInfo) ([]big.Int, *big.Int) { 12 jrss := make([]RandomPolynomialValue, peerNum) 13 for i := 0; i < peerNum; i++ { 14 jrss[i] = *CreateJRSSValue(degree, peerNum,"text") 15 jrss[i].Initialize(peerInfo,nil) 16 } 17 18 lagResult := big.NewInt(0) 19 for i := 0; i < peerNum; i++ { 20 for j := 0; j < len(jrss[i].PolyValue); j++ { 21 jrss[i].PolyValue[j] = big.NewInt(0) 22 } 23 lagResult.Add(lagResult, jrss[i].RandCoefficient[0]) 24 } 25 26 lagResult.Mod(lagResult, crypto.Secp256k1N) 27 jrssResult := make([]big.Int, peerNum) 28 for i := 0; i < peerNum; i++ { 29 for j := 0; j < peerNum; j++ { 30 jrssResult[i].Add(&jrssResult[i], jrss[j].PolyValue[i]) 31 } 32 jrssResult[i].Mod(&jrssResult[i], crypto.Secp256k1N) 33 } 34 35 return jrssResult, lagResult 36 } 37 38 func makeJRSS(degree, peerNum int, peerInfo []protocol.PeerInfo) ([]big.Int, *big.Int) { 39 jrss := make([]RandomPolynomialValue, peerNum) 40 for i := 0; i < peerNum; i++ { 41 jrss[i] = *CreateJRSSValue(degree, peerNum,"test") 42 } 43 44 lagResult := big.NewInt(0) 45 for i := 0; i < peerNum; i++ { 46 jrss[i].Initialize(peerInfo, nil) 47 lagResult.Add(lagResult, jrss[i].RandCoefficient[0]) 48 } 49 50 lagResult.Mod(lagResult, crypto.Secp256k1N) 51 jrssResult := make([]big.Int, peerNum) 52 for i := 0; i < peerNum; i++ { 53 for j := 0; j < peerNum; j++ { 54 jrssResult[i].Add(&jrssResult[i], jrss[j].PolyValue[i]) 55 } 56 jrssResult[i].Mod(&jrssResult[i], crypto.Secp256k1N) 57 } 58 59 return jrssResult, lagResult 60 } 61 62 func makeJZSS(degree, peerNum int, peerInfo []protocol.PeerInfo) ([]big.Int, *big.Int) { 63 jrss := make([]RandomPolynomialValue, peerNum) 64 for i := 0; i < peerNum; i++ { 65 jrss[i] = *CreateJZSSValue(degree, peerNum,"test") 66 } 67 68 lagResult := big.NewInt(0) 69 for i := 0; i < peerNum; i++ { 70 jrss[i].Initialize(peerInfo, nil) 71 lagResult.Add(lagResult, jrss[i].RandCoefficient[0]) 72 } 73 74 lagResult.Mod(lagResult, crypto.Secp256k1N) 75 jrssResult := make([]big.Int, peerNum) 76 for i := 0; i < peerNum; i++ { 77 for j := 0; j < peerNum; j++ { 78 jrssResult[i].Add(&jrssResult[i], jrss[j].PolyValue[i]) 79 } 80 jrssResult[i].Mod(&jrssResult[i], crypto.Secp256k1N) 81 } 82 83 return jrssResult, lagResult 84 } 85 86 func makePeerInfo(peerNum int) []protocol.PeerInfo { 87 peerInfo := make([]protocol.PeerInfo, peerNum) 88 for i := 0; i < peerNum; i++ { 89 peerInfo[i] = protocol.PeerInfo{PeerID:new(discover.NodeID), Seed:uint64(i + 2)} 90 } 91 92 return peerInfo 93 } 94 95 func TestJRSSZeroMult(t *testing.T) { 96 degree := 8 97 peerNum := 21 98 peerInfo := makePeerInfo(peerNum) 99 jrssResult, lagResult := makeZero(degree, peerNum, peerInfo) 100 t.Logf("lagResult is: %v", lagResult) 101 jrssResult1, lagResult1 := makeZero(degree, peerNum, peerInfo) 102 t.Logf("lagResult1 is: %v", lagResult1) 103 lagResult.Mul(lagResult, lagResult1) 104 lagResult.Mod(lagResult, crypto.Secp256k1N) 105 t.Logf("Mult lagResult is: %v", lagResult) 106 jzssResult, zResult := makeZero(degree*2, peerNum, peerInfo) 107 t.Logf("zero Result is: %v", zResult) 108 jrssResultMul := make([]big.Int, peerNum) 109 for i := 0; i < peerNum; i++ { 110 jrssResultMul[i].Mul(&jrssResult[i], &jrssResult1[i]) 111 jrssResultMul[i].Add(&jrssResultMul[i], &jzssResult[i]) 112 jrssResultMul[i].Mod(&jrssResultMul[i], crypto.Secp256k1N) 113 } 114 115 for i := 0; i < peerNum-degree*2-1; i++ { 116 seedLen := degree*2 + 1 117 seed := make([]int, seedLen) 118 for j := 0; j < seedLen; j++ { 119 seed[j] = i + j 120 } 121 122 lag1 := testLagrange(seed, peerInfo, jrssResultMul) 123 t.Logf("lagResult 1 is: %v", lag1) 124 if lagResult.Cmp(lag1) != 0 { 125 t.Error("Lagrange is Error") 126 } 127 } 128 } 129 130 func TestJRSSGeneratorMult(t *testing.T) { 131 degree := 8 132 peerNum := 21 133 peerInfo := makePeerInfo(peerNum) 134 jrssResult, lagResult := makeJRSS(degree, peerNum, peerInfo) 135 t.Logf("lagResult is: %v", lagResult) 136 jrssResult1, lagResult1 := makeJRSS(degree, peerNum, peerInfo) 137 t.Logf("lagResult1 is: %v", lagResult1) 138 lagResult.Mul(lagResult, lagResult1) 139 lagResult.Mod(lagResult, crypto.Secp256k1N) 140 t.Logf("Mult lagResult is: %v", lagResult) 141 jzssResult, zResult := makeJZSS(degree*2, peerNum, peerInfo) 142 t.Logf("zero Result is: %v", zResult) 143 jrssResultMul := make([]big.Int, peerNum) 144 for i := 0; i < peerNum; i++ { 145 jrssResultMul[i].Mul(&jrssResult[i], &jrssResult1[i]) 146 jrssResultMul[i].Add(&jrssResultMul[i], &jzssResult[i]) 147 jrssResultMul[i].Mod(&jrssResultMul[i], crypto.Secp256k1N) 148 } 149 150 for i := 0; i < peerNum-degree*2-1; i++ { 151 seedLen := degree*2 + 1 152 seed := make([]int, seedLen) 153 for j := 0; j < seedLen; j++ { 154 seed[j] = i + j 155 } 156 157 lag1 := testLagrange(seed, peerInfo, jrssResultMul) 158 t.Logf("lagResult 1 is: %v", lag1) 159 if lagResult.Cmp(lag1) != 0 { 160 t.Error("Lagrange is Error") 161 } 162 } 163 164 for i := 0; i < peerNum-degree*2-1; i++ { 165 seedLen := degree * 2 166 seed := make([]int, seedLen) 167 for j := 0; j < seedLen; j++ { 168 seed[j] = i + j 169 } 170 171 lag1 := testLagrange(seed, peerInfo, jrssResultMul) 172 t.Logf("lagResult 2 is: %v", lag1) 173 if lagResult.Cmp(lag1) == 0 { 174 t.Error("Lagrange is Error") 175 } 176 } 177 } 178 179 func TestJRSSGenerator21(t *testing.T) { 180 degree := 8 181 peerNum := 21 182 peerInfo := makePeerInfo(peerNum) 183 jrssResult, lagResult := makeJRSS(degree, peerNum, peerInfo) 184 185 t.Logf("lagResult is: %v", lagResult) 186 for i := 0; i < peerNum-degree-1; i++ { 187 seed := make([]int, degree+1) 188 for j := 0; j < degree+1; j++ { 189 seed[j] = i + j 190 } 191 192 lag1 := testLagrange(seed, peerInfo, jrssResult) 193 t.Logf("lagResult 1 is: %v", lag1) 194 if lagResult.Cmp(lag1) != 0 { 195 t.Error("Lagrange is Error") 196 } 197 } 198 199 } 200 201 func TestJRSSGenerator(t *testing.T) { 202 jrss1 := CreateJRSSValue(1, 3,"test") 203 jrss2 := CreateJRSSValue(1, 3,"test") 204 jrss3 := CreateJRSSValue(1, 3,"test") 205 206 peerInfo := []protocol.PeerInfo{ 207 protocol.PeerInfo{PeerID:new(discover.NodeID), Seed:1}, 208 protocol.PeerInfo{PeerID:new(discover.NodeID), Seed:2}, 209 protocol.PeerInfo{PeerID:new(discover.NodeID), Seed:3}} 210 jrss1.Initialize(peerInfo, nil) 211 jrss2.Initialize(peerInfo, nil) 212 jrss3.Initialize(peerInfo, nil) 213 214 jrssResult := make([]big.Int, 3) 215 for i := 0; i < 3; i++ { 216 jrssResult[i].Add(&jrssResult[i], jrss1.PolyValue[i]) 217 jrssResult[i].Add(&jrssResult[i], jrss2.PolyValue[i]) 218 jrssResult[i].Add(&jrssResult[i], jrss3.PolyValue[i]) 219 jrssResult[i].Mod(&jrssResult[i], crypto.Secp256k1N) 220 } 221 222 lagResult := jrss1.RandCoefficient[0] 223 lagResult.Add(lagResult, jrss2.RandCoefficient[0]) 224 lagResult.Add(lagResult, jrss3.RandCoefficient[0]) 225 lagResult.Mod(lagResult, crypto.Secp256k1N) 226 t.Logf("lagResult is: %v", lagResult) 227 lag1 := testLagrange([]int{0, 1}, peerInfo, jrssResult) 228 t.Logf("lagResult 1 is: %v", lag1) 229 if lagResult.Cmp(lag1) != 0 { 230 t.Error("Lagrange is Error") 231 } 232 233 lag1 = testLagrange([]int{0, 2}, peerInfo, jrssResult) 234 t.Logf("lagResult 1 is: %v", lag1) 235 if lagResult.Cmp(lag1) != 0 { 236 t.Error("Lagrange is Error") 237 } 238 239 lag1 = testLagrange([]int{1, 2}, peerInfo, jrssResult) 240 t.Logf("lagResult 1 is: %v", lag1) 241 if lagResult.Cmp(lag1) != 0 { 242 t.Error("Lagrange is Error") 243 } 244 245 lag1 = testLagrange([]int{2, 0}, peerInfo, jrssResult) 246 t.Logf("lagResult 1 is: %v", lag1) 247 if lagResult.Cmp(lag1) != 0 { 248 t.Error("Lagrange is Error") 249 } 250 251 lag1 = testLagrange([]int{2, 1}, peerInfo, jrssResult) 252 t.Logf("lagResult 1 is: %v", lag1) 253 if lagResult.Cmp(lag1) != 0 { 254 t.Error("Lagrange is Error") 255 } 256 257 lag1 = testLagrange([]int{1, 0}, peerInfo, jrssResult) 258 t.Logf("lagResult 1 is: %v", lag1) 259 if lagResult.Cmp(lag1) != 0 { 260 t.Error("Lagrange is Error") 261 } 262 } 263 264 func testLagrange(seed []int, peerInfo []protocol.PeerInfo, jrssResult []big.Int) *big.Int { 265 fx := make([]*big.Int, len(seed)) 266 x := make([]*big.Int, len(seed)) 267 for i := 0; i < len(seed); i++ { 268 x[i] = new(big.Int).SetUint64(peerInfo[seed[i]].Seed) 269 fx[i] = &jrssResult[seed[i]] 270 } 271 272 return crypto.Lagrange(fx, x) 273 }