fix error when find penalties in 4 epoch ago

This commit is contained in:
Nguyen Ba Tam 2018-10-10 14:55:08 +07:00
parent 63b869dba2
commit 2bf1906342
2 changed files with 17 additions and 23 deletions

View file

@ -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) log.Debug("Penalty Info", "signers", penSigners, "number", number)
for _, penSigner := range penSigners { for _, penSigner := range penSigners {
// Convert number to byte. header.Penalties = append(header.Penalties, penSigner[:]...)
penByte := common.LeftPadBytes([]byte(fmt.Sprintf("%d", penSigner)), common.AddressLength)
penBytes = append(penBytes, penByte...)
}
if len(penBytes) > 0 {
header.Penalties = penBytes
} }
} }
} }
// Prevent penaltied signer in 4 epocs ago jump into signer list. // Prevent penaltied signer in 4 epocs ago jump into signer list.
var preventSigners []common.Address
for i := 1; i <= 4; i++ { for i := 1; i <= 4; i++ {
checkEpoc := uint64(i) * c.config.Epoch checkEpoc := uint64(i) * c.config.Epoch
if number > checkEpoc { if number > checkEpoc {
@ -676,26 +668,17 @@ func (c *Posv) Prepare(chain consensus.ChainReader, header *types.Header) error
prevEpocBlock := chain.GetBlock(prevHeader.Hash(), prevEpoc) prevEpocBlock := chain.GetBlock(prevHeader.Hash(), prevEpoc)
penalties := prevEpocBlock.Penalties() penalties := prevEpocBlock.Penalties()
if penalties != nil { if penalties != nil {
prevSigners := make([]common.Address, len(penalties)/common.AddressLength) prevSigners := ExtractPenaltiesFromBytes(penalties)
if len(prevSigners) > 0 { if len(prevSigners) > 0 {
for _, signer := range prevSigners { for i, signer := range signers {
for _, prevSigner := range prevSigners { for _, preventSigner := range prevSigners {
if signer == prevSigner { if signer == preventSigner {
preventSigners = append(preventSigners, signer) 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 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
}

View file

@ -271,6 +271,8 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
} }
} }
} }
} else {
break
} }
} }
} }