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)

def extract_consensus_op(self, opcode, op_data, processed_op_data, current_block_number):
        """
        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)
        """
        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