github.com/klaytn/klaytn@v1.12.1/consensus/istanbul/backend/backend_test.go (about) 1 // Modifications Copyright 2020 The klaytn Authors 2 // Copyright 2017 The go-ethereum Authors 3 // This file is part of the go-ethereum library. 4 // 5 // The go-ethereum library is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Lesser General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // The go-ethereum library is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Lesser General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public License 16 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 17 // 18 // This file is derived from quorum/consensus/istanbul/backend/backend_test.go (2020/04/16). 19 // Modified and improved for the klaytn development. 20 21 package backend 22 23 import ( 24 "bytes" 25 "crypto/ecdsa" 26 "fmt" 27 "math/big" 28 "sort" 29 "strings" 30 "testing" 31 "time" 32 33 "github.com/klaytn/klaytn/blockchain/types" 34 "github.com/klaytn/klaytn/common" 35 "github.com/klaytn/klaytn/consensus/istanbul" 36 "github.com/klaytn/klaytn/consensus/istanbul/validator" 37 "github.com/klaytn/klaytn/crypto" 38 "github.com/klaytn/klaytn/governance" 39 "github.com/klaytn/klaytn/params" 40 "github.com/klaytn/klaytn/reward" 41 "github.com/klaytn/klaytn/storage/database" 42 ) 43 44 var ( 45 testSigningData = []byte("dummy data") 46 // testing node's private key 47 PRIVKEY = "ce7671a2880493dfb8d04218707a16b1532dfcac97f0289d770a919d5ff7b068" 48 // Max blockNum 49 maxBlockNum = int64(100) 50 committeeBlocks = map[Pair]bool{ 51 {Sequence: 0, Round: 0}: false, 52 {Sequence: 0, Round: 1}: false, 53 {Sequence: 0, Round: 2}: false, 54 {Sequence: 0, Round: 3}: false, 55 {Sequence: 0, Round: 4}: false, 56 {Sequence: 0, Round: 5}: false, 57 {Sequence: 0, Round: 6}: false, 58 {Sequence: 0, Round: 7}: false, 59 {Sequence: 0, Round: 8}: false, 60 {Sequence: 0, Round: 9}: false, 61 {Sequence: 0, Round: 10}: false, 62 {Sequence: 0, Round: 11}: false, 63 {Sequence: 0, Round: 12}: false, 64 {Sequence: 0, Round: 13}: false, 65 {Sequence: 0, Round: 14}: false, 66 {Sequence: 5, Round: 4}: false, 67 {Sequence: 6, Round: 6}: false, 68 {Sequence: 6, Round: 9}: false, 69 {Sequence: 7, Round: 11}: false, 70 {Sequence: 7, Round: 12}: false, 71 {Sequence: 7, Round: 14}: false, 72 {Sequence: 8, Round: 5}: false, 73 {Sequence: 8, Round: 13}: false, 74 {Sequence: 8, Round: 14}: false, 75 {Sequence: 9, Round: 0}: false, 76 {Sequence: 9, Round: 10}: false, 77 {Sequence: 9, Round: 11}: false, 78 {Sequence: 9, Round: 12}: false, 79 {Sequence: 9, Round: 13}: false, 80 {Sequence: 9, Round: 14}: false, 81 {Sequence: 10, Round: 1}: false, 82 {Sequence: 10, Round: 8}: false, 83 {Sequence: 10, Round: 11}: false, 84 {Sequence: 10, Round: 12}: false, 85 {Sequence: 10, Round: 14}: false, 86 {Sequence: 11, Round: 0}: false, 87 {Sequence: 11, Round: 7}: false, 88 {Sequence: 11, Round: 8}: false, 89 {Sequence: 11, Round: 10}: false, 90 {Sequence: 11, Round: 11}: false, 91 {Sequence: 12, Round: 0}: false, 92 {Sequence: 12, Round: 6}: false, 93 {Sequence: 12, Round: 8}: false, 94 {Sequence: 12, Round: 9}: false, 95 {Sequence: 12, Round: 10}: false, 96 {Sequence: 12, Round: 11}: false, 97 {Sequence: 12, Round: 13}: false, 98 {Sequence: 13, Round: 8}: false, 99 {Sequence: 13, Round: 9}: false, 100 {Sequence: 13, Round: 12}: false, 101 {Sequence: 13, Round: 13}: false, 102 {Sequence: 14, Round: 0}: false, 103 {Sequence: 14, Round: 5}: false, 104 {Sequence: 14, Round: 7}: false, 105 {Sequence: 14, Round: 8}: false, 106 {Sequence: 14, Round: 10}: false, 107 {Sequence: 14, Round: 14}: false, 108 {Sequence: 15, Round: 5}: false, 109 {Sequence: 15, Round: 6}: false, 110 {Sequence: 15, Round: 7}: false, 111 {Sequence: 15, Round: 11}: false, 112 {Sequence: 16, Round: 5}: false, 113 {Sequence: 16, Round: 6}: false, 114 {Sequence: 16, Round: 7}: false, 115 {Sequence: 17, Round: 4}: false, 116 {Sequence: 17, Round: 5}: false, 117 {Sequence: 17, Round: 7}: false, 118 {Sequence: 17, Round: 9}: false, 119 {Sequence: 18, Round: 1}: false, 120 {Sequence: 18, Round: 3}: false, 121 {Sequence: 18, Round: 4}: false, 122 {Sequence: 18, Round: 7}: false, 123 {Sequence: 18, Round: 9}: false, 124 {Sequence: 18, Round: 10}: false, 125 {Sequence: 19, Round: 2}: false, 126 {Sequence: 19, Round: 3}: false, 127 {Sequence: 19, Round: 5}: false, 128 {Sequence: 19, Round: 7}: false, 129 {Sequence: 19, Round: 10}: false, 130 {Sequence: 19, Round: 13}: false, 131 {Sequence: 20, Round: 1}: false, 132 {Sequence: 20, Round: 2}: false, 133 {Sequence: 20, Round: 3}: false, 134 {Sequence: 20, Round: 11}: false, 135 {Sequence: 21, Round: 0}: false, 136 {Sequence: 21, Round: 1}: false, 137 {Sequence: 21, Round: 2}: false, 138 {Sequence: 21, Round: 7}: false, 139 {Sequence: 21, Round: 11}: false, 140 {Sequence: 21, Round: 12}: false, 141 {Sequence: 22, Round: 0}: false, 142 {Sequence: 22, Round: 3}: false, 143 {Sequence: 22, Round: 6}: false, 144 {Sequence: 23, Round: 2}: false, 145 {Sequence: 23, Round: 10}: false, 146 {Sequence: 23, Round: 11}: false, 147 {Sequence: 24, Round: 0}: false, 148 {Sequence: 24, Round: 3}: false, 149 {Sequence: 24, Round: 4}: false, 150 {Sequence: 24, Round: 8}: false, 151 {Sequence: 25, Round: 3}: false, 152 {Sequence: 25, Round: 4}: false, 153 {Sequence: 25, Round: 5}: false, 154 {Sequence: 25, Round: 14}: false, 155 {Sequence: 26, Round: 11}: false, 156 {Sequence: 26, Round: 13}: false, 157 {Sequence: 27, Round: 5}: false, 158 {Sequence: 27, Round: 6}: false, 159 {Sequence: 27, Round: 9}: false, 160 {Sequence: 27, Round: 14}: false, 161 {Sequence: 28, Round: 2}: false, 162 {Sequence: 28, Round: 3}: false, 163 {Sequence: 28, Round: 5}: false, 164 {Sequence: 28, Round: 9}: false, 165 {Sequence: 28, Round: 13}: false, 166 {Sequence: 29, Round: 7}: false, 167 {Sequence: 29, Round: 11}: false, 168 {Sequence: 30, Round: 3}: false, 169 {Sequence: 30, Round: 6}: false, 170 {Sequence: 30, Round: 7}: false, 171 {Sequence: 30, Round: 10}: false, 172 {Sequence: 30, Round: 12}: false, 173 {Sequence: 30, Round: 13}: false, 174 {Sequence: 31, Round: 3}: false, 175 {Sequence: 31, Round: 9}: false, 176 {Sequence: 31, Round: 12}: false, 177 {Sequence: 32, Round: 0}: false, 178 {Sequence: 32, Round: 1}: false, 179 {Sequence: 32, Round: 5}: false, 180 {Sequence: 32, Round: 12}: false, 181 {Sequence: 32, Round: 13}: false, 182 {Sequence: 33, Round: 0}: false, 183 {Sequence: 33, Round: 2}: false, 184 {Sequence: 33, Round: 3}: false, 185 {Sequence: 33, Round: 8}: false, 186 {Sequence: 33, Round: 14}: false, 187 {Sequence: 34, Round: 0}: false, 188 {Sequence: 34, Round: 3}: false, 189 {Sequence: 34, Round: 6}: false, 190 {Sequence: 34, Round: 7}: false, 191 {Sequence: 34, Round: 8}: false, 192 {Sequence: 34, Round: 10}: false, 193 {Sequence: 34, Round: 11}: false, 194 {Sequence: 35, Round: 0}: false, 195 {Sequence: 35, Round: 5}: false, 196 {Sequence: 35, Round: 6}: false, 197 {Sequence: 35, Round: 9}: false, 198 {Sequence: 35, Round: 14}: false, 199 {Sequence: 36, Round: 1}: false, 200 {Sequence: 37, Round: 0}: false, 201 {Sequence: 37, Round: 1}: false, 202 {Sequence: 37, Round: 5}: false, 203 {Sequence: 37, Round: 8}: false, 204 {Sequence: 37, Round: 12}: false, 205 {Sequence: 37, Round: 14}: false, 206 {Sequence: 38, Round: 0}: false, 207 {Sequence: 38, Round: 14}: false, 208 {Sequence: 39, Round: 0}: false, 209 {Sequence: 39, Round: 1}: false, 210 {Sequence: 39, Round: 3}: false, 211 {Sequence: 39, Round: 10}: false, 212 {Sequence: 39, Round: 13}: false, 213 {Sequence: 39, Round: 14}: false, 214 {Sequence: 40, Round: 3}: false, 215 {Sequence: 40, Round: 10}: false, 216 {Sequence: 40, Round: 12}: false, 217 {Sequence: 41, Round: 6}: false, 218 {Sequence: 41, Round: 8}: false, 219 {Sequence: 41, Round: 11}: false, 220 {Sequence: 42, Round: 3}: false, 221 {Sequence: 42, Round: 5}: false, 222 {Sequence: 42, Round: 6}: false, 223 {Sequence: 42, Round: 11}: false, 224 {Sequence: 42, Round: 13}: false, 225 {Sequence: 43, Round: 0}: false, 226 {Sequence: 43, Round: 3}: false, 227 {Sequence: 43, Round: 6}: false, 228 {Sequence: 43, Round: 7}: false, 229 {Sequence: 43, Round: 9}: false, 230 {Sequence: 44, Round: 3}: false, 231 {Sequence: 44, Round: 4}: false, 232 {Sequence: 44, Round: 7}: false, 233 {Sequence: 44, Round: 13}: false, 234 {Sequence: 44, Round: 14}: false, 235 {Sequence: 45, Round: 2}: false, 236 {Sequence: 45, Round: 6}: false, 237 {Sequence: 45, Round: 12}: false, 238 {Sequence: 45, Round: 13}: false, 239 {Sequence: 46, Round: 3}: false, 240 {Sequence: 46, Round: 4}: false, 241 {Sequence: 46, Round: 7}: false, 242 {Sequence: 46, Round: 8}: false, 243 {Sequence: 46, Round: 10}: false, 244 {Sequence: 46, Round: 12}: false, 245 {Sequence: 47, Round: 1}: false, 246 {Sequence: 47, Round: 3}: false, 247 {Sequence: 47, Round: 4}: false, 248 {Sequence: 47, Round: 10}: false, 249 {Sequence: 47, Round: 12}: false, 250 {Sequence: 49, Round: 0}: false, 251 {Sequence: 49, Round: 8}: false, 252 {Sequence: 49, Round: 10}: false, 253 {Sequence: 49, Round: 14}: false, 254 {Sequence: 50, Round: 3}: false, 255 {Sequence: 50, Round: 4}: false, 256 {Sequence: 50, Round: 10}: false, 257 {Sequence: 50, Round: 11}: false, 258 {Sequence: 50, Round: 14}: false, 259 {Sequence: 52, Round: 1}: false, 260 {Sequence: 52, Round: 3}: false, 261 {Sequence: 52, Round: 7}: false, 262 {Sequence: 52, Round: 11}: false, 263 {Sequence: 53, Round: 4}: false, 264 {Sequence: 53, Round: 7}: false, 265 {Sequence: 54, Round: 4}: false, 266 {Sequence: 54, Round: 10}: false, 267 {Sequence: 54, Round: 12}: false, 268 {Sequence: 55, Round: 2}: false, 269 {Sequence: 55, Round: 12}: false, 270 {Sequence: 56, Round: 2}: false, 271 {Sequence: 56, Round: 9}: false, 272 {Sequence: 56, Round: 12}: false, 273 {Sequence: 56, Round: 14}: false, 274 {Sequence: 57, Round: 7}: false, 275 {Sequence: 57, Round: 13}: false, 276 {Sequence: 58, Round: 1}: false, 277 {Sequence: 58, Round: 4}: false, 278 {Sequence: 58, Round: 7}: false, 279 {Sequence: 58, Round: 12}: false, 280 {Sequence: 59, Round: 5}: false, 281 {Sequence: 59, Round: 10}: false, 282 {Sequence: 59, Round: 13}: false, 283 {Sequence: 60, Round: 2}: false, 284 {Sequence: 60, Round: 6}: false, 285 {Sequence: 61, Round: 2}: false, 286 {Sequence: 61, Round: 3}: false, 287 {Sequence: 62, Round: 1}: false, 288 {Sequence: 62, Round: 12}: false, 289 {Sequence: 62, Round: 13}: false, 290 {Sequence: 63, Round: 1}: false, 291 {Sequence: 63, Round: 2}: false, 292 {Sequence: 63, Round: 5}: false, 293 {Sequence: 63, Round: 7}: false, 294 {Sequence: 63, Round: 9}: false, 295 {Sequence: 63, Round: 11}: false, 296 {Sequence: 64, Round: 4}: false, 297 {Sequence: 64, Round: 7}: false, 298 {Sequence: 64, Round: 9}: false, 299 {Sequence: 65, Round: 6}: false, 300 {Sequence: 65, Round: 11}: false, 301 {Sequence: 65, Round: 13}: false, 302 {Sequence: 65, Round: 14}: false, 303 {Sequence: 66, Round: 3}: false, 304 {Sequence: 66, Round: 4}: false, 305 {Sequence: 66, Round: 11}: false, 306 {Sequence: 67, Round: 5}: false, 307 {Sequence: 67, Round: 6}: false, 308 {Sequence: 67, Round: 10}: false, 309 {Sequence: 67, Round: 11}: false, 310 {Sequence: 68, Round: 9}: false, 311 {Sequence: 68, Round: 11}: false, 312 {Sequence: 68, Round: 14}: false, 313 {Sequence: 69, Round: 2}: false, 314 {Sequence: 69, Round: 5}: false, 315 {Sequence: 69, Round: 6}: false, 316 {Sequence: 69, Round: 10}: false, 317 {Sequence: 69, Round: 12}: false, 318 {Sequence: 69, Round: 14}: false, 319 {Sequence: 70, Round: 0}: false, 320 {Sequence: 70, Round: 4}: false, 321 {Sequence: 70, Round: 12}: false, 322 {Sequence: 71, Round: 0}: false, 323 {Sequence: 71, Round: 5}: false, 324 {Sequence: 71, Round: 10}: false, 325 {Sequence: 72, Round: 2}: false, 326 {Sequence: 72, Round: 8}: false, 327 {Sequence: 72, Round: 9}: false, 328 {Sequence: 73, Round: 5}: false, 329 {Sequence: 73, Round: 8}: false, 330 {Sequence: 73, Round: 10}: false, 331 {Sequence: 73, Round: 12}: false, 332 {Sequence: 73, Round: 14}: false, 333 {Sequence: 74, Round: 6}: false, 334 {Sequence: 74, Round: 10}: false, 335 {Sequence: 74, Round: 12}: false, 336 {Sequence: 75, Round: 2}: false, 337 {Sequence: 75, Round: 5}: false, 338 {Sequence: 75, Round: 6}: false, 339 {Sequence: 75, Round: 7}: false, 340 {Sequence: 76, Round: 7}: false, 341 {Sequence: 77, Round: 0}: false, 342 {Sequence: 77, Round: 7}: false, 343 {Sequence: 78, Round: 0}: false, 344 {Sequence: 78, Round: 2}: false, 345 {Sequence: 78, Round: 5}: false, 346 {Sequence: 79, Round: 0}: false, 347 {Sequence: 79, Round: 4}: false, 348 {Sequence: 79, Round: 11}: false, 349 {Sequence: 79, Round: 12}: false, 350 {Sequence: 80, Round: 2}: false, 351 {Sequence: 80, Round: 4}: false, 352 {Sequence: 80, Round: 5}: false, 353 {Sequence: 80, Round: 7}: false, 354 {Sequence: 80, Round: 8}: false, 355 {Sequence: 80, Round: 10}: false, 356 {Sequence: 80, Round: 14}: false, 357 {Sequence: 81, Round: 1}: false, 358 {Sequence: 81, Round: 9}: false, 359 {Sequence: 81, Round: 11}: false, 360 {Sequence: 81, Round: 14}: false, 361 {Sequence: 82, Round: 0}: false, 362 {Sequence: 82, Round: 11}: false, 363 {Sequence: 82, Round: 13}: false, 364 {Sequence: 82, Round: 14}: false, 365 {Sequence: 83, Round: 0}: false, 366 {Sequence: 83, Round: 5}: false, 367 {Sequence: 83, Round: 6}: false, 368 {Sequence: 83, Round: 8}: false, 369 {Sequence: 83, Round: 9}: false, 370 {Sequence: 83, Round: 12}: false, 371 {Sequence: 84, Round: 2}: false, 372 {Sequence: 84, Round: 11}: false, 373 {Sequence: 85, Round: 4}: false, 374 {Sequence: 85, Round: 7}: false, 375 {Sequence: 85, Round: 8}: false, 376 {Sequence: 86, Round: 5}: false, 377 {Sequence: 86, Round: 9}: false, 378 {Sequence: 87, Round: 1}: false, 379 {Sequence: 87, Round: 5}: false, 380 {Sequence: 87, Round: 6}: false, 381 {Sequence: 87, Round: 7}: false, 382 {Sequence: 87, Round: 9}: false, 383 {Sequence: 87, Round: 10}: false, 384 {Sequence: 87, Round: 12}: false, 385 {Sequence: 87, Round: 14}: false, 386 {Sequence: 88, Round: 8}: false, 387 {Sequence: 89, Round: 0}: false, 388 {Sequence: 89, Round: 7}: false, 389 {Sequence: 90, Round: 3}: false, 390 {Sequence: 90, Round: 4}: false, 391 {Sequence: 90, Round: 9}: false, 392 {Sequence: 90, Round: 10}: false, 393 {Sequence: 90, Round: 11}: false, 394 {Sequence: 91, Round: 10}: false, 395 {Sequence: 91, Round: 12}: false, 396 {Sequence: 91, Round: 13}: false, 397 {Sequence: 92, Round: 0}: false, 398 {Sequence: 92, Round: 1}: false, 399 {Sequence: 92, Round: 2}: false, 400 {Sequence: 92, Round: 5}: false, 401 {Sequence: 92, Round: 10}: false, 402 {Sequence: 92, Round: 14}: false, 403 {Sequence: 93, Round: 0}: false, 404 {Sequence: 93, Round: 4}: false, 405 {Sequence: 93, Round: 5}: false, 406 {Sequence: 93, Round: 8}: false, 407 {Sequence: 93, Round: 10}: false, 408 {Sequence: 93, Round: 12}: false, 409 {Sequence: 93, Round: 14}: false, 410 {Sequence: 94, Round: 2}: false, 411 {Sequence: 94, Round: 6}: false, 412 {Sequence: 94, Round: 7}: false, 413 {Sequence: 94, Round: 10}: false, 414 {Sequence: 95, Round: 8}: false, 415 {Sequence: 95, Round: 9}: false, 416 {Sequence: 95, Round: 10}: false, 417 {Sequence: 95, Round: 13}: false, 418 {Sequence: 96, Round: 1}: false, 419 {Sequence: 96, Round: 7}: false, 420 {Sequence: 96, Round: 8}: false, 421 {Sequence: 96, Round: 10}: false, 422 {Sequence: 96, Round: 12}: false, 423 {Sequence: 96, Round: 14}: false, 424 {Sequence: 97, Round: 4}: false, 425 {Sequence: 97, Round: 5}: false, 426 {Sequence: 97, Round: 13}: false, 427 {Sequence: 98, Round: 10}: false, 428 {Sequence: 98, Round: 12}: false, 429 {Sequence: 99, Round: 4}: false, 430 {Sequence: 99, Round: 14}: false, 431 } 432 ) 433 434 type keys []*ecdsa.PrivateKey 435 436 func (slice keys) Len() int { 437 return len(slice) 438 } 439 440 func (slice keys) Less(i, j int) bool { 441 return strings.Compare(crypto.PubkeyToAddress(slice[i].PublicKey).String(), crypto.PubkeyToAddress(slice[j].PublicKey).String()) < 0 442 } 443 444 func (slice keys) Swap(i, j int) { 445 slice[i], slice[j] = slice[j], slice[i] 446 } 447 448 type Pair struct { 449 Sequence int64 450 Round int64 451 } 452 453 func getTestCouncil() []common.Address { 454 return []common.Address{ 455 common.HexToAddress("0x414790CA82C14A8B975cEBd66098c3dA590bf969"), // Node Address for test 456 common.HexToAddress("0x604973C51f6389dF2782E018000c3AC1257dee90"), 457 common.HexToAddress("0x5Ac1689ae5F521B05145C5Cd15a3E8F6ab39Af19"), 458 common.HexToAddress("0x0688CaC68bbF7c1a0faedA109c668a868BEd855E"), 459 common.HexToAddress("0xaD227Fd4d8a6f464Fb5A8bcf38533337A02Db4e0"), 460 common.HexToAddress("0xf2E89C8e9B4C903c046Bb183a3175405fE98A1Db"), 461 common.HexToAddress("0xc5D9E04E58717A7Dc4757DF98B865A1525187060"), 462 common.HexToAddress("0x99F215e780e352647A1f83E17Eb91930aDbaf3e2"), 463 common.HexToAddress("0xf4eBE96E668c5a372C6ad2924C2B9892817c1b61"), 464 common.HexToAddress("0x0351D00Cf34b6c2891bf91B6130651903BBdE7df"), 465 common.HexToAddress("0xbc0182AA0516666cec5c8185311d80d02b2Bb1F5"), 466 common.HexToAddress("0xf8cbeF7eDf33c1437d17aeAC1b2AfC8430a5eAd7"), 467 common.HexToAddress("0xbEC6E6457aAE091FC905122DeFf1f97532395896"), 468 common.HexToAddress("0x3c1587F672Cf9C457FC229ccA9Cc0c8e29af88BE"), 469 common.HexToAddress("0xcE9E07d403Cf3fC3fa6E2F3e0f88e0272Af42EF3"), 470 common.HexToAddress("0x711EAd71f23e6b84BD536021Bd02B3706B81A3bE"), 471 common.HexToAddress("0xb84A4985CD5B5b1CE56527b89b3e447820633856"), 472 common.HexToAddress("0x739E64B2a55626c921114ee8B49cD1b7E5E2bBB0"), 473 common.HexToAddress("0x0312b2B142855986C5937eb33E0993ecA142Caca"), 474 common.HexToAddress("0xd3AbD32504eA87409Bbb5190059c077C6a9df879"), 475 common.HexToAddress("0x0978D638BAc5990c64E52A69C6F33222F16117Ee"), 476 common.HexToAddress("0x131855B4D54E9AE376E568dd7c9d925AA6eE0545"), 477 common.HexToAddress("0x0c7f24972D43B1F6dD1286275EC089755b15514D"), 478 common.HexToAddress("0xc46C39B333C0828820087E7950Ad9F7b30E38373"), 479 common.HexToAddress("0x5b3c0E461409a671B15fD1D284F87d2CD1994386"), 480 common.HexToAddress("0xB5EA5afCC5045690Afd2afb62748227e16872efA"), 481 common.HexToAddress("0x598cC8b6026d666681598ea1d0C85D2b06876277"), 482 common.HexToAddress("0xD86D0dB9f101600A4ED8043772654C9D076c0616"), 483 common.HexToAddress("0x82d718F86D04454cF5736215110d0a5d9bEe420D"), 484 common.HexToAddress("0xE0F03B6915B9e900B258384106644CDab6aAfc24"), 485 common.HexToAddress("0xCd28661B14DCda6e002408a0D3A35C1448be7f23"), 486 common.HexToAddress("0x77Fd4877Dda3641588E5362744fc6A5d4AE3b731"), 487 common.HexToAddress("0xD7E2FEFE5c1C33e91deFf3cAeC3adC8bD3b6afB8"), 488 common.HexToAddress("0x7A15B06DDd3ff274F686F9f4a69975BF27aBe37b"), 489 common.HexToAddress("0x34083A2D7b252EA7c4EC1C92A2D9D6F2bE6B347e"), 490 common.HexToAddress("0x7C73ee31E9b79aEb26B634E46202C46B13160Eba"), 491 common.HexToAddress("0x16F7D538Afd579068B88384bCa3c3aefb66C0E52"), 492 common.HexToAddress("0x7584dbFad6664F604C9C0dE3c822961A10E064f9"), 493 common.HexToAddress("0xE6c82318Da0819880137cCAE993e73d2bC1b8b20"), 494 common.HexToAddress("0x0699d025c98ce2CB3C96050efFB1450fE64f5C9E"), 495 common.HexToAddress("0x9b6Bdb3a669A721b3FeE537B5B5914B8D9d7F980"), 496 common.HexToAddress("0x4CbC62FF9893df8acF8982f0D3948Ec54F8a1d6c"), 497 common.HexToAddress("0xBE993372712Cb7ff05c2fc7D21F36a75e8033224"), 498 common.HexToAddress("0x2C4CF83c05B7127a714E1749B3079B016E1a7B8f"), 499 common.HexToAddress("0xEDE8613a71A914FD3AFC6E219f798f904ffB63e5"), 500 common.HexToAddress("0x5fB8bc27982B7122ae6Fd4D4ddbA3E69779422B3"), 501 common.HexToAddress("0x1b95B986EeDa22e31f10c6499Cbc236386Ac6817"), 502 common.HexToAddress("0xC6B027F0d09348020Bd5e3E6ed692f2F145c6D73"), 503 common.HexToAddress("0x06Fc6F3032C03f90eA5C0bE7B95AB8973074D9f4"), 504 common.HexToAddress("0x183ed276Ef12bA138c96B51D86619a5A8De82b3e"), 505 common.HexToAddress("0xb2AaC4685Bbf98a114f3949Db456545C62AF096c"), 506 common.HexToAddress("0xD9c041861214F1D7484e924F87c30B7a5e0DA462"), 507 common.HexToAddress("0xa3255A75799De01f3b93Bf0D9DF34F5d767CeDE0"), 508 common.HexToAddress("0xFC112865D09332c2122c5b29bb6FccA171A6c41c"), 509 common.HexToAddress("0xFA58289602bfE7B029b09D74046a36fA80a41F71"), 510 common.HexToAddress("0x7d60D7c9ae172d5C8A61eDc37e55F6A60E175f14"), 511 common.HexToAddress("0x2A7D561FFAA1fD6f4Db0eC0eB20799cfdd9AfA37"), 512 common.HexToAddress("0xaAa5133219d8fdB6Cad565CBEBc9113b818C64b5"), 513 common.HexToAddress("0x219bFfaB40F95673F3a4eb243C23E0803a343d9E"), 514 common.HexToAddress("0x6A53aA17DBaAE11a428576501D72fe346cB7B1f7"), 515 common.HexToAddress("0x4225BE9Eae8309FdE653CFd3d6A8146Bd0389d3b"), 516 common.HexToAddress("0x63F7e13f7e586480D2AD4901311A66aecfd714F4"), 517 common.HexToAddress("0xAb571920e680A1350FAb4a8eecF3cf8451FBBD4D"), 518 common.HexToAddress("0xB12cD0799C6caf355A7cccB188E1C6d5FA6e789c"), 519 common.HexToAddress("0xFEf0372eb16b77B67C4AC39e8aF045624392F53c"), 520 common.HexToAddress("0x9Ee226196605D536feed2e3Ac4c87a695c394200"), 521 common.HexToAddress("0x1e6E55D4485853Bb5b42Ec591e2900ACd9C8a7eA"), 522 common.HexToAddress("0xdf0C7B415738E5167E5E43563f11FFDF46696FB0"), 523 common.HexToAddress("0x718a3B4b201849E0B2905EC0A29c5c9323017FC3"), 524 common.HexToAddress("0xa906b367D2B0E8426C00B622488F6495b333a5c3"), 525 common.HexToAddress("0x4dBDAb308824dF54225F5a8B11c890B386b39C2C"), 526 common.HexToAddress("0xA0D13983Daa2604e66F692Cf695d5D04b39958c4"), 527 common.HexToAddress("0x5bae720C342157325B1D710766326766a41D50F2"), 528 common.HexToAddress("0x4d1890BdB54dde6656E89e9b1447672759AF18aB"), 529 common.HexToAddress("0x4e2cFB15010A576B6c2c70C1701E2d2dfF4FB2A7"), 530 common.HexToAddress("0x8858B61E2A724aEc8542f1B53aE7C1b08Bf823c8"), 531 common.HexToAddress("0x8849E54A211B6d8D096C150DF33795d6B1cF6ba9"), 532 common.HexToAddress("0x14193546e619761795973b9De768753c61C5f9CB"), 533 common.HexToAddress("0xdFa4b5b4f241F4F7D254A840F648B81ca2338F82"), 534 common.HexToAddress("0xB51aF0332993Dc3cB7211AD42C761F736A9Af82a"), 535 common.HexToAddress("0x69660E66352f91D19Ac12CEc20ee27aC4346AC3F"), 536 common.HexToAddress("0xdB0384Ece61E79e99F7944f4651a0b129c383279"), 537 common.HexToAddress("0x65a13961017181Ba5Be64959527242251aBB21B9"), 538 common.HexToAddress("0xc96a196e136403f530C9a6642C3181530124cb59"), 539 common.HexToAddress("0x4788f45D1AF4508A4c9a26dAB839556466f1481b"), 540 common.HexToAddress("0xc53e50937E481364b6b6926F572ea65b3B790cDA"), 541 common.HexToAddress("0xF94270fD8a0393202233D5e0163a41cb0A272DEe"), 542 common.HexToAddress("0xEF2892748176A6345D7EC22924C4A5f6ec563ccc"), 543 common.HexToAddress("0x6A01Eba6729F2Fa4A570ff94FA4Cf51Dde428c27"), 544 common.HexToAddress("0x0CD9337A1C5B744B9D99db496706d916c76a3B27"), 545 common.HexToAddress("0xffE19f7e59eB3bc0a29907D3E8d5397703CAe605"), 546 common.HexToAddress("0xE74dCd57694FE43D1813595a43AC8c54DEd62Fed"), 547 common.HexToAddress("0x7E07f18eD745cD216341147c990088f445179a1c"), 548 common.HexToAddress("0x0eC5d785C5b47C70154cCd93D71cCCB624b00b29"), 549 common.HexToAddress("0x6D576beB3ec319Ab366aC7455d3D096e9d2De67d"), 550 common.HexToAddress("0x8D8083125960CB0F4e638dB1a0ee855d438a707E"), 551 common.HexToAddress("0xCF9b3b510f11285356167396BABe9A4063DAa1dD"), 552 common.HexToAddress("0x38b6bAb66D8CD7035f4f90d87aF7d41d7958bed7"), 553 common.HexToAddress("0x8c597E4b0A71571C209293c278099B6D85Cd3290"), 554 common.HexToAddress("0x39Cdf8a09f5c516951E0FBa684086702912a4810"), 555 } 556 } 557 558 func getTestRewards() []common.Address { 559 return []common.Address{ 560 common.HexToAddress("0x2A35FE72F847aa0B509e4055883aE90c87558AaD"), 561 common.HexToAddress("0xF91B8EBa583C7fa603B400BE17fBaB7629568A4a"), 562 common.HexToAddress("0x240ed27c8bDc9Bb6cA08fa3D239699Fba525d05a"), 563 common.HexToAddress("0x3B980293396Fb0e827929D573e3e42d2EA902502"), 564 common.HexToAddress("0x11F3B5a36DBc8d8D289CE41894253C0D513cf777"), 565 common.HexToAddress("0x7eDD28614052D42430F326A78956859a462f3Cd1"), 566 common.HexToAddress("0x3e473733b16D88B695fc9E2278Ab854F449Ea017"), 567 common.HexToAddress("0x873B6D0404b46Ddde4DcfC34380C14f54002aE27"), 568 common.HexToAddress("0xC85719Ffb158e1Db55D6704B6AE193aa00f5341e"), 569 common.HexToAddress("0x957A2DB51Ba8BADA57218FA8580a23a9c64B618f"), 570 common.HexToAddress("0x5195eC4dC0048032a7dA40B861D47d560Bfd9462"), 571 common.HexToAddress("0x11e3219418e6214c12E3A6271d1B56a68526fB99"), 572 common.HexToAddress("0x2edB0c9072497A2276248B0ae11D560114b273fC"), 573 common.HexToAddress("0x26e059665D30Bbe015B3b131175F53903cAa2Df9"), 574 common.HexToAddress("0x70528eC69e4e710F71c22aEdA6315Fe1750298e3"), 575 common.HexToAddress("0xFb538Db8C0b71236bF2B7091AdD0576879D2B8D4"), 576 common.HexToAddress("0x705Ec0595A40D1A3B77360CE9cA138b731b193ac"), 577 common.HexToAddress("0x55Cede11Bfe34cdB844c87979a35a7369B36Af2D"), 578 common.HexToAddress("0xCe79d52e0215872C0515767E46D3C29EC6C858B7"), 579 common.HexToAddress("0xf83cedb170F84517A693e0A111F99Fe5C4FA50B2"), 580 common.HexToAddress("0xCF4ff5446B6e1Ee4151B5E455B5a6f80a2296AdB"), 581 common.HexToAddress("0xB5A7a3bFA0FA44a9CcBED4dc7777013Dfc4D43bc"), 582 common.HexToAddress("0xcBa042B2B44512FbB31Be4a478252Fcc78Bd94fB"), 583 common.HexToAddress("0xed7a54066A503A93Cd04F572E39e0F02eE0c92af"), 584 common.HexToAddress("0x1630a3F6fe4Fc3a4eb2212d12306AEF856F874Df"), 585 common.HexToAddress("0x8fb35e1bB2Cf26355b7906b3747db941Fc48bf0C"), 586 common.HexToAddress("0x211F9Bf01C553644B22AbA5ca83C2B8F9A07E49B"), 587 common.HexToAddress("0xf08Cb412aeb59de13a5F56Df43BA75EaA3B2F0dE"), 588 common.HexToAddress("0xc57047791C184Baf0184bd1e0a5e012532b40A45"), 589 common.HexToAddress("0x6660E78cE36d96d81e447D51D83ce3930b54effC"), 590 common.HexToAddress("0x0736f11d0c066C6e76CE40d89AfCa86FA0Ce9AB5"), 591 common.HexToAddress("0x6881515A8499f871E95a4EC17689a37afB5Bc600"), 592 common.HexToAddress("0x96b8473f80DB5Fa8056CBb1bCECAe1f25C35733D"), 593 common.HexToAddress("0xf9D4D5286bbDeffbcf34d342c47b3E6e52Bfcc08"), 594 common.HexToAddress("0x272a690C3B3136d4d431800486233EECBb2092C5"), 595 common.HexToAddress("0x98760b1954017DCDAaf466C03d85954E4bF2E431"), 596 common.HexToAddress("0xbfFFE194Ebf9953C92a206Fb9c71612afBA80D53"), 597 common.HexToAddress("0xF6dF311801f6B9ec7ce7e5aba31CDf3dC02de133"), 598 common.HexToAddress("0x675D19896DA6bca2E236F7C3229E1d82993dDB69"), 599 common.HexToAddress("0x426d004E495DdE95AdCeE5912cdbf90F2692667b"), 600 common.HexToAddress("0xe4ed55aB59335341A7dfc153f8068984d53bbaa8"), 601 common.HexToAddress("0xf7399b92de54BC059E957CE9c1baE294aEF1DA08"), 602 common.HexToAddress("0x41259376048AF3FBf302b8E588fF8003e3b44F06"), 603 common.HexToAddress("0xb007291DDE0Ca6BDd69aB16902bea67819abc515"), 604 common.HexToAddress("0x9A04d8d78fd8c536563cdA344b5A04DbF27D67D3"), 605 common.HexToAddress("0x12465F01b52CAEC4c3C0197308F6dF8E54163d9c"), 606 common.HexToAddress("0x323cf51E7A511De099d5E39dC3ed8B8DDdB3F038"), 607 common.HexToAddress("0x36e3E1E34d456975e8C6aFbD7c6F5Fc0F98E0887"), 608 common.HexToAddress("0x1A1ed8ae1dC926Be272888ed56EA13503fcE5680"), 609 common.HexToAddress("0x8D5D4eD1678F77b7337BA8042fb8C9E7361cbFF5"), 610 common.HexToAddress("0xbBbfc9358f931Cd105107d93b5DF97159C933096"), 611 common.HexToAddress("0xA82FacF50E9722d6fFa30e186A01625CCE03aA5a"), 612 common.HexToAddress("0xA2b73E026CAFB45af42705f994e884fa1D7c25Ad"), 613 common.HexToAddress("0x3dEE1382719E04505Df63df4A604CCB705FaC016"), 614 common.HexToAddress("0xDf41a247f7F7Ed4F191932844F1C1Dd23D9a76fB"), 615 common.HexToAddress("0x95debC7f1a4B30F1451c95178aCaC6e72539C633"), 616 common.HexToAddress("0x505594ACc508D855eAAF68CDd516011D53F76a54"), 617 common.HexToAddress("0xfFE3160f6B5c73952D2A8f55022f827854cdB8C5"), 618 common.HexToAddress("0x76BaE5bdE095a4a5F256DEa65259d24d454B777d"), 619 common.HexToAddress("0xfF34f95Cf7815268Bf3e62AbFBc5452606bdB336"), 620 common.HexToAddress("0x677799E7804c930Dd430470B9F0C6Cd6523Dd487"), 621 common.HexToAddress("0x7b3D56CFfe4CB5F5EDbDd4b7a41b5eBa848e9348"), 622 common.HexToAddress("0x9e80C52fC892C916616Fc7235B885047e1165Dfe"), 623 common.HexToAddress("0x5E100F1FFe080CFD7dCBAEe2Fa1DbE4D81327955"), 624 common.HexToAddress("0x0C4Cf38D7769243f843DE339f866bB6f770Bc7DD"), 625 common.HexToAddress("0xf23A77988e0592CDa049fe7aBb46E900a704eE90"), 626 common.HexToAddress("0xC67a2ff05C5CA95D76525f5E471701813A877fB2"), 627 common.HexToAddress("0x8bA5d606bEBe3CC4F4C001B68764771584cD9E4f"), 628 common.HexToAddress("0x82A39CddA3e64b2EcE2E161116AfCc7Bc5aABC7c"), 629 common.HexToAddress("0x0324216F0bBA982B01B38A0A354783324B1A6a00"), 630 common.HexToAddress("0x229CdA4Dfc2ED2503aBCfdca39aA1D4d665281a6"), 631 common.HexToAddress("0x53C65264994dccEFBe1C3C6b4c2C9fCf4fc3458a"), 632 common.HexToAddress("0x822BB8E5a0650740424B2bBbd3BcdaD2B8e4FB96"), 633 common.HexToAddress("0xaE939D5C93fB3d8522738bC5D84a69b7d9ec625F"), 634 common.HexToAddress("0xF32Dc9C078028A2C8a4104ea70615ADB3010B2b0"), 635 common.HexToAddress("0x2c231E031e9803e35B97578B536eE3739EBa886F"), 636 common.HexToAddress("0xF6c24F7e7461BA43800E20bdd32c8483eB8aA152"), 637 common.HexToAddress("0xB3363359C172bdE5a0747444cbC9108e50FEf826"), 638 common.HexToAddress("0xc6a42020AD8fB61fa3A4c248310625bBdd5cd04c"), 639 common.HexToAddress("0xbE797039B57007CEa7F4F5961a6AB64dFc076D0c"), 640 common.HexToAddress("0xe12F6f36D939ff66CBF35b5F67f3D8670dD4228f"), 641 common.HexToAddress("0x4c9d56C6c06b48511FdbFD4Dd7C82D56bcAC88f3"), 642 common.HexToAddress("0x1Ab93C25Fd220e8C80ae0dA73bcfC56f969aD8Db"), 643 common.HexToAddress("0xF25ccD01c83ee36a0361f60B164108ea1E57FE14"), 644 common.HexToAddress("0x6f7C69666a9E6B34835f505C3025bcd95Aae2600"), 645 common.HexToAddress("0xc78387B2384Dcef8c7a9b39BD688d2C2776945E2"), 646 common.HexToAddress("0x4786F93B4e041eBB7F1EcF9172fE4Cf0c16bD88E"), 647 common.HexToAddress("0x1d64Ea74B2EEB37fB24158A5d12Eb5b61c718f44"), 648 common.HexToAddress("0xf5E9Fc7Bf47c9b0eE7C8349eBf3F6442fec426d8"), 649 common.HexToAddress("0x8aA20E60Da8b86717A9785ec255Aceb8E509107f"), 650 common.HexToAddress("0x74cc084275253fabD14a0ee6264047503057Aa88"), 651 common.HexToAddress("0xc1AF209ed6fe5ae23ac5ad3f4D189E0E04D925E8"), 652 common.HexToAddress("0x4725563C44e432013B20d06395130A0d24ad091F"), 653 common.HexToAddress("0x6aFB4f059BA732d5143f0fAfD5534501Cf57A47C"), 654 common.HexToAddress("0xCB1c4478cbE37a4B7a1510065802e0B669979cFD"), 655 common.HexToAddress("0xf7ed2347390b1f742DA9785242dF90BbbC8Af90C"), 656 common.HexToAddress("0x8BC37790112C66DF94cB05dC5168249a7e6d6717"), 657 common.HexToAddress("0x9087C8dd3dE26B6DB3a471D7254d78FB1afCbeF2"), 658 common.HexToAddress("0xcAfaA922f46d0a0FcE13B0f2aA822aF9C4b9a31C"), 659 common.HexToAddress("0xa21b5d69efDFE56a9C272f7957Bd6d4205a1e6Ff"), 660 } 661 } 662 663 func getTestVotingPowers(num int) []uint64 { 664 vps := make([]uint64, 0, num) 665 for i := 0; i < num; i++ { 666 vps = append(vps, 1) 667 } 668 return vps 669 } 670 671 func getTestConfig() *params.ChainConfig { 672 config := params.TestChainConfig.Copy() 673 config.Governance = params.GetDefaultGovernanceConfig() 674 config.Istanbul = params.GetDefaultIstanbulConfig() 675 return config 676 } 677 678 func Benchmark_getTargetReceivers(b *testing.B) { 679 _, backend := newBlockChain(1) 680 defer backend.Stop() 681 682 backend.currentView.Store(&istanbul.View{Sequence: big.NewInt(0), Round: big.NewInt(0)}) 683 684 // Create ValidatorSet 685 council := getTestCouncil() 686 rewards := getTestRewards() 687 valSet := validator.NewWeightedCouncil(council, nil, rewards, getTestVotingPowers(len(council)), nil, istanbul.WeightedRandom, 21, 0, 0, nil) 688 valSet.SetBlockNum(uint64(1)) 689 valSet.CalcProposer(valSet.GetProposer().Address(), uint64(1)) 690 hex := fmt.Sprintf("%015d000000000000000000000000000000000000000000000000000", 1) 691 prevHash := common.HexToHash(hex) 692 693 for i := 0; i < b.N; i++ { 694 _ = backend.getTargetReceivers(prevHash, valSet) 695 } 696 } 697 698 // Test_GossipSubPeerTargets checks if the gossiping targets are same as council members 699 func Test_GossipSubPeerTargets(t *testing.T) { 700 // get testing node's address 701 key, _ := crypto.HexToECDSA(PRIVKEY) // This key is to be provided to create backend 702 703 _, backend := newBlockChain(1, istanbulCompatibleBlock(big.NewInt(5)), key) 704 defer backend.Stop() 705 706 // Create ValidatorSet 707 council := getTestCouncil() 708 rewards := getTestRewards() 709 valSet := validator.NewWeightedCouncil(council, nil, rewards, getTestVotingPowers(len(council)), nil, istanbul.WeightedRandom, 21, 0, 0, nil) 710 valSet.SetBlockNum(uint64(5)) 711 712 // Test for blocks from 0 to maxBlockNum 713 // from 0 to 4: before istanbul hard fork 714 // from 5 to 100: after istanbul hard fork 715 for i := int64(0); i < maxBlockNum; i++ { 716 // Test for round 0 to round 14 717 for round := int64(0); round < 15; round++ { 718 backend.currentView.Store(&istanbul.View{Sequence: big.NewInt(i), Round: big.NewInt(round)}) 719 valSet.SetBlockNum(uint64(i)) 720 valSet.CalcProposer(valSet.GetProposer().Address(), uint64(round)) 721 722 // Use block number as prevHash. In SubList() only left 15 bytes are being used. 723 hex := fmt.Sprintf("%015d000000000000000000000000000000000000000000000000000", i) 724 prevHash := common.HexToHash(hex) 725 726 // committees[0]: current committee 727 // committees[1]: next committee 728 committees := make([][]istanbul.Validator, 2) 729 730 // Getting the current round's committee 731 viewCurrent := backend.currentView.Load().(*istanbul.View) 732 committees[0] = valSet.SubList(prevHash, viewCurrent) 733 734 // Getting the next round's committee 735 viewCurrent.Round = viewCurrent.Round.Add(viewCurrent.Round, common.Big1) 736 backend.currentView.Store(viewCurrent) 737 738 valSet.CalcProposer(valSet.GetProposer().Address(), uint64(round+1)) 739 committees[1] = valSet.SubList(prevHash, viewCurrent) 740 741 // Reduce round by 1 to set round to the current round before calling GossipSubPeer 742 viewCurrent.Round = viewCurrent.Round.Sub(viewCurrent.Round, common.Big1) 743 valSet.CalcProposer(valSet.GetProposer().Address(), uint64(round)) 744 backend.currentView.Store(viewCurrent) 745 746 // Receiving the receiver list of a message 747 targets := backend.GossipSubPeer(prevHash, valSet, nil) 748 749 // Check if the testing node is in a committee 750 isInSubList := backend.checkInSubList(prevHash, valSet) 751 isInCommitteeBlocks := checkInCommitteeBlocks(i, round) 752 753 // Check if the result of checkInSubList is same as expected. It is to detect an unexpected change in SubList logic 754 if isInSubList != isInCommitteeBlocks { 755 t.Errorf("Difference in expected data and calculated one. Changed committee selection? HARD FORK may happen!! Sequence: %d, Round: %d", i, round) 756 } else { 757 if isInSubList == false { 758 continue 759 } 760 } 761 762 // number of message receivers have to be smaller than or equal to the number of the current committee and the next committee 763 if len(targets) > len(committees[0])+len(committees[1]) { 764 t.Errorf("Target has too many validators. targets: %d, sum of committees: %d", len(targets), len(committees[0])+len(committees[1])) 765 } 766 767 // Check all nodes in the current and the next round are included in the target list 768 for n := 0; n < len(committees); n++ { 769 for _, x := range committees[n] { 770 if _, ok := targets[x.Address()]; !ok && x.Address() != backend.Address() { 771 t.Errorf("Block: %d, Round: %d, Committee member %v not found in targets", i, round, x.Address().String()) 772 } else { 773 // Mark the target is in the current or in the next committee 774 targets[x.Address()] = false 775 } 776 } 777 } 778 779 // Check if a validator not in the current/next committee is included in target list 780 for k, v := range targets { 781 if v == true { 782 t.Errorf("Block: %d, Round: %d, Validator not in committees included %v", i, round, k.String()) 783 } 784 } 785 } 786 } 787 // Check if the testing node is in all committees that it is supposed to be 788 for k, v := range committeeBlocks { 789 if !v { 790 fmt.Printf("The node is missing in committee that it should be included in. Sequence %d, Round %d\n", k.Sequence, k.Round) 791 } 792 } 793 } 794 795 func checkInCommitteeBlocks(seq int64, round int64) bool { 796 v := Pair{seq, round} 797 if _, ok := committeeBlocks[v]; ok { 798 committeeBlocks[v] = true 799 return true 800 } 801 return false 802 } 803 804 func newTestBackend() (b *backend) { 805 config := getTestConfig() 806 config.Istanbul.ProposerPolicy = params.WeightedRandom 807 return newTestBackendWithConfig(config, istanbul.DefaultConfig.BlockPeriod, nil) 808 } 809 810 func newTestBackendWithConfig(chainConfig *params.ChainConfig, blockPeriod uint64, key *ecdsa.PrivateKey) (b *backend) { 811 dbm := database.NewMemoryDBManager() 812 if key == nil { 813 // if key is nil, generate new key for a test account 814 key, _ = crypto.GenerateKey() 815 } 816 if chainConfig.Governance.GovernanceMode == "single" { 817 // if governance mode is single, set the node key to the governing node. 818 chainConfig.Governance.GoverningNode = crypto.PubkeyToAddress(key.PublicKey) 819 } 820 gov := governance.NewMixedEngine(chainConfig, dbm) 821 istanbulConfig := istanbul.DefaultConfig 822 istanbulConfig.BlockPeriod = blockPeriod 823 istanbulConfig.ProposerPolicy = istanbul.ProposerPolicy(chainConfig.Istanbul.ProposerPolicy) 824 istanbulConfig.Epoch = chainConfig.Istanbul.Epoch 825 istanbulConfig.SubGroupSize = chainConfig.Istanbul.SubGroupSize 826 827 backend := New(&BackendOpts{ 828 IstanbulConfig: istanbulConfig, 829 Rewardbase: getTestRewards()[0], 830 PrivateKey: key, 831 DB: dbm, 832 Governance: gov, 833 NodeType: common.CONSENSUSNODE, 834 }).(*backend) 835 gov.SetNodeAddress(backend.Address()) 836 return backend 837 } 838 839 func newTestValidatorSet(n int, policy istanbul.ProposerPolicy) (istanbul.ValidatorSet, []*ecdsa.PrivateKey) { 840 // generate validators 841 keys := make(keys, n) 842 addrs := make([]common.Address, n) 843 for i := 0; i < n; i++ { 844 privateKey, _ := crypto.GenerateKey() 845 keys[i] = privateKey 846 addrs[i] = crypto.PubkeyToAddress(privateKey.PublicKey) 847 } 848 vset := validator.NewSet(addrs, policy) 849 sort.Sort(keys) // Keys need to be sorted by its public key address 850 return vset, keys 851 } 852 853 func TestSign(t *testing.T) { 854 b := newTestBackend() 855 856 sig, err := b.Sign(testSigningData) 857 if err != nil { 858 t.Errorf("error mismatch: have %v, want nil", err) 859 } 860 861 // Check signature recover 862 hashData := crypto.Keccak256([]byte(testSigningData)) 863 pubkey, _ := crypto.Ecrecover(hashData, sig) 864 actualSigner := common.BytesToAddress(crypto.Keccak256(pubkey[1:])[12:]) 865 866 if actualSigner != b.address { 867 t.Errorf("address mismatch: have %v, want %s", actualSigner.Hex(), b.address.Hex()) 868 } 869 } 870 871 func TestCheckSignature(t *testing.T) { 872 b := newTestBackend() 873 874 // testAddr is derived from testPrivateKey. 875 testPrivateKey, _ := crypto.HexToECDSA("bb047e5940b6d83354d9432db7c449ac8fca2248008aaa7271369880f9f11cc1") 876 testAddr := common.HexToAddress("0x70524d664ffe731100208a0154e556f9bb679ae6") 877 testInvalidAddr := common.HexToAddress("0x9535b2e7faaba5288511d89341d94a38063a349b") 878 879 hashData := crypto.Keccak256([]byte(testSigningData)) 880 sig, err := crypto.Sign(hashData, testPrivateKey) 881 if err != nil { 882 t.Fatalf("unexpected failure: %v", err) 883 } 884 885 if err := b.CheckSignature(testSigningData, testAddr, sig); err != nil { 886 t.Errorf("error mismatch: have %v, want nil", err) 887 } 888 889 if err := b.CheckSignature(testSigningData, testInvalidAddr, sig); err != errInvalidSignature { 890 t.Errorf("error mismatch: have %v, want %v", err, errInvalidSignature) 891 } 892 } 893 894 func TestCheckValidatorSignature(t *testing.T) { 895 vset, keys := newTestValidatorSet(5, istanbul.WeightedRandom) 896 897 // 1. Positive test: sign with validator's key should succeed 898 hashData := crypto.Keccak256([]byte(testSigningData)) 899 for i, k := range keys { 900 // Sign 901 sig, err := crypto.Sign(hashData, k) 902 if err != nil { 903 t.Errorf("error mismatch: have %v, want nil", err) 904 } 905 // CheckValidatorSignature should succeed 906 addr, err := istanbul.CheckValidatorSignature(vset, testSigningData, sig) 907 if err != nil { 908 t.Errorf("error mismatch: have %v, want nil", err) 909 } 910 validator := vset.GetByIndex(uint64(i)) 911 if addr != validator.Address() { 912 t.Errorf("validator address mismatch: have %v, want %v", addr, validator.Address()) 913 } 914 } 915 916 // 2. Negative test: sign with any key other than validator's key should return error 917 key, err := crypto.GenerateKey() 918 if err != nil { 919 t.Errorf("error mismatch: have %v, want nil", err) 920 } 921 // Sign 922 sig, err := crypto.Sign(hashData, key) 923 if err != nil { 924 t.Errorf("error mismatch: have %v, want nil", err) 925 } 926 // CheckValidatorSignature should return ErrUnauthorizedAddress 927 addr, err := istanbul.CheckValidatorSignature(vset, testSigningData, sig) 928 if err != istanbul.ErrUnauthorizedAddress { 929 t.Errorf("error mismatch: have %v, want %v", err, istanbul.ErrUnauthorizedAddress) 930 } 931 emptyAddr := common.Address{} 932 if addr != emptyAddr { 933 t.Errorf("address mismatch: have %v, want %v", addr, emptyAddr) 934 } 935 } 936 937 func TestCommit(t *testing.T) { 938 backend := newTestBackend() 939 oldStakingManager := setTestStakingInfo(nil) 940 defer reward.SetTestStakingManager(oldStakingManager) 941 942 commitCh := make(chan *types.Block) 943 // Case: it's a proposer, so the backend.commit will receive channel result from backend.Commit function 944 testCases := []struct { 945 expectedErr error 946 expectedSignature [][]byte 947 expectedBlock func() *types.Block 948 }{ 949 { 950 // normal case 951 nil, 952 [][]byte{append([]byte{1}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-1)...)}, 953 func() *types.Block { 954 chain, engine := newBlockChain(1) 955 defer engine.Stop() 956 957 block := makeBlockWithoutSeal(chain, engine, chain.Genesis()) 958 expectedBlock, _ := engine.updateBlock(block) 959 return expectedBlock 960 }, 961 }, 962 { 963 // invalid signature 964 errInvalidCommittedSeals, 965 nil, 966 func() *types.Block { 967 chain, engine := newBlockChain(1) 968 defer engine.Stop() 969 970 block := makeBlockWithoutSeal(chain, engine, chain.Genesis()) 971 expectedBlock, _ := engine.updateBlock(block) 972 return expectedBlock 973 }, 974 }, 975 } 976 977 for _, test := range testCases { 978 expBlock := test.expectedBlock() 979 go func() { 980 select { 981 case result := <-backend.commitCh: 982 commitCh <- result.Block 983 return 984 } 985 }() 986 987 backend.proposedBlockHash = expBlock.Hash() 988 if err := backend.Commit(expBlock, test.expectedSignature); err != nil { 989 if err != test.expectedErr { 990 t.Errorf("error mismatch: have %v, want %v", err, test.expectedErr) 991 } 992 } 993 994 if test.expectedErr == nil { 995 // to avoid race condition is occurred by goroutine 996 select { 997 case result := <-commitCh: 998 if result.Hash() != expBlock.Hash() { 999 t.Errorf("hash mismatch: have %v, want %v", result.Hash(), expBlock.Hash()) 1000 } 1001 case <-time.After(10 * time.Second): 1002 t.Fatal("timeout") 1003 } 1004 } 1005 } 1006 } 1007 1008 func TestGetProposer(t *testing.T) { 1009 chain, engine := newBlockChain(1) 1010 defer engine.Stop() 1011 oldStakingManager := setTestStakingInfo(nil) 1012 defer reward.SetTestStakingManager(oldStakingManager) 1013 1014 block := makeBlock(chain, engine, chain.Genesis()) 1015 _, err := chain.InsertChain(types.Blocks{block}) 1016 if err != nil { 1017 t.Errorf("failed to insert chain: %v", err) 1018 } 1019 expected := engine.GetProposer(1) 1020 actual := engine.Address() 1021 if actual != expected { 1022 t.Errorf("proposer mismatch: have %v, want %v", actual.Hex(), expected.Hex()) 1023 } 1024 }