|
@@ -149,7 +149,8 @@ func (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, er
|
|
|
if ptd == nil {
|
|
if ptd == nil {
|
|
|
return NonStatTy, consensus.ErrUnknownAncestor
|
|
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)
|
|
externTd := new(big.Int).Add(header.Difficulty, ptd)
|
|
|
|
|
|
|
|
// Irrelevant of the canonical status, write the td and header to the database
|
|
// 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
|
|
// 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.
|
|
// Second clause in the if statement reduces the vulnerability to selfish mining.
|
|
|
// Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf
|
|
// 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
|
|
// If the header can be added into canonical chain, adjust the
|
|
|
// header chain markers(canonical indexes and head header flag).
|
|
// header chain markers(canonical indexes and head header flag).
|
|
|
//
|
|
//
|