github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/consensus/istanbul/qbft/engine/engine_test.go (about)

     1  package qbftengine
     2  
     3  import (
     4  	"bytes"
     5  	"math/big"
     6  	"reflect"
     7  	"testing"
     8  
     9  	"github.com/kisexp/xdchain/common"
    10  	"github.com/kisexp/xdchain/common/hexutil"
    11  	istanbulcommon "github.com/kisexp/xdchain/consensus/istanbul/common"
    12  	"github.com/kisexp/xdchain/core/types"
    13  )
    14  
    15  func TestPrepareExtra(t *testing.T) {
    16  	validators := make([]common.Address, 4)
    17  	validators[0] = common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a"))
    18  	validators[1] = common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212"))
    19  	validators[2] = common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6"))
    20  	validators[3] = common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440"))
    21  
    22  	expectedResult := hexutil.MustDecode("0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c080c0")
    23  
    24  	h := &types.Header{}
    25  	err := ApplyHeaderQBFTExtra(
    26  		h,
    27  		WriteValidators(validators),
    28  	)
    29  	if err != nil {
    30  		t.Errorf("error mismatch: have %v, want: nil", err)
    31  	}
    32  	if !reflect.DeepEqual(h.Extra, expectedResult) {
    33  		t.Errorf("payload mismatch: have %v, want %v", h.Extra, expectedResult)
    34  	}
    35  }
    36  
    37  func TestWriteCommittedSeals(t *testing.T) {
    38  	istRawData := hexutil.MustDecode("0xf85a80f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c080c0")
    39  	expectedCommittedSeal := append([]byte{1, 2, 3}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-3)...)
    40  	expectedIstExtra := &types.QBFTExtra{
    41  		VanityData: []byte{},
    42  		Validators: []common.Address{
    43  			common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")),
    44  			common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")),
    45  			common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")),
    46  			common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")),
    47  		},
    48  		CommittedSeal: [][]byte{expectedCommittedSeal},
    49  		Round:         0,
    50  		Vote:          nil,
    51  	}
    52  
    53  	h := &types.Header{
    54  		Extra: istRawData,
    55  	}
    56  
    57  	// normal case
    58  	err := ApplyHeaderQBFTExtra(
    59  		h,
    60  		writeCommittedSeals([][]byte{expectedCommittedSeal}),
    61  	)
    62  	if err != nil {
    63  		t.Errorf("error mismatch: have %v, want: nil", err)
    64  	}
    65  
    66  	// verify istanbul extra-data
    67  	istExtra, err := getExtra(h)
    68  	if err != nil {
    69  		t.Errorf("error mismatch: have %v, want nil", err)
    70  	}
    71  	if !reflect.DeepEqual(istExtra, expectedIstExtra) {
    72  		t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra)
    73  	}
    74  
    75  	// invalid seal
    76  	unexpectedCommittedSeal := append(expectedCommittedSeal, make([]byte, 1)...)
    77  	err = ApplyHeaderQBFTExtra(
    78  		h,
    79  		writeCommittedSeals([][]byte{unexpectedCommittedSeal}),
    80  	)
    81  	if err != istanbulcommon.ErrInvalidCommittedSeals {
    82  		t.Errorf("error mismatch: have %v, want %v", err, istanbulcommon.ErrInvalidCommittedSeals)
    83  	}
    84  }
    85  
    86  func TestWriteRoundNumber(t *testing.T) {
    87  	istRawData := hexutil.MustDecode("0xf85a80f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c005c0")
    88  	expectedIstExtra := &types.QBFTExtra{
    89  		VanityData: []byte{},
    90  		Validators: []common.Address{
    91  			common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")),
    92  			common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")),
    93  			common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")),
    94  			common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")),
    95  		},
    96  		CommittedSeal: [][]byte{},
    97  		Round:         5,
    98  		Vote:          nil,
    99  	}
   100  
   101  	var expectedErr error
   102  
   103  	h := &types.Header{
   104  		Extra: istRawData,
   105  	}
   106  
   107  	// normal case
   108  	err := ApplyHeaderQBFTExtra(
   109  		h,
   110  		writeRoundNumber(big.NewInt(5)),
   111  	)
   112  	if err != expectedErr {
   113  		t.Errorf("error mismatch: have %v, want %v", err, expectedErr)
   114  	}
   115  
   116  	// verify istanbul extra-data
   117  	istExtra, err := getExtra(h)
   118  	if err != nil {
   119  		t.Errorf("error mismatch: have %v, want nil", err)
   120  	}
   121  	if !reflect.DeepEqual(istExtra, expectedIstExtra) {
   122  		t.Errorf("extra data mismatch: have %v, want %v", istExtra.VanityData, expectedIstExtra.VanityData)
   123  	}
   124  }
   125  
   126  func TestWriteValidatorVote(t *testing.T) {
   127  	vanity := bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity)
   128  	istRawData := hexutil.MustDecode("0xf85a80f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b440c005c0")
   129  	vote := &types.ValidatorVote{RecipientAddress: common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f06777123456")), VoteType: types.QBFTAuthVote}
   130  	expectedIstExtra := &types.QBFTExtra{
   131  		VanityData:    vanity,
   132  		Validators:    []common.Address{},
   133  		CommittedSeal: [][]byte{},
   134  		Round:         0,
   135  		Vote:          vote,
   136  	}
   137  
   138  	var expectedErr error
   139  
   140  	h := &types.Header{
   141  		Extra: istRawData,
   142  	}
   143  
   144  	// normal case
   145  	err := ApplyHeaderQBFTExtra(
   146  		h,
   147  		WriteVote(common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f06777123456")), true),
   148  	)
   149  	if err != expectedErr {
   150  		t.Errorf("error mismatch: have %v, want %v", err, expectedErr)
   151  	}
   152  
   153  	// verify istanbul extra-data
   154  	istExtra, err := getExtra(h)
   155  	if err != nil {
   156  		t.Errorf("error mismatch: have %v, want nil", err)
   157  	}
   158  	if !reflect.DeepEqual(istExtra.Vote, expectedIstExtra.Vote) {
   159  		t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra)
   160  	}
   161  }