aboutsummaryrefslogtreecommitdiffstats
path: root/core/leader-selector.go
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2018-11-13 09:43:28 +0800
committerGitHub <noreply@github.com>2018-11-13 09:43:28 +0800
commit206cdb5b68d3226eb4a771b374093a51999b3b17 (patch)
tree88c4f8af7e15e23010676d9988fa3442167d3c17 /core/leader-selector.go
parentf2e1d268fff6815240d70f77e9b4fad6f96bd008 (diff)
downloaddexon-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.go24
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
}