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  }