diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-11-13 23:07:05 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2017-11-13 23:07:05 +0800 |
commit | 54ce3887d84a56894904baaa90e44c2972a0107f (patch) | |
tree | b0aad28e747a1504458d7fb4279bef4ba51d4b3a /core | |
parent | b81a9cd829576622ac4fb8f2131e33b7460710b0 (diff) | |
download | dexon-54ce3887d84a56894904baaa90e44c2972a0107f.tar.gz dexon-54ce3887d84a56894904baaa90e44c2972a0107f.tar.zst dexon-54ce3887d84a56894904baaa90e44c2972a0107f.zip |
core: split same-td blocks on block height
Diffstat (limited to 'core')
-rw-r--r-- | core/blockchain.go | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/core/blockchain.go b/core/blockchain.go index 57a881f38..325753c7a 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -818,7 +818,12 @@ func (bc *BlockChain) WriteBlockAndState(block *types.Block, receipts []*types.R // 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 { + // Split same-difficulty blocks by number, then at random + reorg = block.NumberU64() < bc.currentBlock.NumberU64() || (block.NumberU64() == bc.currentBlock.NumberU64() && mrand.Float64() < 0.5) + } + if reorg { // Reorganise the chain if the parent is not the head block if block.ParentHash() != bc.currentBlock.Hash() { if err := bc.reorg(bc.currentBlock, block); err != nil { |