OSDN Git Service

feat(net/netsync/p2p/pow): Change network lib and remove pow (#1864)
[bytom/bytom.git] / netsync / chainmgr / block_process.go
diff --git a/netsync/chainmgr/block_process.go b/netsync/chainmgr/block_process.go
new file mode 100644 (file)
index 0000000..ee80ded
--- /dev/null
@@ -0,0 +1,69 @@
+package chainmgr
+
+import (
+       "sync"
+
+       log "github.com/sirupsen/logrus"
+
+       "github.com/bytom/bytom/errors"
+       "github.com/bytom/bytom/netsync/peers"
+       "github.com/bytom/bytom/p2p/security"
+       "github.com/bytom/bytom/protocol"
+)
+
+var errOrphanBlock = errors.New("fast sync inserting orphan block")
+
+type blockProcessor struct {
+       chain   Chain
+       storage *storage
+       peers   *peers.PeerSet
+}
+
+func newBlockProcessor(chain Chain, storage *storage, peers *peers.PeerSet) *blockProcessor {
+       return &blockProcessor{
+               chain:   chain,
+               peers:   peers,
+               storage: storage,
+       }
+}
+
+func (bp *blockProcessor) insert(blockStorage *blockStorage) error {
+       isOrphan, err := bp.chain.ProcessBlock(blockStorage.block)
+       if isOrphan {
+               bp.peers.ProcessIllegal(blockStorage.peerID, security.LevelMsgIllegal, errOrphanBlock.Error())
+               return errOrphanBlock
+       }
+
+       if err != nil && errors.Root(err) != protocol.ErrDoubleSignBlock {
+               bp.peers.ProcessIllegal(blockStorage.peerID, security.LevelMsgIllegal, err.Error())
+       }
+       return err
+}
+
+func (bp *blockProcessor) process(downloadNotifyCh chan struct{}, ProcessStop chan struct{}, syncHeight uint64, wg *sync.WaitGroup) {
+       defer func() {
+               close(ProcessStop)
+               wg.Done()
+       }()
+
+       for {
+               for {
+                       block, err := bp.storage.readBlock(syncHeight)
+                       if err != nil {
+                               break
+                       }
+
+                       if err := bp.insert(block); err != nil {
+                               log.WithFields(log.Fields{"module": logModule, "err": err}).Error("failed on process block")
+                               return
+                       }
+
+                       bp.storage.deleteBlock(syncHeight)
+                       syncHeight++
+               }
+
+               if _, ok := <-downloadNotifyCh; !ok {
+                       return
+               }
+       }
+}