mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 10:22:23 +00:00
fix error when find penalties in 4 epoch ago
This commit is contained in:
parent
63b869dba2
commit
2bf1906342
2 changed files with 17 additions and 23 deletions
|
|
@ -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,20 +668,10 @@ 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(preventSigners) > 0 {
|
||||
for i, signer := range signers {
|
||||
for _, preventSigner := range preventSigners {
|
||||
for _, preventSigner := range prevSigners {
|
||||
if signer == preventSigner {
|
||||
signers = append(signers[:i], signers[i+1:]...)
|
||||
}
|
||||
|
|
@ -698,6 +680,7 @@ func (c *Posv) Prepare(chain consensus.ChainReader, header *types.Header) error
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, signer := range signers {
|
||||
header.Extra = append(header.Extra, signer[:]...)
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -271,6 +271,8 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
|
|||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue