Módulos de secuenciación

Contratos inteligentes modulares para personalizar el orden de transacciones, permisos, subastas y coordinación entre cadenas

Syndicate transforma la secuenciación de blockchain llevándola a la cadena mediante contratos inteligentes desplegados en una blockchain separada. Este enfoque modular permite un control, transparencia y propiedad comunitaria sin precedentes del proceso de ordenamiento de transacciones.

Los módulos de secuenciación de Syndicate están compuestos por varios componentes clave que pueden configurarse independientemente para satisfacer las necesidades específicas de tu aplicación.

Módulos de permisos

Los módulos de permisos controlan quién puede secuenciar transacciones en tu appchain. Implementan una interfaz simple con una función isAllowed que devuelve si una dirección puede secuenciar:

function isAllowed(address proposer) external view returns (bool);

Módulos disponibles

  • Lista de permitidos: Lista simple de secuenciadores permitidos controlada por el administrador
  • Saldo de tokens: Requiere que los secuenciadores mantengan una cantidad mínima de tokens
  • Subasta de oferta sellada: Licitación competitiva por derechos de secuenciación

Ejemplo: Módulo de saldo de tokens

Aquí hay un ejemplo simple que requiere que los secuenciadores posean tokens:

contract TokenBalanceSequencingModule is PermissionModule {
    address public immutable tokenAddress;
    uint256 public immutable minimumBalance;

    function isAllowed(address proposer) external view override returns (bool) {
        return IERC20(tokenAddress).balanceOf(proposer) >= minimumBalance;
    }
}

Módulos de ordenamiento

El ordenamiento de transacciones actualmente es manejado por el contrato base SyndicateSequencingChain, que procesa las transacciones en el orden en que se envían. Esto proporciona un mecanismo de ordenamiento de transacciones simple y predecible.

Características disponibles

  • Procesamiento de transacciones individuales: Procesa transacciones individuales mediante processTransaction
  • Procesamiento de transacciones en lote: Procesa múltiples transacciones a la vez con processBulkTransactions
  • Soporte para transacciones en bruto: Maneja transacciones comprimidas con processTransactionRaw

Ejemplo: Procesamiento de transacciones

contract SyndicateSequencingChain is SequencingModuleChecker {
    event TransactionProcessed(address indexed sender, bytes data);

    function processTransaction(bytes calldata data) external onlyWhenAllowed(msg.sender) {
        emit TransactionProcessed(msg.sender, prependZeroByte(data));
    }

    function processBulkTransactions(bytes[] calldata data) external onlyWhenAllowed(msg.sender) {
        for (uint256 i = 0; i < data.length; i++) {
            emit TransactionProcessed(msg.sender, prependZeroByte(data[i]));
        }
    }
}

Módulos de subasta

Los módulos de subasta permiten derechos de secuenciación competitivos a través de subastas de sobre cerrado, donde los postores envían ofertas cifradas para garantizar la equidad.

Módulos disponibles

  • Subasta de sobre cerrado: Una subasta de dos fases donde los postores primero envían ofertas cifradas y luego las revelan

Ejemplo: Subasta de sobre cerrado

contract SealedBidAuctionSequencingModule is PermissionModule {
    // Track bids and auction state
    mapping(address => bytes32) public sealedBids;
    address public highestBidder;
    uint256 public highestBid;

    // Phase 1: Submit sealed bids
    function bid(bytes32 sealedBid) external payable {
        require(msg.value > 0, "Must send deposit");
        sealedBids[msg.sender] = sealedBid;
    }

    // Phase 2: Reveal bids
    function revealBid(uint256 bidAmount, string memory salt) external {
        bytes32 computedHash = keccak256(abi.encodePacked(bidAmount, salt));
        require(computedHash == sealedBids[msg.sender], "Invalid bid reveal");

        if (bidAmount > highestBid) {
            highestBid = bidAmount;
            highestBidder = msg.sender;
        }
    }

    // Only highest bidder can sequence
    function isAllowed(address proposer) external view override returns (bool) {
        return proposer == highestBidder;
    }
}

Módulos atómicos

Los módulos atómicos permiten el procesamiento coordinado de transacciones a través de múltiples cadenas, asegurando que todas las transacciones se procesen juntas o ninguna en absoluto.

Módulos disponibles

  • Secuenciador atómico: Procesa transacciones a través de múltiples cadenas de forma atómica

Ejemplo: Secuenciador atómico

contract AtomicSequencer {
    // Process transactions on multiple chains atomically
    function processTransactionsAtomically(
        SyndicateSequencingChain[] chains,
        bytes[] transactions
    ) external {
        // Ensure input arrays match
        require(chains.length == transactions.length, "Length mismatch");

        // Process each transaction on its respective chain
        for (uint256 i = 0; i < chains.length; i++) {
            chains[i].processTransaction(transactions[i]);
        }
    }

    // Process multiple transactions per chain atomically
    function processBulkTransactionsAtomically(
        SyndicateSequencingChain[] chains,
        bytes[][] transactions
    ) external {
        require(chains.length == transactions.length, "Length mismatch");

        for (uint256 i = 0; i < chains.length; i++) {
            chains[i].processBulkTransactions(transactions[i]);
        }
    }
}

El secuenciador atómico garantiza que o bien todas las transacciones se procesan con éxito en todas las cadenas especificadas, o bien ninguna se procesa. Esto es útil para operaciones entre cadenas que necesitan mantener la consistencia.