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 llamadacheckIn(), la añade a un mempool interno. - Acceso basado en roles: Solo las direcciones con el rol
SEQUENCER_ROLEpueden procesar transacciones, y solo aquellas conRANDOMNESS_ROLEpueden inyectar nueva aleatoriedad. - Coordinación de aleatoriedad: Cuando se inyecta nueva aleatoriedad (vía
addRandomness), el bundler:- Envía la transacción de aleatoriedad a la cadena de secuenciación subyacente.
- 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.