From eb9742ae2716ec38440678c51db4c825c51d2b0c Mon Sep 17 00:00:00 2001 From: parmarrushabh Date: Wed, 7 Nov 2018 11:15:32 +0530 Subject: [PATCH] verify penalty info in header check point --- common/constants.go | 1 + common/types.go | 35 +++++++++++++++++++++++++++++++++++ common/types_test.go | 9 +++++++++ eth/backend.go | 15 ++++++++++----- eth/protocol_test.go | 6 +++--- 5 files changed, 58 insertions(+), 8 deletions(-) diff --git a/common/constants.go b/common/constants.go index 0b7375b966..c2078873c2 100644 --- a/common/constants.go +++ b/common/constants.go @@ -11,4 +11,5 @@ const ( EpocBlockOpening = 850 EpocBlockRandomize = 900 MaxMasternodes = 150 + LimitPenaltyEpoch = 4 ) \ No newline at end of file diff --git a/common/types.go b/common/types.go index 22d7613fae..1d65192cf7 100644 --- a/common/types.go +++ b/common/types.go @@ -243,3 +243,38 @@ func (a *UnprefixedAddress) UnmarshalText(input []byte) error { func (a UnprefixedAddress) MarshalText() ([]byte, error) { return []byte(hex.EncodeToString(a[:])), nil } + +// Extract validators from byte array. +func RemoveItemFromArray(array []Address, items []Address) []Address { + if items == nil || len(items) == 0 { + return array + } + for i, value := range array { + for _, item := range items { + if value == item { + array = append(array[:i], array[i+1:]...) + } + } + } + return array +} + +// Extract validators from byte array. +func ExtractAddressToBytes(penalties []Address) []byte { + data := []byte{} + for _, signer := range penalties { + data = append(data, signer[:]...) + } + return data +} + +func ExtractAddressFromBytes(bytePenalties []byte) []Address { + if bytePenalties != nil && len(bytePenalties) < AddressLength { + return []Address{} + } + penalties := make([]Address, len(bytePenalties)/AddressLength) + for i := 0; i < len(penalties); i++ { + copy(penalties[i][:], bytePenalties[i*AddressLength:]) + } + return penalties +} \ No newline at end of file diff --git a/common/types_test.go b/common/types_test.go index db636812ce..0a38fc8961 100644 --- a/common/types_test.go +++ b/common/types_test.go @@ -149,3 +149,12 @@ func BenchmarkAddressHex(b *testing.B) { testAddr.Hex() } } + +func TestRemoveItemInArray(t *testing.T) { + array := []Address{HexToAddress("0x0000000"), HexToAddress("0x0000001"), HexToAddress("0x0000002")} + remove := []Address{HexToAddress("0x0000000"), HexToAddress("0x0000004"), HexToAddress("0x0000003")} + array = RemoveItemFromArray(array, remove) + if len(array) != 2 { + t.Error("fail remove item from array addres ") + } +} \ No newline at end of file diff --git a/eth/backend.go b/eth/backend.go index eece2edc3a..bfe6957c9d 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -238,6 +238,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { } if len(m2) > 0 { header.Validators = contracts.BuildValidatorFromM2(m2) + log.Debug("New set Validators", "m2", m2, "number", header.Number.Uint64()) } } } @@ -247,10 +248,10 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { c.HookPenalty = func(chain consensus.ChainReader, blockNumberEpoc uint64) ([]common.Address, error) { client, err := eth.blockchain.GetClient() if err != nil { - log.Error("Fail to connect IPC client for blockSigner", "error", err) + return nil, err } prevEpoc := blockNumberEpoc - chain.Config().XDPoS.Epoch - if prevEpoc > 0 { + if prevEpoc >= 0 { prevHeader := chain.GetHeaderByNumber(prevEpoc) penSigners := c.GetMasternodes(chain, prevHeader) if len(penSigners) > 0 { @@ -259,7 +260,10 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { for i := prevEpoc; i <= blockNumberEpoc; i++ { blockHeader := chain.GetHeaderByNumber(i) if len(penSigners) > 0 { - signedMasternodes, _ := contracts.GetSignersFromContract(blockSignerAddr, client, blockHeader.Hash()) + signedMasternodes, err := contracts.GetSignersFromContract(blockSignerAddr, client, blockHeader.Hash()) + if err != nil { + return nil, err + } if len(signedMasternodes) > 0 { // Check signer signed? for _, signed := range signedMasternodes { @@ -271,8 +275,9 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { } } } - } else { - break + } else { + break + } } } return penSigners, nil diff --git a/eth/protocol_test.go b/eth/protocol_test.go index b2f93d8dd1..e39da606e6 100644 --- a/eth/protocol_test.go +++ b/eth/protocol_test.go @@ -64,7 +64,7 @@ func testStatusMsgErrors(t *testing.T, protocol int) { }, { code: StatusMsg, data: statusData{uint32(protocol), 999, td, head.Hash(), genesis.Hash()}, - wantError: errResp(ErrNetworkIdMismatch, "999 (!= 1)"), + wantError: errResp(ErrNetworkIdMismatch, "999 (!= 89)"), }, { code: StatusMsg, data: statusData{uint32(protocol), DefaultConfig.NetworkId, td, head.Hash(), common.Hash{3}}, @@ -85,7 +85,7 @@ func testStatusMsgErrors(t *testing.T, protocol int) { } else if err.Error() != test.wantError.Error() { t.Errorf("test %d: wrong error: got %q, want %q", i, err, test.wantError) } - case <-time.After(2 * time.Second): + case <-time.After(5 * time.Second): t.Errorf("protocol did not shut down within 2 seconds") } p.close() @@ -220,4 +220,4 @@ func TestGetBlockHeadersDataEncodeDecode(t *testing.T) { } } } -} +} \ No newline at end of file