-func (fs *fastSync) process() error {
- if err := fs.findFastSyncRange(); err != nil {
- return err
- }
-
- stopHash := fs.stopHeader.Hash()
- for fs.chain.BestBlockHeight() < fs.stopHeader.Height {
- blocks, err := fs.msgFetcher.requireBlocks(fs.syncPeer.ID(), fs.blockLocator(), &stopHash)
- if err != nil {
- fs.peers.ErrorHandler(fs.syncPeer.ID(), security.LevelConnException, err)
- return err
- }
-
- if err := fs.verifyBlocks(blocks); err != nil {
- fs.peers.ErrorHandler(fs.syncPeer.ID(), security.LevelMsgIllegal, err)
- return err
- }
- }
-
- log.WithFields(log.Fields{"module": logModule, "height": fs.chain.BestBlockHeight()}).Info("fast sync success")
- return nil
-}
-
-func (fs *fastSync) findFastSyncRange() error {
- bestHeight := fs.chain.BestBlockHeight()
- fs.length = fs.syncPeer.IrreversibleHeight() - fastSyncPivotGap - bestHeight
- if fs.length > maxFastSyncBlocksNum {
- fs.length = maxFastSyncBlocksNum
+// createFetchBlocksTasks get the skeleton and assign tasks according to the skeleton.
+func (fs *fastSync) createFetchBlocksTasks(stopBlock *types.Block) ([]*fetchBlocksWork, error) {
+ // Find peers that meet the height requirements.
+ peers := fs.peers.GetPeersByHeight(stopBlock.Height + fastSyncPivotGap)
+ if len(peers) == 0 {
+ return nil, errNoSyncPeer