Safrole Errors

exception jam.consensus.safrole.errors.SafroleError(code: Enum, message: str = None, *args: Any)[source]

Bases: JamError

class jam.consensus.safrole.errors.SafroleErrorCode(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]

Bases: Enum

Error codes for the Safrole consensus protocol.

BAD_SLOT = None
UNEXPECTED_TICKET = None
BAD_TICKET_ORDER = None
BAD_TICKET_PROOF = None
BAD_TICKET_ATTEMPT = None
RESERVED = None
DUPLICATE_TICKET = None
decode_from(offset: int = 0) Tuple[Enum, int]

Decode from buffer. Must be implemented by subclasses or added via decorator.

Parameters:
  • buffer – Buffer to decode from

  • offset – Starting position in buffer

Returns:

  • The decoded value

  • Number of bytes read

Return type:

Tuple containing

Error Types

The Safrole consensus protocol defines specific error types for handling various failure cases.

SafroleErrorCode

Enumeration of possible error conditions:

  • BAD_SLOT - Invalid slot number in block header

  • UNEXPECTED_TICKET - Ticket received when not expected

  • BAD_TICKET_ORDER - Tickets not in sorted order by VRF output

  • BAD_TICKET_PROOF - Invalid VRF proof for ticket

  • BAD_TICKET_ATTEMPT - Invalid ticket attempt index

  • RESERVED - Reserved for future use

  • DUPLICATE_TICKET - Duplicate ticket submission

SafroleError

Base error class that wraps error codes with descriptive messages. Used throughout the protocol implementation to signal specific failure conditions.

Example Usage

# Verify ticket order
if not is_ordered(tickets):
    raise SafroleError(
        SafroleErrorCode.BAD_TICKET_ORDER,
        "Tickets must be ordered by VRF output"
    )

# Check for duplicates
if is_duplicate(ticket):
    raise SafroleError(
        SafroleErrorCode.DUPLICATE_TICKET,
        f"Ticket {ticket.id} already exists"
    )

Handle Them

try:
    process_tickets(block)
except SafroleError as e:
    if e.code == SafroleErrorCode.BAD_TICKET_PROOF:
        # Handle invalid VRF proof
        pass
    elif e.code == SafroleErrorCode.BAD_TICKET_ORDER:
        # Handle ordering violation
        pass

API Reference

exception jam.consensus.safrole.errors.SafroleError(code: Enum, message: str = None, *args: Any)[source]

Bases: JamError

class jam.consensus.safrole.errors.SafroleErrorCode(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]

Bases: Enum

Error codes for the Safrole consensus protocol.

BAD_SLOT = None
UNEXPECTED_TICKET = None
BAD_TICKET_ORDER = None
BAD_TICKET_PROOF = None
BAD_TICKET_ATTEMPT = None
RESERVED = None
DUPLICATE_TICKET = None
decode_from(offset: int = 0) Tuple[Enum, int]

Decode from buffer. Must be implemented by subclasses or added via decorator.

Parameters:
  • buffer – Buffer to decode from

  • offset – Starting position in buffer

Returns:

  • The decoded value

  • Number of bytes read

Return type:

Tuple containing