Seja você um desenvolvedor ou um usuário no domínio da Web3, é provável que o conceito de 'front-running' tenha cruzado o seu caminho ou talvez até mesmo afetado suas experiências. Neste artigo, compartilharei insights valiosos para protegê-lo contra os front-runners.
O que é o Front-running?
Ofront-running é um pouco como alguém espionando seus planos e tentando agir mais rápido do que você. Imagine que você está na fila de uma loja esperando para comprar um brinquedo de edição limitada que está prestes a entrar à venda. A pessoa à sua frente ouve você falando sobre querer aquele brinquedo e corre rapidamente para comprá-lo antes que você tenha a chance. Eles estão tentando pegá-lo antes de você, mesmo você estando lá primeiro.
No mundo do dinheiro online e das criptomoedas, o front-running é uma ideia semelhante. Digamos que você queira comprar algumas moedas digitais a um determinado preço. Antes que sua compra seja efetuada, alguém com ferramentas mais avançadas ou computadores mais rápidos percebe seu plano. Eles rapidamente compram essas moedas a um preço mais baixo e, em seguida, imediatamente as vendem para você a um preço ligeiramente mais alto. Eles lucram se antecipando à sua transação.
O front-running pode acontecer em várias situações online em que há um atraso entre o momento em que você decide fazer algo e o momento em que isso é efetivamente realizado. É como alguém se esgueirando na sua frente na fila para se aproveitar de seus planos e obter lucro para si.
Em Termos Mais Técnicos…
O front-running envolve a exploração do processo de execução de ordens aproveitando a sequência previsível de transações processadas em um bloco. Eis como funciona:
Visibilidade da Transação: quando uma transação é transmitida para a rede, ela se torna visível para todos os participantes. Isso inclui os mineradores, responsáveis por confirmar as transações e adicioná-las à blockchain.
Leilão de Preço de Gás: os usuários anexam um preço de gás às suas transações como incentivo para os mineradores priorizarem suas transações. Transações com preços de gás mais altos têm mais chances de serem incluídas no próximo bloco.
**Ataque de Front-running: um front-runner observa as transações pendentes e identifica oportunidades lucrativas. Por exemplo, se alguém coloca uma grande ordem para comprar um token específico a um determinado preço, o front-runner rapidamente envia uma transação para comprar o mesmo token a um preço ligeiramente mais alto antes que a transação original seja confirmada.
Lucro de Arbitragem: a transação do front-runner é minerada antes da transação original devido ao preço de gás mais alto. Uma vez que a transação do front-runner seja confirmada, eles podem imediatamente vender os tokens adquiridos para o usuário original a um preço ligeiramente mais alto, obtendo lucro no processo.
Preocupações com Privacidade e Segurança: o front-running não apenas leva a perdas financeiras para o usuário que está sendo front-run, mas também levanta preocupações com a privacidade, já que o atacante obtém insights sobre as intenções e transações dos usuários.
O front-running pode ser facilitado por meio de bots e scripts automatizados que monitoram continuamente o pool de transações em busca de oportunidades lucrativas. Essa prática se aproveita da natureza aberta e transparente das transações em blockchain, bem como do atraso inerente na confirmação de transações.
Para visualizar as transações no mempool, você pode acessar: https://txstreet.com/
Alternativamente, você pode usar o script fornecido abaixo para rastrear transações pendentes associadas a um contrato específico.
require("dotenv").config();
var Web3 = require('web3');
var fs = require('fs')
var options = {
timeout: 60000, // Tempo limite para a conexão
clientConfig: {
// keepalive: true, // Manter a conexão viva
// keepaliveInterval: 6000, // Intervalo de manutenção da conexão
maxReceivedFrameSize: 100000000, // Tamanho máximo do quadro recebido
maxReceivedMessageSize: 100000000, // Tamanho máximo da mensagem recebida
},
reconnect: {
auto: true, // Reconectar automaticamente em caso de desconexão
delay: 5000, // Atraso antes de tentar reconectar (em milissegundos)
maxAttempts: 15, // Número máximo de tentativas de reconexão
onTimeout: false, // Não reconectar após tempo limite
},
};
// Você pode usar qualquer provedor WebSocket, como Infura, Alchemy, etc.
// Deve ser parecido com: 'wss://mainnet.infura.io/ws/v3/<API_KEY>'
var web3 = new Web3(new Web3.providers.WebsocketProvider(process.env.WEBSOCKET_PROVIDER, options));
// Obter transações pendentes da rede Ethereum (mempool)
const getPendingTransactions = web3.eth.subscribe("pendingTransactions", (err, res) => {
if (err) console.error(err);
})
var main = function() {
getPendingTransactions.on("data", (txHash) => {
setTimeout(async () => {
try {
let tx = await web3.eth.getTransaction(txHash);
if (tx != null)
// Obter transação de um endereço específico e gravá-la em um //arquivo
if (tx.to == 0xdAC17F958D2ee523a2206206994597C13D831ec7)
var writeTxFromTether = async function(data) {
fs.appendFile("./Transactions.txt", JSON.stringify(data) + '\n', (err) => {
if (err) console.log(err);
console.log("Atualizado com sucesso");
})
}
console.log({tx});
} catch (err) {
console.error(err);
}
})
})
}
main()
/// Obter detalhes da transação a partir do recibo da transação
async function getReceipt(hash) {
var receipt = web3.eth.getTransactionReceipt(hash)
console.log({rec:await receipt});
}
// getReceipt("0xdb4dd756220ad7677e2238d6cec303d19e93de1671cdd1828a94458a5235b1a6")
// .then(() => process.exit(0))
// .catch((error) => {
// console.error(error);
// process.exit(1)
// })
Estratégias para Prevenir o Front-running
Agora, existem maneiras de impedir esse tipo de perda. Podemos tomar medidas para garantir que outros não possam se aproveitar de nossas transações e nos prejudicar.
Consciência sobre o Preço de Gás
Os front-runners ficam felizes em ver transações lentas, porque isso lhes dá mais tempo para criar uma ordem para acompanhar sua negociação e obter lucros. Pagar pouco pelo gás faz com que suas transações esperem mais tempo na fila, dando aos front-runners mais tempo para formular sua estratégia e prejudicar seus interesses.
Pagar mais pelo gás motiva os mineradores a validar sua transação mais rapidamente, reduzindo suas chances de se tornar alvo de um ator malicioso. Para isso, você pode definir o preço do gás como sendo mais alto que a média ou simplesmente usar a opção de gás rápido em sua carteira.
Usar Pools de Liquidez Grandes
Os front-runners preferem pools de liquidez reduzida, já que há menos probabilidade de competição e de que uma grande ordem que altera inesperadamente o equilíbrio do pool cause interrupções em suas transações. Realizar suas negociações em pools de liquidez grande reduz a probabilidade de ser afetado pelo front-running.
Manter a Derrapagem Máxima Baixa
Você pode definir a tolerância de derrapagem máxima( máxima variação do retorno esperado) na maioria das exchanges descentralizadas. Um exemplo ajudará a entender melhor a situação.
Suponha que você coloque uma ordem em uma DEX e espere um retorno de 500 Tether por ela. Se você definir a tolerância de derrapagem como 1% de sua ordem, então você não receberá menos do que 495 USDT. No entanto, se a tolerância de derrapagem for maior, haverá mais desvio.
Portanto, tente manter a derrapagem máxima baixa, em torno de 0,5%-2%, para se proteger contra os front-runners. Se você estiver prestes a fazer uma grande ordem, mantenha a derrapagem mínima. Os front-runners querem que você mantenha a derrapagem alta, então é melhor fazer exatamente o oposto.
Usar Soluções de Camada 2:
Soluções de escalabilidade de camada 2, como Optimistic Rollups e zk-Rollups, podem reduzir significativamente o risco de front-running, oferecendo transações mais rápidas e mais baratas.
Com essas side chains, a ordem ocorre fora da cadeia principal, enquanto a liquidação ocorre na cadeia principal. Com essas duas etapas ocorrendo em plataformas diferentes, isso não apenas aumenta a capacidade de processamento, mas também desencoraja mineradores ou usuários comuns a obter as informações necessárias para explorar a vulnerabilidade do front-running.
Design Inteligente de Contratos Inteligentes:
Desenvolvedores podem empregar várias técnicas no design de contratos inteligentes para mitigar o impacto do front-running. Isso inclui o uso de esquemas de commit-reveal, leilões secretos e outros mecanismos que tornam mais difícil para os front-runners preverem os resultados.
Ao se manter informado, empregar táticas inteligentes e usar as ferramentas disponíveis, você pode reduzir o risco de se tornar vítima do front-running e ajudar a manter a integridade das plataformas descentralizadas.
Usar Flashbots ou Ferramentas de Proteção contra MEV:
Flashbots é uma plataforma que visa minimizar o impacto do front-running, oferecendo uma maneira segura para os usuários enviarem transações diretamente para os mineradores. A integração de ferramentas de proteção contra MEV (Miner Extractable Value, ou ‘Valor Extraível por Minerador’, em português) também pode ajudar a evitar atividades exploratórias.
Usar Agregadores
Quando você está realizando uma grande transação, como uma troca, deve sempre usar Agregadores, pois eles dividem uma grande transação em várias transações pequenas. Isso ajuda a prevenir o front-running (já que os usuários maliciosos têm menos interesse em transações pequenas) e também proporciona o máximo retorno de uma troca.
Conclusão
Os ataques de front-running representam uma ameaça significativa para a segurança e a justiça dos contratos inteligentes em Solidity. Ao compreender a natureza desses ataques e implementar medidas preventivas apropriadas, os desenvolvedores podem mitigar os riscos e melhorar a integridade das aplicações descentralizadas.
Estratégias como Consciência sobre a Taxa de Gás, uso de pools de liquidez grandes, manter a derrapagem máxima baixa, uso de camada 2, design de contratos inteligentes e uso do Flashboat; além disso, auditorias regulares e adesão às melhores práticas de segurança são cruciais para garantir a robustez dos contratos inteligentes em Solidity.
Este artigo foi escrito por Kartikjain e traduzido por Adriano P. de Araujo. O original em inglês pode ser encontrado aqui.
Top comments (0)