core: mirror full node reorg logic in light client too (#20931)
* core: fix the condition of reorg * core: fix nitpick to only retrieve head once * core: don't reorg if received chain is longer at same diff Co-authored-by: Péter Szilágyi <peterke@gmail.com>
This commit is contained in:
parent
b9df7ecdc3
commit
2ec7232191
@ -149,7 +149,8 @@ func (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, er
|
||||
if ptd == nil {
|
||||
return NonStatTy, consensus.ErrUnknownAncestor
|
||||
}
|
||||
localTd := hc.GetTd(hc.currentHeaderHash, hc.CurrentHeader().Number.Uint64())
|
||||
head := hc.CurrentHeader().Number.Uint64()
|
||||
localTd := hc.GetTd(hc.currentHeaderHash, head)
|
||||
externTd := new(big.Int).Add(header.Difficulty, ptd)
|
||||
|
||||
// Irrelevant of the canonical status, write the td and header to the database
|
||||
@ -165,7 +166,15 @@ func (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, er
|
||||
// If the total difficulty is higher than our known, add it to the canonical chain
|
||||
// Second clause in the if statement reduces the vulnerability to selfish mining.
|
||||
// Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf
|
||||
if externTd.Cmp(localTd) > 0 || (externTd.Cmp(localTd) == 0 && mrand.Float64() < 0.5) {
|
||||
reorg := externTd.Cmp(localTd) > 0
|
||||
if !reorg && externTd.Cmp(localTd) == 0 {
|
||||
if header.Number.Uint64() < head {
|
||||
reorg = true
|
||||
} else if header.Number.Uint64() == head {
|
||||
reorg = mrand.Float64() < 0.5
|
||||
}
|
||||
}
|
||||
if reorg {
|
||||
// If the header can be added into canonical chain, adjust the
|
||||
// header chain markers(canonical indexes and head header flag).
|
||||
//
|
||||
|
Loading…
Reference in New Issue
Block a user