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  }