aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2018-11-08 11:17:14 +0800
committerGitHub <noreply@github.com>2018-11-08 11:17:14 +0800
commitb2625a45a5de1df99811437d015cf5a3777ee62e (patch)
tree05560827b5f92012b810a3620bb9cccd60599023
parent33d9311270414d8911122a4c7354773786df7f85 (diff)
downloaddexon-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.tar
dexon-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.tar.gz
dexon-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.tar.bz2
dexon-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.tar.lz
dexon-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.tar.xz
dexon-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.tar.zst
dexon-consensus-b2625a45a5de1df99811437d015cf5a3777ee62e.zip
core: Optimize core (#307)
-rw-r--r--core/agreement-state_test.go6
-rw-r--r--core/agreement_test.go6
-rw-r--r--core/consensus.go44
-rw-r--r--core/lattice.go8
-rw-r--r--core/leader-selector.go20
-rw-r--r--core/leader-selector_test.go8
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
}