Front-running

Ocorre quando um atacante explora a ordem das transações pendentes no mempool para executar uma transação antes de outra que já está na fila, com o objetivo de obter uma vantagem indevida. Esse tipo de ataque é comum em plataformas DeFi, como exchanges descentralizadas (DEXs), onde o preço de um ativo pode ser impactado por grandes ordens de compra ou venda.

Exemplo:

Imagine que o usuário A tenta comprar uma grande quantidade de um token em uma DEX. A transação do usuário A é enviada para a rede e fica no mempool aguardando confirmação. Um atacante, monitorando o mempool, observa essa transação e percebe que a compra feita pelo usuário A aumentará o preço do token.

O atacante então envia uma transação com uma taxa de gas mais alta para comprar o token antes que a transação do usuário A seja processada. Como os mineradores priorizam transações com taxas mais altas, a transação do atacante será executada primeiro, comprando o token a um preço mais baixo. Quando a transação do usuário A for finalmente executada, o preço do token terá subido, permitindo ao atacante vender o token adquirido por um valor mais alto e obter lucro imediato.

function swapTokens(uint amountIn, address tokenIn, address tokenOut) external {
    // Calculando o preço antes de executar a negociação
    uint priceBefore = getPrice(tokenOut);

    // Executar a troca de tokens
    uint amountOut = executeSwap(amountIn, tokenIn, tokenOut);

    // Cálculo do preço após a troca
    uint priceAfter = getPrice(tokenOut);

    // Potencialmente, um invasor pode observar e executar uma transação antes disso
}

Mitigação:

  1. Uso de esquemas Commit-Reveal: Esse esquema envolve dividir a transação em duas fases: um “commit”, onde é enviado um hash da transação, e um “reveal”, onde a transação completa é revelada. Durante a fase de commit, o atacante não tem acesso às informações completas da transação e, portanto, não pode realizar um ataque de front-running.

    solidityCopiar código
    mapping(address => bytes32) public commitments;
    
    function commitSwap(bytes32 _commitment) external {
        commitments[msg.sender] = _commitment;
    }
    
    function revealSwap(uint amountIn, address tokenIn, address tokenOut, uint nonce) external {
        require(commitments[msg.sender] == keccak256(abi.encodePacked(amountIn, tokenIn, tokenOut, nonce)), "Invalid reveal");
        // Executar o swap
    }
  2. Limite de Gas e Priorização de Transações: Contratos inteligentes podem definir limites de gas ou incluir regras que priorizam transações com base em fatores diferentes da taxa de gas, tornando mais difícil para um atacante simplesmente pagar mais para se adiantar na fila.

  3. Tolerância ao Slippage: Em exchanges descentralizadas (DEXs), os usuários podem definir uma “tolerância ao slippage”, que determina a variação máxima de preço aceitável para a transação. Se o preço do ativo se mover além desse limite devido a um possível ataque de front-running, a transação será revertida automaticamente.

    function swapTokens(uint amountIn, address tokenIn, address tokenOut, uint minAmountOut) external {
        uint amountOut = executeSwap(amountIn, tokenIn, tokenOut);
        require(amountOut >= minAmountOut, "Slippage too high");
    }
  4. Mecanismos de Bloqueio Temporal: A introdução de atrasos controlados ou janelas de tempo durante as quais uma transação não pode ser confirmada imediatamente pode reduzir a capacidade de atacantes executarem transações em uma ordem vantajosa.

  5. Ordenação Aleatória de Transações: Em vez de processar as transações na ordem em que chegam ao mempool, elas podem ser ordenadas de forma aleatória ou utilizar sorteios (loterias) para determinar a ordem de execução, dificultando ataques de front-running.

  6. Flashbots e Proteção contra MEV: Ferramentas como o Flashbots permitem que os usuários enviem transações diretamente aos validadores, sem passarem pela mempool pública, impedindo que fiquem visíveis para atacantes que tentam realizar front-running. Essa técnica ajuda a mitigar o risco de Maximal Extractable Value (MEV), que é o lucro que atacantes podem obter ao explorar a ordem de execução das transações.

Last updated