code: func ConstructValidAndInvalidPvtData(blocksPvtData []*ledger.BlockPvtData, blockStore *ledgerstorage.Store) (
  	map[uint64][]*ledger.TxPvtData, []*ledger.PvtdataHashMismatch, error,
  ) {
  	// for each block, for each transaction, retrieve the txEnvelope to
  	// compare the hash of pvtRwSet in the block and the hash of the received
  	// txPvtData. On a mismatch, add an entry to hashMismatch list.
  	// On a match, add the pvtData to the validPvtData list
  	validPvtData := make(map[uint64][]*ledger.TxPvtData)
  	var invalidPvtData []*ledger.PvtdataHashMismatch
  
  	for _, blockPvtData := range blocksPvtData {
  		validData, invalidData, err := findValidAndInvalidBlockPvtData(blockPvtData, blockStore)
  		if err != nil {
  			return nil, nil, err
  		}
  		if len(validData) > 0 {
  			validPvtData[blockPvtData.BlockNum] = validData
  		}
  		invalidPvtData = append(invalidPvtData, invalidData...)
  	} // for each block's pvtData
  	return validPvtData, invalidPvtData, nil
  }
docs: // ConstructValidAndInvalidPvtData computes the valid pvt data and hash mismatch list
  // from a received pvt data list of old blocks.