From 2bf1906342ab9f6d4fd2ee2cd684cb4b9d727c1f Mon Sep 17 00:00:00 2001 From: Nguyen Ba Tam Date: Wed, 10 Oct 2018 14:55:08 +0700 Subject: [PATCH] fix error when find penalties in 4 epoch ago --- consensus/posv/posv.go | 38 +++++++++++++++----------------------- eth/backend.go | 2 ++ 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/consensus/posv/posv.go b/consensus/posv/posv.go index f87fd536cd..f9176ccd4a 100644 --- a/consensus/posv/posv.go +++ b/consensus/posv/posv.go @@ -652,22 +652,14 @@ func (c *Posv) Prepare(chain consensus.ChainReader, header *types.Header) error } } } - - var penBytes []byte log.Debug("Penalty Info", "signers", penSigners, "number", number) for _, penSigner := range penSigners { - // Convert number to byte. - penByte := common.LeftPadBytes([]byte(fmt.Sprintf("%d", penSigner)), common.AddressLength) - penBytes = append(penBytes, penByte...) - } - if len(penBytes) > 0 { - header.Penalties = penBytes + header.Penalties = append(header.Penalties, penSigner[:]...) } } } // Prevent penaltied signer in 4 epocs ago jump into signer list. - var preventSigners []common.Address for i := 1; i <= 4; i++ { checkEpoc := uint64(i) * c.config.Epoch if number > checkEpoc { @@ -676,26 +668,17 @@ func (c *Posv) Prepare(chain consensus.ChainReader, header *types.Header) error prevEpocBlock := chain.GetBlock(prevHeader.Hash(), prevEpoc) penalties := prevEpocBlock.Penalties() if penalties != nil { - prevSigners := make([]common.Address, len(penalties)/common.AddressLength) + prevSigners := ExtractPenaltiesFromBytes(penalties) if len(prevSigners) > 0 { - for _, signer := range prevSigners { - for _, prevSigner := range prevSigners { - if signer == prevSigner { - preventSigners = append(preventSigners, signer) + for i, signer := range signers { + for _, preventSigner := range prevSigners { + if signer == preventSigner { + signers = append(signers[:i], signers[i+1:]...) } } } } } - if len(preventSigners) > 0 { - for i, signer := range signers { - for _, preventSigner := range preventSigners { - if signer == preventSigner { - signers = append(signers[:i], signers[i+1:]...) - } - } - } - } } } @@ -912,3 +895,12 @@ func (c *Posv) GetMasternodesFromCheckpointHeader(preCheckpointHeader *types.Hea } return masternodes } + +// Extract validators from byte array. +func ExtractPenaltiesFromBytes(bytePenalties []byte) []common.Address { + penalties := make([]common.Address, len(bytePenalties)/common.AddressLength) + for i := 0; i < len(penalties); i++ { + copy(penalties[i][:], bytePenalties[i*common.AddressLength:]) + } + return penalties +} diff --git a/eth/backend.go b/eth/backend.go index 793e602b4e..e70b8329c1 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -271,6 +271,8 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { } } } + } else { + break } } }