mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-19 18:32: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)
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -271,6 +271,8 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue