X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=protocol%2Fprotocol.go;h=9eac9451764008940b23bffd9bb0566a8b03c45e;hb=ba520ccc18f0295b79d4ea2edb36864fcf3081a4;hp=ff61e18549102659204c803572c68e6b89002d03;hpb=cc968002ceac2dfd7665c2ac2b4c32ab6017b525;p=bytom%2Fvapor.git diff --git a/protocol/protocol.go b/protocol/protocol.go index ff61e185..9eac9451 100644 --- a/protocol/protocol.go +++ b/protocol/protocol.go @@ -6,8 +6,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/vapor/config" - engine "github.com/vapor/consensus/consensus" - "github.com/vapor/errors" + "github.com/vapor/event" "github.com/vapor/protocol/bc" "github.com/vapor/protocol/bc/types" "github.com/vapor/protocol/state" @@ -21,17 +20,16 @@ type Chain struct { orphanManage *OrphanManage txPool *TxPool store Store + bbft *bbft processBlockCh chan *processBlockMsg - cond sync.Cond - bestNode *state.BlockNode - Authoritys map[string]string - position uint64 - engine engine.Engine + cond sync.Cond + bestNode *state.BlockNode + bestIrreversibleNode *state.BlockNode } // NewChain returns a new Chain using store as the underlying storage. -func NewChain(store Store, txPool *TxPool) (*Chain, error) { +func NewChain(store Store, txPool *TxPool, eventDispatcher *event.Dispatcher) (*Chain, error) { c := &Chain{ orphanManage: NewOrphanManage(), txPool: txPool, @@ -55,22 +53,11 @@ func NewChain(store Store, txPool *TxPool) (*Chain, error) { c.bestNode = c.index.GetNode(storeStatus.Hash) c.index.SetMainChain(c.bestNode) + c.bbft = newBbft(store, c.index, c.orphanManage, eventDispatcher) go c.blockProcesser() return c, nil } -func (c *Chain) SetAuthoritys(authoritys map[string]string) { - c.Authoritys = authoritys -} - -func (c *Chain) SetPosition(position uint64) { - c.position = position -} - -func (c *Chain) SetConsensusEngine(engine engine.Engine) { - c.engine = engine -} - func (c *Chain) initChainStatus() error { genesisBlock := config.GenesisBlock() txStatus := bc.NewTransactionStatus() @@ -94,7 +81,7 @@ func (c *Chain) initChainStatus() error { if err != nil { return err } - return c.store.SaveChainStatus(node, utxoView) + return c.store.SaveChainStatus(node, node, utxoView, map[uint64]*state.VoteResult{}) } // BestBlockHeight returns the current height of the blockchain. @@ -122,27 +109,9 @@ func (c *Chain) InMainChain(hash bc.Hash) bool { return c.index.InMainchain(hash) } -// CalcNextSeed return the seed for the given block -func (c *Chain) CalcNextSeed(preBlock *bc.Hash) (*bc.Hash, error) { - node := c.index.GetNode(preBlock) - if node == nil { - return nil, errors.New("can't find preblock in the blockindex") - } - return node.CalcNextSeed(), nil -} - -// CalcNextBits return the seed for the given block -func (c *Chain) CalcNextBits(preBlock *bc.Hash) (uint64, error) { - node := c.index.GetNode(preBlock) - if node == nil { - return 0, errors.New("can't find preblock in the blockindex") - } - return node.CalcNextBits(), nil -} - // This function must be called with mu lock in above level -func (c *Chain) setState(node *state.BlockNode, view *state.UtxoViewpoint) error { - if err := c.store.SaveChainStatus(node, view); err != nil { +func (c *Chain) setState(node *state.BlockNode, irreversibleNode *state.BlockNode, view *state.UtxoViewpoint, voteMap map[uint64]*state.VoteResult) error { + if err := c.store.SaveChainStatus(node, irreversibleNode, view, voteMap); err != nil { return err } @@ -151,8 +120,9 @@ func (c *Chain) setState(node *state.BlockNode, view *state.UtxoViewpoint) error c.index.SetMainChain(node) c.bestNode = node + c.bestIrreversibleNode = irreversibleNode - log.WithFields(log.Fields{"height": c.bestNode.Height, "hash": c.bestNode.Hash.String()}).Debug("chain best status has been update") + log.WithFields(log.Fields{"module": logModule, "height": c.bestNode.Height, "hash": c.bestNode.Hash.String()}).Debug("chain best status has been update") c.cond.Broadcast() return nil } @@ -176,3 +146,8 @@ func (c *Chain) BlockWaiter(height uint64) <-chan struct{} { func (c *Chain) GetTxPool() *TxPool { return c.txPool } + +// GetBBFT return chain bbft +func (c *Chain) GetBBFT() *bbft { + return c.bbft +}