Secuenciación

Cómo Adrift aprovecha la arquitectura modular de secuenciador de Syndicate para juegos en cadena

Adrift es un ejemplo en producción y en vivo de cómo la arquitectura modular de secuenciador de Syndicate permite nuevos tipos de aplicaciones en cadena. Así es cómo funciona a nivel de contrato:

Arquitectura modular de secuenciador

El secuenciador de Syndicate no es un servicio monolítico—es un conjunto de contratos inteligentes (módulos) que pueden ser compuestos y extendidos. Los principales tipos de módulos son:

  • Módulos de permisos: Quién puede secuenciar transacciones (por ejemplo, lista de permitidos, poseedores de tokens, ganadores de subastas)
  • Módulos de ordenamiento: Cómo se ordenan y agrupan las transacciones (por ejemplo, FIFO, lógica personalizada)
  • Módulos personalizados: Cualquier lógica adicional, como inyección de aleatoriedad, protección MEV o reglas específicas del juego

Adrift utiliza un módulo personalizado llamado AdriftBundler para implementar secuenciación específica del juego y aleatoriedad.

El contrato AdriftBundler

El contrato AdriftBundler es un ejemplo concreto de un módulo de secuenciación personalizado. Esto es lo que hace:

  • Gestión de mempool: Cuando un jugador envía un check-in, el bundler decodifica la transacción (usando RLPTxBreakdown) y, si es una llamada checkIn(), la añade a un mempool interno.
  • Acceso basado en roles: Solo las direcciones con el rol SEQUENCER_ROLE pueden procesar transacciones, y solo aquellas con RANDOMNESS_ROLE pueden inyectar nueva aleatoriedad.
  • Coordinación de aleatoriedad: Cuando se inyecta nueva aleatoriedad (vía addRandomness), el bundler:
    1. Envía la transacción de aleatoriedad a la cadena de secuenciación subyacente.
    2. Procesa todos los check-ins pendientes en el mempool en un solo lote, asegurando que todos los resultados se determinen usando la aleatoriedad más reciente.
  • Procesamiento en masa: El bundler puede procesar transacciones en masa, permitiendo rondas de juego eficientes o acciones por lotes.

Lógica clave del contrato:

function addRandomness(bytes calldata randomnessTx) external onlyRole(RANDOMNESS_ROLE) {
    sequencingAddress.processTransactionUncompressed(randomnessTx);

    if (mempool.length != 0) {
        sequencingAddress.processTransactionsBulk(mempool);
        delete mempool;
        emit MempoolCleared();
    }
}

Esto asegura que todos los registros se resuelvan después de establecer la nueva aleatoriedad, haciendo que los resultados sean a prueba de manipulaciones y justos.

Decodificación y filtrado de transacciones

El empaquetador utiliza RLPTxBreakdown y RLPReader para decodificar transacciones EIP-1559 en bruto. Verifica el selector de función para identificar llamadas checkIn(), y solo estas se añaden al mempool para el procesamiento por lotes.

Ejemplo:

function _processTransactionUncompressed(bytes memory txn) internal {
    RLPTxBreakdown.DecodedTransaction memory decodedTx = RLPTxBreakdown.decodeTx(txn);
    if (decodedTx.data.length > 0 && !decodedTx.isContractDeployment) {
        // 0x183ff085 = checkIn()
        if (getFunctionSelector(decodedTx.data) == hex"183ff085") {
            playerContractCheckinNonces[decodedTx.to][decodedTx.from]++;
            mempool.push(txn);
            emit MempoolUpdated(mempool.length, txn);
            return;
        }
    }
    sequencingAddress.processTransactionUncompressed(txn);
}

Beneficios de los módulos del secuenciador de Syndicate para Adrift

  • Programabilidad: Adrift puede definir exactamente cómo y cuándo se inyecta la aleatoriedad, y cómo se agrupan y procesan las transacciones.
  • Equidad: Todos los registros en una ronda se resuelven utilizando la misma aleatoriedad, y los resultados se bloquean tan pronto como se procesa el lote: sin reorganizaciones, sin manipulaciones.
  • Extensibilidad: El agrupador es solo un módulo. Los desarrolladores pueden agregar permisos, subastas u otra lógica personalizada componiendo módulos adicionales (ver módulos de secuenciación principales).
  • Transparencia: Toda la lógica de secuenciación está en la cadena y es auditable, no está oculta en infraestructura fuera de la cadena.
  • Resistencia al abuso: Los flujos de registro pueden usar nonces por jugador para hacer que la manipulación sea detectable. El contrato de resultados incrementa un nonce en cada registro y lo mezcla con la aleatoriedad, y un agrupador puede mantener sus propios contadores de registro por jugador para verificar reversiones intencionales (protegiendo contra exploits al estilo “Meebits”).

Cómo los desarrolladores pueden aprovechar este patrón

  • Escribir tus propios módulos: Comienza desde el AdriftBundler o los módulos base de Syndicate y añade tu propia lógica de procesamiento por lotes, permisos o aleatoriedad.
  • Componer módulos: Usa módulos de permisos, ordenamiento y personalizados juntos para crear flujos de secuenciación únicos para tu appchain.
  • Auditar y extender: Toda la lógica es de código abierto y está en la cadena, por lo que puedes verificar, bifurcar o extender según sea necesario.

Ver también:

Al aprovechar la arquitectura modular de secuenciador de Syndicate, Adrift demuestra cómo los juegos onchain (y cualquier appchain) pueden lograr equidad, extensibilidad y transparencia que es imposible con los secuenciadores tradicionales fuera de la cadena.