@ -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).
//