diff options
author | Wei-Ning Huang <w@dexon.org> | 2018-10-29 09:31:36 +0800 |
---|---|---|
committer | Wei-Ning Huang <w@byzantine-lab.io> | 2019-06-12 17:27:17 +0800 |
commit | a69fb3e4c59fab52b6e10993c67400084879b1a8 (patch) | |
tree | 8e849faadee1e1c43068a4b0392a02050d271e3e /vendor/github.com/dexon-foundation/dexon-consensus-core/core/lattice-data.go | |
parent | 3f320c9048198d14bc44413861efcbc5665324b1 (diff) | |
download | go-tangerine-a69fb3e4c59fab52b6e10993c67400084879b1a8.tar.gz go-tangerine-a69fb3e4c59fab52b6e10993c67400084879b1a8.tar.zst go-tangerine-a69fb3e4c59fab52b6e10993c67400084879b1a8.zip |
vendor: sync consensus core and fix conflict
Diffstat (limited to 'vendor/github.com/dexon-foundation/dexon-consensus-core/core/lattice-data.go')
-rw-r--r-- | vendor/github.com/dexon-foundation/dexon-consensus-core/core/lattice-data.go | 76 |
1 files changed, 65 insertions, 11 deletions
diff --git a/vendor/github.com/dexon-foundation/dexon-consensus-core/core/lattice-data.go b/vendor/github.com/dexon-foundation/dexon-consensus-core/core/lattice-data.go index b0fe9cfdd..2a3ec299e 100644 --- a/vendor/github.com/dexon-foundation/dexon-consensus-core/core/lattice-data.go +++ b/vendor/github.com/dexon-foundation/dexon-consensus-core/core/lattice-data.go @@ -30,7 +30,6 @@ import ( // Errors for sanity check error. var ( - ErrAckingBlockNotExists = fmt.Errorf("acking block not exists") ErrDuplicatedAckOnOneChain = fmt.Errorf("duplicated ack on one chain") ErrInvalidChainID = fmt.Errorf("invalid chain id") ErrInvalidProposerID = fmt.Errorf("invalid proposer id") @@ -50,6 +49,15 @@ var ( ErrUnexpectedGenesisBlock = fmt.Errorf("unexpected genesis block") ) +// ErrAckingBlockNotExists is for sanity check error. +type ErrAckingBlockNotExists struct { + hash common.Hash +} + +func (e ErrAckingBlockNotExists) Error() string { + return fmt.Sprintf("acking block %s not exists", e.hash) +} + // Errors for method usage var ( ErrRoundNotIncreasing = errors.New("round not increasing") @@ -144,7 +152,7 @@ func (data *latticeData) checkAckingRelations(b *types.Block) error { bAck, err := data.findBlock(hash) if err != nil { if err == blockdb.ErrBlockDoesNotExist { - return ErrAckingBlockNotExists + return &ErrAckingBlockNotExists{hash} } return err } @@ -185,7 +193,7 @@ func (data *latticeData) sanityCheck(b *types.Block) error { chainTip := chain.tip if chainTip == nil { if !b.ParentHash.Equal(common.Hash{}) { - return ErrAckingBlockNotExists + return &ErrAckingBlockNotExists{b.ParentHash} } if !b.IsGenesis() { return ErrNotGenesisBlock @@ -198,7 +206,7 @@ func (data *latticeData) sanityCheck(b *types.Block) error { // Check parent block if parent hash is specified. if !b.ParentHash.Equal(common.Hash{}) { if !b.ParentHash.Equal(chainTip.Hash) { - return ErrAckingBlockNotExists + return &ErrAckingBlockNotExists{b.ParentHash} } if !b.IsAcking(b.ParentHash) { return ErrNotAckParent @@ -268,18 +276,21 @@ func (data *latticeData) addBlock( bAck *types.Block updated bool ) - if err = data.chains[block.Position.ChainID].addBlock(block); err != nil { - return - } + data.chains[block.Position.ChainID].addBlock(block) data.blockByHash[block.Hash] = block // Update lastAckPos. for _, ack := range block.Acks { if bAck, err = data.findBlock(ack); err != nil { + if err == blockdb.ErrBlockDoesNotExist { + err = nil + continue + } return } data.chains[bAck.Position.ChainID].lastAckPos[block.Position.ChainID] = bAck.Position.Clone() } + // Extract blocks that deliverable to total ordering. // A block is deliverable to total ordering iff: // - All its acking blocks are delivered to total ordering. @@ -293,19 +304,37 @@ func (data *latticeData) addBlock( allAckingBlockDelivered := true for _, ack := range tip.Acks { if bAck, err = data.findBlock(ack); err != nil { + if err == blockdb.ErrBlockDoesNotExist { + err = nil + allAckingBlockDelivered = false + break + } return } // Check if this block is outputed or not. idx := data.chains[bAck.Position.ChainID].findBlock( &bAck.Position) - if idx == -1 || - idx < data.chains[bAck.Position.ChainID].nextOutputIndex { + var ok bool + if idx == -1 { + // Either the block is delivered or not added to chain yet. + if out := + data.chains[bAck.Position.ChainID].lastOutputPosition; out != nil { + ok = !out.Older(&bAck.Position) + } else if ackTip := + data.chains[bAck.Position.ChainID].tip; ackTip != nil { + ok = !ackTip.Position.Older(&bAck.Position) + } + } else { + ok = idx < data.chains[bAck.Position.ChainID].nextOutputIndex + } + if ok { continue } // This acked block exists and not delivered yet. allAckingBlockDelivered = false } if allAckingBlockDelivered { + status.lastOutputPosition = &tip.Position status.nextOutputIndex++ deliverable = append(deliverable, tip) updated = true @@ -318,6 +347,30 @@ func (data *latticeData) addBlock( return } +// addFinalizedBlock processes block for syncing internal data. +func (data *latticeData) addFinalizedBlock( + block *types.Block) (err error) { + var bAck *types.Block + chain := data.chains[block.Position.ChainID] + if chain.tip != nil && chain.tip.Position.Height >= + block.Position.Height { + return + } + chain.nextOutputIndex = 0 + chain.blocks = []*types.Block{} + chain.tip = block + chain.lastOutputPosition = nil + // Update lastAckPost. + for _, ack := range block.Acks { + if bAck, err = data.findBlock(ack); err != nil { + return + } + data.chains[bAck.Position.ChainID].lastAckPos[block.Position.ChainID] = + bAck.Position.Clone() + } + return +} + // prepareBlock helps to setup fields of block based on its ChainID and Round, // including: // - Acks @@ -524,6 +577,8 @@ type chainStatus struct { lastAckPos []*types.Position // the index to be output next time. nextOutputIndex int + // the position of output last time. + lastOutputPosition *types.Position } // findBlock finds index of block in current pending blocks on this chain. @@ -551,10 +606,9 @@ func (s *chainStatus) getBlock(idx int) (b *types.Block) { } // addBlock adds a block to pending blocks on this chain. -func (s *chainStatus) addBlock(b *types.Block) error { +func (s *chainStatus) addBlock(b *types.Block) { s.blocks = append(s.blocks, b) s.tip = b - return nil } // TODO(mission): change back to nextHeight. |