@Override
  public List<Block> processResponse(final MessageData messageData)
      throws InvalidPeerTaskResponseException {
    // Blocks returned by this method are in the same order as the headers, but might not be
    // complete
    if (messageData == null) {
      throw new InvalidPeerTaskResponseException();
    }
    final BlockBodiesMessage blocksMessage = BlockBodiesMessage.readFrom(messageData);
    final List<BlockBody> blockBodies = blocksMessage.bodies(protocolSchedule);
    if (blockBodies.isEmpty() || blockBodies.size() > blockHeaders.size()) {
      throw new InvalidPeerTaskResponseException();
    }

    for (int i = 0; i < blockBodies.size(); i++) {
      final BlockBody blockBody = blockBodies.get(i);
      final BlockHeader blockHeader = blockHeaders.get(i);
      if (!blockBodyMatchesBlockHeader(blockBody, blockHeader)) {
        LOG.atDebug().setMessage("Received block body does not match block header").log();
        throw new InvalidPeerTaskResponseException();
      }

      blocks.add(new Block(blockHeader, blockBody));
    }
    return blocks;
  }
Implements PeerTask for getting block bodies from peers, and matches headers to bodies to supply
full blocks
ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/peertask/task/GetBodiesFromPeerTask.java