code: func (f *Fetcher) insert(peer string, block *types.Block) {
  	hash := block.Hash()
  
  	// Run the import on a new thread
  	log.Debug("Importing propagated block", "peer", peer, "number", block.Number(), "hash", hash)
  	go func() {
  		defer func() { f.done <- hash }()
  
  		// If the parent's unknown, abort insertion
  		parent := f.getBlock(block.ParentHash())
  		if parent == nil {
  			log.Debug("Unknown parent of propagated block", "peer", peer, "number", block.Number(), "hash", hash, "parent", block.ParentHash())
  			return
  		}
  		// Quickly validate the header and propagate the block if it passes
  		switch err := f.verifyHeader(block.Header()); err {
  		case nil:
  			// All ok, quickly propagate to our peers
  			propBroadcastOutTimer.UpdateSince(block.ReceivedAt)
  			go f.broadcastBlock(block, true)
  
  		case consensus.ErrFutureBlock:
  			// Weird future block, don't fail, but neither propagate
  
  		default:
  			// Something went very wrong, drop the peer
  			log.Debug("Propagated block verification failed", "peer", peer, "number", block.Number(), "hash", hash, "err", err)
  			f.dropPeer(peer)
  			return
  		}
  		// Run the actual import and log any issues
  		if _, err := f.insertChain(types.Blocks{block}); err != nil {
  			log.Debug("Propagated block import failed", "peer", peer, "number", block.Number(), "hash", hash, "err", err)
  			return
  		}
  		// If import succeeded, broadcast the block
  		propAnnounceOutTimer.UpdateSince(block.ReceivedAt)
  		go f.broadcastBlock(block, false)
  
  		// Invoke the testing hook if needed
  		if f.importedHook != nil {
  			f.importedHook(block)
  		}
  	}()
  }
docs: // insert spawns a new goroutine to run a block insertion into the chain. If the
  // block's number is at the same height as the current import phase, it updates
  // the phase states accordingly.