Contratos

Descripción general a nivel de protocolo de los contratos inteligentes de Adrift

Descripción general del protocolo

El protocolo está compuesto por un conjunto de contratos principales (que implementan la lógica del juego, la aleatoriedad y los resultados) y contratos auxiliares (fábricas, módulos de secuenciación, utilidades) que juntos permiten una experiencia totalmente en cadena y programable.

Arquitectura

  • Contratos principales: Imponen las reglas fundamentales y garantías de seguridad del juego (registro, check-in, resultado, aleatoriedad)
  • Contratos auxiliares: Fábricas, módulos de secuenciación y utilidades que interactúan con el núcleo, permitiendo extensibilidad y actualizaciones
  • Interfaces: Definen los límites del contrato, permitiendo actualizaciones modulares e implementaciones personalizadas

Contratos principales

Adrift (Lógica del juego)

El contrato principal que implementa el registro, check-in, descalificación y lógica del ganador. Todo el gameplay está en cadena y es transparente.

Responsabilidades clave:

  • Registro de jugadores y check-in
  • Aplicación de intervalos de check-in y descalificación
  • Integración con módulos de resultado y aleatoriedad
  • Emisión de eventos para todas las acciones principales

Interfaz:

interface IAdrift {
    function register(address player) external;
    function checkIn() external;
    function disqualifyInactivePlayer(address player) external;
    function endGame(address player) external;
    function isPlayerActive(address player) external view returns (bool);
    function setGameStartTime(uint256 startTime) external;
    // ...other admin and view functions
}

CheckInOutcomes (Lógica de resultados)

Determina el resultado de cada check-in (mejora, penalización, descalificación) utilizando aleatoriedad en cadena. Configurable por un administrador.

Responsabilidades clave:

  • Consume aleatoriedad de un contrato dedicado
  • Calcula el resultado para cada check-in de jugador
  • Rango de resultados y probabilidad de descalificación configurables

Interfaz:

interface ICheckInOutcomes {
    function DISQUALIFIED_OUTCOME() external view returns (int256);
    function OUTCOME_RANGE() external view returns (uint256);
    function getOutcome(address player) external returns (int256);
}

Random (Fuente de aleatoriedad)

En esta aplicación de ejemplo, la aleatoriedad se obtiene a través de Lit Protocol. El contrato Random almacena y proporciona aleatoriedad para la lógica de resultados. Solo el administrador puede actualizar el valor de aleatoriedad, que luego es consumido por los contratos de resultados.

Responsabilidades clave:

  • Almacena el último valor de aleatoriedad
  • Restringe las actualizaciones a roles de administrador/autorizados

Interfaz:

interface IRandom {
    function random() external view returns (uint256);
}

Contratos auxiliares

AdriftFactory (Fábrica de juegos)

Despliega nuevas instancias del juego Adrift, permitiendo actualizaciones y juegos paralelos. Emite eventos para un fácil seguimiento.

Responsabilidades clave:

  • Despliega nuevos contratos Adrift
  • Emite eventos de creación

Interfaz:

interface IAdriftFactory {
    function create(address gameAdmin, address checkInOutcomes) external returns (address);
}

CheckInOutcomesFactory (Fábrica de Lógica de Resultados)

Despliega nuevos contratos de lógica de resultados, opcionalmente con nuevas fuentes de aleatoriedad. Admite actualizaciones y experimentación.

Responsabilidades clave:

  • Despliega contratos CheckInOutcomes y Random
  • Emite eventos de creación

Interfaz:

interface ICheckInOutcomesFactory {
    function create(address outcomesAdmin, address randomness) external returns (address);
    function createWithRandom(address outcomesAdmin, address randomAdmin) external returns (address, address);
}

AdriftBundler (Módulo de Secuenciación/Agrupación)

Gestiona la agrupación y secuenciación de transacciones para la appchain. Se integra con la cadena de secuenciación de Syndicate y puede extenderse para lógica personalizada.

Responsabilidades clave:

  • Gestiona un mempool de transacciones
  • Procesa transacciones de check-in en lotes
  • Se integra con la cadena de secuenciación

Interfaz:

interface IAdriftBundler {
    function addRandomness(bytes calldata randomnessTx) external;
    function processTransactionsBulk(bytes[] calldata txns) external;
    function processTransactionUncompressed(bytes calldata txn) external;
    function getMempoolLength() external view returns (uint256);
}

Utilidades y Contratos de Soporte

  • Decompressor (Stylus, específico de Arbitrum): Un contrato Arbitrum Stylus que descomprime datos de llamada en la cadena de forma económica. Esto permite ejecutar el nodo en modo comprimido mientras realiza la descompresión en la cadena, reduciendo costos. Los bytes descomprimidos se introducen luego en la lógica de decodificación.
  • RLPTxBreakdown / RLPReader (Solidity): Bibliotecas para decodificar transacciones Ethereum desde datos de llamada descomprimidos, que admiten lógica de secuenciación personalizada.

Decisiones de Diseño

  • Patrón de fábrica: Permite la capacidad de actualización y despliegues paralelos, similar a la fábrica singleton y pares de Uniswap
  • Interfaces modulares: Toda la lógica principal (juego, resultado, aleatoriedad) está abstraída detrás de interfaces para facilitar las actualizaciones
  • Aplicación en cadena: Todo el gameplay, la aleatoriedad y los resultados se aplican y son auditables en la cadena
  • Eventos para transparencia: Todas las acciones principales emiten eventos para facilitar la indexación y la integración frontend
  • Arbitrum Stylus para descompresión: Utiliza un contrato Stylus para descomprimir datos de llamada en la cadena, permitiendo el modo de nodo comprimido y minimizando la huella L1 antes de la decodificación Solidity a través de RLPReader.

Siguiendo estos patrones, puedes construir appchains potentes, transparentes y actualizables que aprovechen todas las capacidades de la arquitectura modular de Syndicate.