diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2018-11-13 09:43:28 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-13 09:43:28 +0800 |
commit | 206cdb5b68d3226eb4a771b374093a51999b3b17 (patch) | |
tree | 88c4f8af7e15e23010676d9988fa3442167d3c17 /core/leader-selector.go | |
parent | f2e1d268fff6815240d70f77e9b4fad6f96bd008 (diff) | |
download | dexon-consensus-206cdb5b68d3226eb4a771b374093a51999b3b17.tar dexon-consensus-206cdb5b68d3226eb4a771b374093a51999b3b17.tar.gz dexon-consensus-206cdb5b68d3226eb4a771b374093a51999b3b17.tar.bz2 dexon-consensus-206cdb5b68d3226eb4a771b374093a51999b3b17.tar.lz dexon-consensus-206cdb5b68d3226eb4a771b374093a51999b3b17.tar.xz dexon-consensus-206cdb5b68d3226eb4a771b374093a51999b3b17.tar.zst dexon-consensus-206cdb5b68d3226eb4a771b374093a51999b3b17.zip |
core: Reduce call to Application.VerifyBlock (#317)
Diffstat (limited to 'core/leader-selector.go')
-rw-r--r-- | core/leader-selector.go | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/core/leader-selector.go b/core/leader-selector.go index 247ce89..a68f8ab 100644 --- a/core/leader-selector.go +++ b/core/leader-selector.go @@ -101,13 +101,17 @@ func (l *leaderSelector) leaderBlockHash() common.Hash { defer l.lock.Unlock() newPendingBlocks := []*types.Block{} for _, b := range l.pendingBlocks { + ok, dist := l.potentialLeader(b) + if !ok { + continue + } ok, err := l.validLeader(b) if err != nil { l.logger.Error("Error checking validLeader", "error", err, "block", b) continue } if ok { - l.updateLeader(b) + l.updateLeader(b, dist) } else { newPendingBlocks = append(newPendingBlocks, b) } @@ -126,6 +130,10 @@ func (l *leaderSelector) processBlock(block *types.Block) error { } l.lock.Lock() defer l.lock.Unlock() + ok, dist := l.potentialLeader(block) + if !ok { + return nil + } ok, err = l.validLeader(block) if err != nil { return err @@ -134,14 +142,20 @@ func (l *leaderSelector) processBlock(block *types.Block) error { l.pendingBlocks = append(l.pendingBlocks, block) return nil } - l.updateLeader(block) + l.updateLeader(block, dist) return nil } -func (l *leaderSelector) updateLeader(block *types.Block) { + +func (l *leaderSelector) potentialLeader(block *types.Block) (bool, *big.Int) { dist := l.distance(block.CRSSignature) cmp := l.minCRSBlock.Cmp(dist) if cmp > 0 || (cmp == 0 && block.Hash.Less(l.minBlockHash)) { - l.minCRSBlock = dist - l.minBlockHash = block.Hash + return true, dist } + return false, dist +} + +func (l *leaderSelector) updateLeader(block *types.Block, dist *big.Int) { + l.minCRSBlock = dist + l.minBlockHash = block.Hash } |