code: def extract_consensus_op(self, opcode, op_data, processed_op_data, current_block_number):
          
          ret = {}
  
          consensus_fields = op_get_consensus_fields(opcode)
          quirk_fields = op_get_quirk_fields(opcode)
          for field in consensus_fields + quirk_fields:
  
              try:
                  # assert field in processed_op_data or field in op_data, 'Missing consensus field "{}"'.format(field)
                  assert field in processed_op_data, 'Missing consensus field "{}"'.format(field)
              except Exception as e:
                  # should NEVER happen
                  log.exception(e)
                  log.error("FATAL: BUG: missing consensus field {}".format(field))
                  log.error("op_data:\n{}".format(json.dumps(op_data, indent=4, sort_keys=True)))
                  log.error("processed_op_data:\n{}".format(json.dumps(op_data, indent=4, sort_keys=True)))
                  os.abort()
              
              ret[field] = processed_op_data[field]
  
          return ret
docs: Using the operation data extracted from parsing the virtualchain operation (@op_data),
          and the checked, processed operation (@processed_op_data), return a dict that contains
          (1) all of the consensus fields to snapshot this operation, and
          (2) all of the data fields that we need to store for the name record (i.e. quirk fields)