package ibftengine import ( "bytes" "reflect" "testing" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus/istanbul" istanbulcommon "github.com/ethereum/go-ethereum/consensus/istanbul/common" "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestEngine(t *testing.T) { engine := NewEngine(nil, common.Address{}, nil) require.NotNil(t, engine, "Constructor") assert.Implements(t, new(istanbul.Engine), engine) } func TestPrepareExtra(t *testing.T) { validators := make([]common.Address, 4) validators[0] = common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")) validators[1] = common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")) validators[2] = common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")) validators[3] = common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")) vanity := make([]byte, types.IstanbulExtraVanity) expectedResult := append(vanity, hexutil.MustDecode("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0")...) h := &types.Header{ Extra: vanity, } payload, err := prepareExtra(h, validators) if err != nil { t.Errorf("error mismatch: have %v, want: nil", err) } if !reflect.DeepEqual(payload, expectedResult) { t.Errorf("payload mismatch: have %v, want %v", payload, expectedResult) } // append useless information to extra-data h.Extra = append(vanity, make([]byte, 15)...) payload, _ = prepareExtra(h, validators) if !reflect.DeepEqual(payload, expectedResult) { t.Errorf("payload mismatch: have %v, want %v", payload, expectedResult) } } func TestWriteSeal(t *testing.T) { vanity := bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity) istRawData := hexutil.MustDecode("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0") expectedSeal := append([]byte{1, 2, 3}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-3)...) expectedIstExtra := &types.IstanbulExtra{ Validators: []common.Address{ common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")), common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")), common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")), common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")), }, Seal: expectedSeal, CommittedSeal: [][]byte{}, } var expectedErr error h := &types.Header{ Extra: append(vanity, istRawData...), } // normal case err := writeSeal(h, expectedSeal) if err != expectedErr { t.Errorf("error mismatch: have %v, want %v", err, expectedErr) } // verify istanbul extra-data istExtra, err := types.ExtractIstanbulExtra(h) if err != nil { t.Errorf("error mismatch: have %v, want nil", err) } if !reflect.DeepEqual(istExtra, expectedIstExtra) { t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra) } // invalid seal unexpectedSeal := append(expectedSeal, make([]byte, 1)...) err = writeSeal(h, unexpectedSeal) if err != istanbulcommon.ErrInvalidSignature { t.Errorf("error mismatch: have %v, want %v", err, istanbulcommon.ErrInvalidSignature) } } func TestWriteCommittedSeals(t *testing.T) { vanity := bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity) istRawData := hexutil.MustDecode("0xf858f8549444add0ec310f115a0e603b2d7db9f067778eaf8a94294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212946beaaed781d2d2ab6350f5c4566a2c6eaac407a6948be76812f765c24641ec63dc2852b378aba2b44080c0") expectedCommittedSeal := append([]byte{1, 2, 3}, bytes.Repeat([]byte{0x00}, types.IstanbulExtraSeal-3)...) expectedIstExtra := &types.IstanbulExtra{ Validators: []common.Address{ common.BytesToAddress(hexutil.MustDecode("0x44add0ec310f115a0e603b2d7db9f067778eaf8a")), common.BytesToAddress(hexutil.MustDecode("0x294fc7e8f22b3bcdcf955dd7ff3ba2ed833f8212")), common.BytesToAddress(hexutil.MustDecode("0x6beaaed781d2d2ab6350f5c4566a2c6eaac407a6")), common.BytesToAddress(hexutil.MustDecode("0x8be76812f765c24641ec63dc2852b378aba2b440")), }, Seal: []byte{}, CommittedSeal: [][]byte{expectedCommittedSeal}, } var expectedErr error h := &types.Header{ Extra: append(vanity, istRawData...), } // normal case err := writeCommittedSeals(h, [][]byte{expectedCommittedSeal}) if err != expectedErr { t.Errorf("error mismatch: have %v, want %v", err, expectedErr) } // verify istanbul extra-data istExtra, err := types.ExtractIstanbulExtra(h) if err != nil { t.Errorf("error mismatch: have %v, want nil", err) } if !reflect.DeepEqual(istExtra, expectedIstExtra) { t.Errorf("extra data mismatch: have %v, want %v", istExtra, expectedIstExtra) } // invalid seal unexpectedCommittedSeal := append(expectedCommittedSeal, make([]byte, 1)...) err = writeCommittedSeals(h, [][]byte{unexpectedCommittedSeal}) if err != istanbulcommon.ErrInvalidCommittedSeals { t.Errorf("error mismatch: have %v, want %v", err, istanbulcommon.ErrInvalidCommittedSeals) } }