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