diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2018-11-08 11:17:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-08 11:17:14 +0800 |
commit | b2625a45a5de1df99811437d015cf5a3777ee62e (patch) | |
tree | 05560827b5f92012b810a3620bb9cccd60599023 | |
parent | 33d9311270414d8911122a4c7354773786df7f85 (diff) | |
download | tangerine-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.tar.gz tangerine-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.tar.zst tangerine-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.zip |
core: Optimize core (#307)
-rw-r--r-- | core/agreement-state_test.go | 6 | ||||
-rw-r--r-- | core/agreement_test.go | 6 | ||||
-rw-r--r-- | core/consensus.go | 44 | ||||
-rw-r--r-- | core/lattice.go | 8 | ||||
-rw-r--r-- | core/leader-selector.go | 20 | ||||
-rw-r--r-- | core/leader-selector_test.go | 8 |
6 files changed, 60 insertions, 32 deletions
diff --git a/core/agreement-state_test.go b/core/agreement-state_test.go index 7bb12be..af1f1dd 100644 --- a/core/agreement-state_test.go +++ b/core/agreement-state_test.go @@ -97,9 +97,9 @@ func (s *AgreementStateTestSuite) SetupTest() { } func (s *AgreementStateTestSuite) newAgreement(numNode int) *agreement { - leader := newLeaderSelector(func(*types.Block) bool { - return true - }) + leader := newLeaderSelector(func(*types.Block) (bool, error) { + return true, nil + }, &common.NullLogger{}) notarySet := make(map[types.NodeID]struct{}) for i := 0; i < numNode-1; i++ { prvKey, err := ecdsa.NewPrivateKey() diff --git a/core/agreement_test.go b/core/agreement_test.go index 127e9e7..be66c96 100644 --- a/core/agreement_test.go +++ b/core/agreement_test.go @@ -93,9 +93,9 @@ func (s *AgreementTestSuite) SetupTest() { } func (s *AgreementTestSuite) newAgreement(numNotarySet int) *agreement { - leader := newLeaderSelector(func(*types.Block) bool { - return true - }) + leader := newLeaderSelector(func(*types.Block) (bool, error) { + return true, nil + }, &common.NullLogger{}) agreementIdx := len(s.agreement) notarySet := make(map[types.NodeID]struct{}) for i := 0; i < numNotarySet-1; i++ { diff --git a/core/consensus.go b/core/consensus.go index 6ff67bb..ddf6359 100644 --- a/core/consensus.go +++ b/core/consensus.go @@ -370,11 +370,25 @@ func NewConsensus( roundToNotify: roundToNotify, } - validLeader := func(block *types.Block) bool { + validLeader := func(block *types.Block) (bool, error) { if block.Timestamp.After(time.Now()) { - return false + return false, nil } - return lattice.SanityCheck(block) == nil + if err := lattice.SanityCheck(block); err != nil { + if err == ErrRetrySanityCheckLater { + return false, nil + } + return false, err + } + logger.Debug("Calling Application.VerifyBlock", "block", block) + switch app.VerifyBlock(block) { + case types.VerifyInvalidBlock: + return false, ErrInvalidBlock + case types.VerifyRetryLater: + return false, nil + default: + } + return true, nil } con.baModules = make([]*agreement, config.NumChains) @@ -389,7 +403,7 @@ func NewConsensus( agreementModule := newAgreement( con.ID, recv, - newLeaderSelector(validLeader), + newLeaderSelector(validLeader, logger), con.authModule, ) // Hacky way to make agreement module self contained. @@ -442,7 +456,14 @@ func (con *Consensus) Run(initBlock *types.Block) { for i := uint32(0); i < con.currentConfig.NumChains; i++ { tick := make(chan struct{}) ticks = append(ticks, tick) - go con.runBA(i, tick) + // TODO(jimmy-dexon): this is a temporary solution to offset BA time. + // The complelete solution should be delivered along with config change. + offset := time.Duration(i*uint32(4)/con.currentConfig.NumChains) * + con.currentConfig.LambdaBA + go func(chainID uint32, offset time.Duration) { + time.Sleep(offset) + con.runBA(chainID, tick) + }(i, offset) } // Reset ticker. @@ -717,6 +738,14 @@ MessageLoop: continue MessageLoop } } + // TODO(mission): check with full node if this verification is required. + con.logger.Debug("Calling Application.VerifyBlock", "block", val) + switch con.app.VerifyBlock(val) { + case types.VerifyInvalidBlock: + con.logger.Error("VerifyBlock fail") + continue MessageLoop + default: + } func() { con.lock.Lock() defer con.lock.Unlock() @@ -957,11 +986,6 @@ func (con *Consensus) ProcessBlockRandomnessResult( // preProcessBlock performs Byzantine Agreement on the block. func (con *Consensus) preProcessBlock(b *types.Block) (err error) { - if err = con.lattice.SanityCheck(b); err != nil { - if err != ErrRetrySanityCheckLater { - return - } - } if err = con.baModules[b.Position.ChainID].processBlock(b); err != nil { return err } diff --git a/core/lattice.go b/core/lattice.go index 11412be..6c69d52 100644 --- a/core/lattice.go +++ b/core/lattice.go @@ -153,14 +153,6 @@ func (l *Lattice) SanityCheck(b *types.Block) (err error) { }(); err != nil { return } - // Verify data in application layer. - l.logger.Debug("Calling Application.VerifyBlock", "block", b) - switch l.app.VerifyBlock(b) { - case types.VerifyInvalidBlock: - err = ErrInvalidBlock - case types.VerifyRetryLater: - err = ErrRetrySanityCheckLater - } return } diff --git a/core/leader-selector.go b/core/leader-selector.go index 08006db..247ce89 100644 --- a/core/leader-selector.go +++ b/core/leader-selector.go @@ -32,7 +32,7 @@ var ( ErrIncorrectCRSSignature = fmt.Errorf("incorrect CRS signature") ) -type validLeaderFn func(*types.Block) bool +type validLeaderFn func(*types.Block) (bool, error) // Some constant value. var ( @@ -57,12 +57,15 @@ type leaderSelector struct { pendingBlocks []*types.Block validLeader validLeaderFn lock sync.Mutex + logger common.Logger } -func newLeaderSelector(validLeader validLeaderFn) *leaderSelector { +func newLeaderSelector( + validLeader validLeaderFn, logger common.Logger) *leaderSelector { return &leaderSelector{ minCRSBlock: maxHash, validLeader: validLeader, + logger: logger, } } @@ -98,7 +101,12 @@ func (l *leaderSelector) leaderBlockHash() common.Hash { defer l.lock.Unlock() newPendingBlocks := []*types.Block{} for _, b := range l.pendingBlocks { - if l.validLeader(b) { + ok, err := l.validLeader(b) + if err != nil { + l.logger.Error("Error checking validLeader", "error", err, "block", b) + continue + } + if ok { l.updateLeader(b) } else { newPendingBlocks = append(newPendingBlocks, b) @@ -118,7 +126,11 @@ func (l *leaderSelector) processBlock(block *types.Block) error { } l.lock.Lock() defer l.lock.Unlock() - if !l.validLeader(block) { + ok, err = l.validLeader(block) + if err != nil { + return err + } + if !ok { l.pendingBlocks = append(l.pendingBlocks, block) return nil } diff --git a/core/leader-selector_test.go b/core/leader-selector_test.go index 975fd13..f2c88f1 100644 --- a/core/leader-selector_test.go +++ b/core/leader-selector_test.go @@ -37,16 +37,16 @@ type LeaderSelectorTestSuite struct { func (s *LeaderSelectorTestSuite) SetupTest() { s.mockValidLeaderDefault = true s.mockValidLeaderDB = make(map[common.Hash]bool) - s.mockValidLeader = func(b *types.Block) bool { + s.mockValidLeader = func(b *types.Block) (bool, error) { if ret, exist := s.mockValidLeaderDB[b.Hash]; exist { - return ret + return ret, nil } - return s.mockValidLeaderDefault + return s.mockValidLeaderDefault, nil } } func (s *LeaderSelectorTestSuite) newLeader() *leaderSelector { - l := newLeaderSelector(s.mockValidLeader) + l := newLeaderSelector(s.mockValidLeader, &common.NullLogger{}) l.restart(common.NewRandomHash()) return l } |