code: func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, uncleLists [][]*types.Header) (int, error) {
  	q.lock.Lock()
  	defer q.lock.Unlock()
  
  	reconstruct := func(header *types.Header, index int, result *fetchResult) error {
  		if types.DeriveSha(types.Transactions(txLists[index])) != header.TxHash || types.CalcUncleHash(uncleLists[index]) != header.UncleHash {
  			return errInvalidBody
  		}
  		result.Transactions = txLists[index]
  		result.Uncles = uncleLists[index]
  		return nil
  	}
  	return q.deliver(id, q.blockTaskPool, q.blockTaskQueue, q.blockPendPool, q.blockDonePool, bodyReqTimer, len(txLists), reconstruct)
  }
docs: // DeliverBodies injects a block body retrieval response into the results queue.
  // The method returns the number of blocks bodies accepted from the delivery and
  // also wakes any threads waiting for data delivery.