consensus/parlia: fix nextForkHash in Extra filed of block header (#1923)
This commit is contained in:
parent
9f5842e0ec
commit
a6cfcfe2b3
@ -950,7 +950,7 @@ func (p *Parlia) Prepare(chain consensus.ChainHeaderReader, header *types.Header
|
||||
}
|
||||
|
||||
header.Extra = header.Extra[:extraVanity-nextForkHashSize]
|
||||
nextForkHash := forkid.NewID(p.chainConfig, p.genesisHash, number, header.Time).Hash
|
||||
nextForkHash := forkid.NextForkHash(p.chainConfig, p.genesisHash, number, header.Time)
|
||||
header.Extra = append(header.Extra, nextForkHash[:]...)
|
||||
|
||||
if err := p.prepareValidators(header); err != nil {
|
||||
@ -1084,7 +1084,7 @@ func (p *Parlia) Finalize(chain consensus.ChainHeaderReader, header *types.Heade
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
nextForkHash := forkid.NewID(p.chainConfig, p.genesisHash, number, header.Time).Hash
|
||||
nextForkHash := forkid.NextForkHash(p.chainConfig, p.genesisHash, number, header.Time)
|
||||
if !snap.isMajorityFork(hex.EncodeToString(nextForkHash[:])) {
|
||||
log.Debug("there is a possible fork, and your client is not the majority. Please check...", "nextForkHash", hex.EncodeToString(nextForkHash[:]))
|
||||
}
|
||||
|
@ -98,6 +98,32 @@ func NewID(config *params.ChainConfig, genesis common.Hash, head, time uint64) I
|
||||
return ID{Hash: checksumToBytes(hash), Next: 0}
|
||||
}
|
||||
|
||||
// NextForkHash calculates the forkHash from genesis to the next fork block number or time
|
||||
func NextForkHash(config *params.ChainConfig, genesis common.Hash, head uint64, time uint64) [4]byte {
|
||||
// Calculate the starting checksum from the genesis hash
|
||||
hash := crc32.ChecksumIEEE(genesis[:])
|
||||
|
||||
// Calculate the next fork checksum
|
||||
forksByBlock, forksByTime := gatherForks(config)
|
||||
for _, fork := range forksByBlock {
|
||||
if fork > head {
|
||||
// Checksum the previous hash and nextFork number and return
|
||||
return checksumToBytes(checksumUpdate(hash, fork))
|
||||
}
|
||||
// Fork already passed, checksum the previous hash and the fork number
|
||||
hash = checksumUpdate(hash, fork)
|
||||
}
|
||||
for _, fork := range forksByTime {
|
||||
if fork > time {
|
||||
// Checksum the previous hash and nextFork time and return
|
||||
return checksumToBytes(checksumUpdate(hash, fork))
|
||||
}
|
||||
// Fork already passed, checksum the previous hash and the fork time
|
||||
hash = checksumUpdate(hash, fork)
|
||||
}
|
||||
return checksumToBytes(hash)
|
||||
}
|
||||
|
||||
// NewIDWithChain calculates the Ethereum fork ID from an existing chain instance.
|
||||
func NewIDWithChain(chain Blockchain) ID {
|
||||
head := chain.CurrentHeader()
|
||||
|
Loading…
Reference in New Issue
Block a user