OSDN Git Service

Mov merge (#430)
[bytom/vapor.git] / protocol / block.go
index 86c9650..e9b2746 100644 (file)
@@ -110,6 +110,16 @@ func (c *Chain) connectBlock(block *types.Block) (err error) {
                return err
        }
 
+       for _, p := range c.subProtocols {
+               if err := c.syncProtocolStatus(p); err != nil {
+                       return errors.Wrap(err, p.Name(), "sync sub protocol status")
+               }
+
+               if err := p.ApplyBlock(block); err != nil {
+                       return errors.Wrap(err, p.Name(), "sub protocol connect block")
+               }
+       }
+
        irrBlockHeader := c.lastIrrBlockHeader
        if c.isIrreversible(&block.BlockHeader) && block.Height > irrBlockHeader.Height {
                irrBlockHeader = &block.BlockHeader
@@ -138,6 +148,12 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error {
                return err
        }
 
+       for _, p := range c.subProtocols {
+               if err := c.syncProtocolStatus(p); err != nil {
+                       return errors.Wrap(err, p.Name(), "sync sub protocol status")
+               }
+       }
+
        txsToRestore := map[bc.Hash]*types.Tx{}
        for _, detachBlockHeader := range detachBlockHeaders {
                detachHash := detachBlockHeader.Hash()
@@ -164,6 +180,12 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error {
                        return err
                }
 
+               for _, p := range c.subProtocols {
+                       if err := p.DetachBlock(b); err != nil {
+                               return errors.Wrap(err, p.Name(), "sub protocol detach block")
+                       }
+               }
+
                for _, tx := range b.Transactions {
                        txsToRestore[tx.ID] = tx
                }
@@ -199,6 +221,12 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error {
                        return err
                }
 
+               for _, p := range c.subProtocols {
+                       if err := p.ApplyBlock(b); err != nil {
+                               return errors.Wrap(err, p.Name(), "sub protocol attach block")
+                       }
+               }
+
                if consensusResult.IsFinalize() {
                        consensusResults = append(consensusResults, consensusResult.Fork())
                }
@@ -275,6 +303,12 @@ func (c *Chain) saveBlock(block *types.Block) error {
                return errors.Sub(ErrBadBlock, err)
        }
 
+       for _, p := range c.subProtocols {
+               if err := p.ValidateBlock(block, bcBlock.TransactionStatus.GetVerifyStatus()); err != nil {
+                       return errors.Wrap(err, "sub protocol save block")
+               }
+       }
+
        signature, err := c.SignBlock(block)
        if err != nil {
                return errors.Sub(ErrBadBlock, err)