Análisis de smart contracts
28.03.2024

Contratos inteligentes con función AntiWhale

Continuamos la serie de artículos dedicados a la descripción de esquemas fraudulentos en los contratos inteligentes. Hoy nos ocuparemos de los contratos inteligentes con el mecanismo AntiWhale de limitación del tamaño de las transferencias.

En este artículo, veremos en detalle qué es el mecanismo AntiWhale, en qué se diferencia del mecanismo Cooldown, y cuándo se utilizan juntos y cuándo por separado.

Mecanismo Cooldown

Asignación:

El mecanismo de Cooldown está diseñado para imponer límites de tiempo entre transacciones consecutivas desde la misma dirección. Su finalidad es regular la frecuencia de las transacciones y evitar una actividad excesiva de compra o venta en intervalos cortos de tiempo.

Realización:

Límites de tiempo: Los mecanismos de Cooldown establecen periodos de espera entre transacciones, a menudo basados en el tiempo transcurrido desde la última transacción desde una dirección concreta. Los usuarios deben esperar a que expire el periodo de espera antes de iniciar una nueva transacción.

Indicadores:

Comparación de marcas de tiempo: Busca segmentos de código que comparen marcas de tiempo de bloques o utilicen funciones relacionadas con el tiempo. Las variables de estado de tipo lastTransactionTimestamp pueden utilizarse para rastrear la hora de la última transacción.

Mecanismo AntiWhale

Asignación:

El objetivo principal del mecanismo AntiWhale es reducir el impacto de las grandes transacciones procedentes de una única dirección o de un pequeño grupo de direcciones, a menudo denominadas "ballenas". Pretende evitar la concentración excesiva de tokens en las mismas manos y combatir la posible manipulación o desestabilización del mercado.

Realización:

Límites del tamaño de las transacciones: Los mecanismos AntiWhale suelen establecer límites al tamaño o valor de las transacciones individuales. Las transacciones que superen un umbral establecido darán lugar a la imposición de restricciones, como la negativa a ejecutar la transacción, comisiones elevadas u otros mecanismos de redistribución.

Indicadores:

Busca segmentos de código que comprueben el tamaño o el valor de las transacciones, y esas variables de estado (como maxTransactionAmount o whaleThreshold), pueden indicar la presencia del mecanismo AntiWhale. AntiWhale afecta principalmente a los usuarios con grandes volúmenes de transacciones y se centra en abordar la concentración de tokens en grandes poseedores.

Las principales diferencias entre Cooldown y AntiWhale:

Parámetros AntiWhale Cooldown
Parámetros:Influencia AntiWhale:Afecta principalmente a los usuarios con grandes volúmenes de transacciones. Cooldown:Se aplica a todos los usuarios, independientemente del tamaño de la transacción.
Parámetros:Dinámica del mercado AntiWhale:Centrado en resolver problemas de concentración. Cooldown:Destinado a regular la frecuencia de las transacciones.
Parámetros:Objetivos del proyecto AntiWhale:El objetivo es distribuir fichas y garantizar la estabilidad del mercado. Cooldown:Su objetivo principal es garantizar la estabilidad del mercado e impedir la negociación rápida.

Escenarios de uso:

  1. Minimizar la manipulación del mercado:
    Ambos mecanismos pueden utilizarse conjuntamente para abordar diversos problemas de manipulación del mercado. El mecanismo AntiWhale ayuda a limitar el tamaño de las transacciones grandes, mientras que el mecanismo Cooldown impide que se produzcan rápidamente varias transacciones en un breve periodo de tiempo.

    Supongamos que una entidad posee una parte significativa del suministro total de fichas. Sin el mecanismo AntiWhale, esta entidad podría realizar grandes transacciones que podrían causar fluctuaciones significativas en el precio, lo que conduciría a la manipulación del mercado. Al limitar el tamaño máximo o la frecuencia de las transacciones en una misma dirección dentro de un determinado periodo de tiempo, el mecanismo AntiWhale pretende evitar que los grandes poseedores tengan una influencia indebida en el mercado.

  2. Garantizar una distribución equitativa:
    En el contexto de nuevos tokens o ventas de tokens, impedir que un pequeño número de participantes adquiera una parte desproporcionada de la oferta total. Establecer límites a la cantidad máxima que una dirección individual puede comprar durante una venta de fichas o durante un periodo determinado permite una distribución más uniforme de las fichas entre un mayor número de participantes.

  3. Eliminar los problemas de liquidez:
    Los grandes volúmenes de transacciones de los grandes tenedores pueden afectar a la liquidez y perturbar el proceso natural de descubrimiento de precios en las bolsas descentralizadas. Al limitar la velocidad de las transacciones de los grandes tenedores, el mecanismo AntiWhale ayuda a mantener una situación de liquidez más estable.

  4. Estabilización de precios:
    Impedir las transacciones rápidas y a gran escala puede ayudar a estabilizar los precios. Al aplicar las restricciones AntiWhale, el precio del token tiene más tiempo para adaptarse a las condiciones del mercado entre una transacción y otra.

  5. Prevención del Front-running:
    AntiWhale puede implementarse para combatir el front-running, en el que los operadores utilizan información sensible al tiempo para ejecutar operaciones antes que los demás. El mecanismo AntiWhale puede reducir la ventaja obtenida al ejecutar operaciones rápidamente.

  6. Mitigación de los ataques Flash-loan y de reentrada:
    AntiWhale puede añadir una capa adicional de defensa contra algunos ataques flash-loan y de reentrada limitando la velocidad de ejecución de las transacciones.

escenarios de uso

Riesgos potenciales para los poseedores de fichas:

  1. Establecer límites de AntiWhale demasiado estrictos puede ser un problema para los usuarios que sí necesitan realizar transacciones grandes.

  2. Confiar demasiado en el mecanismo AntiWhale puede fomentar inadvertidamente la centralización si se aplica sin tener en cuenta el ecosistema más amplio.

¿Cómo puedes determinar de forma independiente si tales amenazas están presentes en los contratos inteligentes?

Determinar si un contrato inteligente tiene un mecanismo de restricción AntiWhale es una tarea importante, aquí tienes algunos consejos que te ayudarán:

  1. Examina la documentación del contrato: empieza por revisar la documentación y las especificaciones del contrato.

  2. Analiza las funciones de transferencia: examina las funciones responsables de las transferencias de fichas (transferir, transferirDesde, etc.). Busca operadores condicionales que impongan restricciones a las transacciones.

  3. Comprueba las comparaciones de marcas de tiempo: busca casos en los que se comparen marcas de tiempo de bloque en el contrato.

  4. Comprueba las variables de estado: examina las variables de estado que pueden utilizarse para almacenar información relacionada con AntiWhale.

  5. Busca funciones o modificadores relacionados con el cálculo del tiempo, como bloque.marcatiempo, bloque.número o ahora.

  6. Busca parámetros que controlen el comportamiento de AntiWhale: pueden ser maxTransferAmount, maxTxLimit y similares. Estos parámetros suelen ser establecidos por el propietario del contrato o a través de mecanismos de gestión de transacciones individuales.

  7. Examina los registros de eventos: comprueba los registros de eventos en busca de sucesos especiales. Las implementaciones podrán registrar información relevante cuando se ejecute una transacción, proporcionando información sobre el proceso de enfriamiento.

  8. Analiza la lógica específica del usuario: Si el contrato implementa restricciones al usuario, comprueba la lógica para determinar los límites de transferencia individuales. Esta lógica puede incluir atributos de usuario, saldo u otros criterios.

  9. Mantente al día: Mantente al día de las últimas novedades de nuestra comunidad (canal de Telegram) y de las mejores prácticas para la detección del fraude (nuestro Blog y canal de YouTube).

Buenas noticias: nuestro Escáner de Seguridad encuentra con éxito (incluso ocultas) así como calcula las restricciones de transferencia (AntiWhale) en el 90% de los casos. Utiliza nuestra suscripción Premium y protege tus fondos de las amenazas.

Aunque el mecanismo AntiWhale está diseñado para evitar la manipulación del mercado y garantizar la distribución de fichas, los defraudadores pueden utilizar sus capacidades para estafar a los usuarios. A continuación se exponen algunos posibles escenarios y consejos para asegurar las inversiones en tokens con el mecanismo AntiWhale en funcionamiento.

Ejemplo 1: Limitación del importe de las operaciones con periodo de reflexión (Transaction Amount Limits with Cooldown)


    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    uint256 public cooldownTime = 1 days; // Cooldown time between transactions
    
    mapping(address => uint256) private lastTransactionTimestamp;
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        require(block.timestamp - lastTransactionTimestamp[msg.sender] >= cooldownTime, "Wait for cooldown period to end");
        ...
        lastTransactionTimestamp[msg.sender] = block.timestamp;
    }

Este ejemplo limita la cantidad máxima que puede transferir una dirección en un determinado periodo de tiempo.

Incluye un mecanismo de enfriamiento que proporciona un periodo de espera entre transacciones en la misma dirección. La matriz lastTransactionTimestamp mantiene un registro de la fecha y hora de la última transacción de cada dirección.

Ejemplo 2: Restricciones dinámicas de traducción (Progressive Transaction Limits)


    uint256 public initialMaxTransactionAmount = 500000; // Initial maximum transaction amount
    uint256 public maxTransactionIncreaseRate = 20000; // Maximum increase rate per transaction
    uint256 public cooldownTime = 2 days; // Cooldown time between transactions
            
    mapping(address => uint256) private lastTransactionTimestamp;
            
    function transfer(address to, uint256 value) public {
        uint256 currentMaxTransactionAmount = initialMaxTransactionAmount + (maxTransactionIncreaseRate * (block.timestamp - lastTransactionTimestamp[msg.sender]) / cooldownTime);
        require(value <= currentMaxTransactionAmount, "Exceeded maximum transaction amount");
        ...
        lastTransactionTimestamp[msg.sender] = block.timestamp;
    }

Este ejemplo utiliza un mecanismo dinámico en el que el importe máximo de transacción aumenta gradualmente con el tiempo.

El parámetro maxTransactionIncreaseRate controla la tasa de incremento del importe máximo de transacción. La matriz lastTransactionTimestamp registra la fecha y hora de la última transacción de cada dirección.

restricciones dinámicas de traducción

Ejemplo 3: Excepciones de la lista blanca (Whitelist Exemption)


    address[] public whitelistedAddresses;
    mapping(address => bool) public isWhitelisted;
    
    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount || isWhitelisted[msg.sender], "Exceeded maximum transaction amount");
        ...
    }

Este ejemplo utiliza exclusiones para direcciones específicas de las restricciones de AntiWhale mediante listas blancas.

Las direcciones de la matriz whitelistedAddresses se consideran exentas de la restricción del importe máximo de transacción. La matriz isWhitelisted determina si una dirección concreta está en la lista blanca.

Ejemplo 4: Límites escalonados de transacciones (Tiered Transaction Limits)


    uint256[] public tieredLimits = [5000000, 2000000, 1000000]; // Tiered transaction limits for different address balances

    function transfer(address to, uint256 value) public {
        require(value <= getTransactionLimit(msg.sender), "Exceeded maximum transaction amount");
        ...
    }
    
    function getTransactionLimit(address user) internal view returns (uint256) {
        uint256 userBalance = balanceOf(user);
    
        if (userBalance < 10000) {
            return tieredLimits[0];
        } else if (userBalance < 50000) {
            return tieredLimits[1];
        } else {
            return tieredLimits[2];
        }
    }

Este ejemplo implementa límites de transacción escalonados basados en el saldo de la dirección del remitente. Los usuarios con un saldo menor tienen un límite de transacción mayor, y los usuarios con un saldo mayor tienen un límite de transacción menor.

La función getTransactionLimit determina el límite de transacción apropiado en función del saldo del usuario.

Ejemplo 5: Comisiones por grandes transacciones (Tax on Large Transactions)


    uint256 public taxRate = 75; // 5% tax rate on transactions exceeding the limit
    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount
    
    function transfer(address to, uint256 value) public {
        if (value > maxTransactionAmount) {
            uint256 taxAmount = (value * taxRate) / 100;
            uint256 netTransferAmount = value - taxAmount;
    
            // Transfer logic here for the net transfer amount
            ...
        } else {
            // Transfer logic here for amounts within the limit
            ...
        }
    }

En este ejemplo, la comisión se cobra en las operaciones que superan el importe máximo de la operación.

La tasa de comisión (TaxRate) determina el porcentaje del importe de la transacción. La comisión se deduce y luego se procesa el importe neto de la transferencia.

Ejemplo 6: Límites escalonados (Multi-Level Transaction Limits)


    uint256 public maxTransactionAmount1 = 500000; // Maximum transaction amount for tier 1 (500,000 tokens)
    uint256 public maxTransactionAmount2 = 200000; // Maximum transaction amount for tier 2 (200,000 tokens)
    
    function transfer(address to, uint256 value) public {
        if (value <= maxTransactionAmount1) {
            ...
        } else if (value <= maxTransactionAmount2) {
            ...
        } else {
            revert("Exceeded maximum transaction amount");
        }
    }

Este ejemplo implementa varios niveles de límites de transacción, en los que se aplican distintos límites en función del importe de la transacción.

Esto permite establecer límites de transacción con distintos niveles de granularidad para distintos volúmenes de fichas.

Ejemplo 7: Límites dinámicos de transacciones en función del saldo (Dynamic Transaction Limits based on Token Balance)


    uint256 public maxTransactionPercentage = 5; // Maximum transaction percentage relative to total token supply
    
    function transfer(address to, uint256 value) public {
        uint256 maxTransactionAmount = (totalSupply() * maxTransactionPercentage) / 100;
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        ...
    }

Este ejemplo calcula dinámicamente el importe máximo de la transacción como porcentaje del Suministro Total. El parámetro PorcentajeTransacciónMáxima define el porcentaje permitido para una sola transacción.

límites dinámicos de transacciones

Ejemplo 8: Límites dependientes del tiempo (Time-Dependent Transaction Limits)


    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount (1 million tokens)
    uint256 public startTime = 1700000000; // Start time in Unix timestamp
    uint256 public endTime = 1800000000; // End time in Unix timestamp

    function transfer(address to, uint256 value) public {
        require(block.timestamp >= startTime && block.timestamp <= endTime, "Transaction not allowed at this time");
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
        ...
    }

En este ejemplo, se aplican restricciones a las transacciones en función del tiempo, permitiendo transacciones sólo dentro de un plazo determinado.

Los parámetros startTime y endTime definen el periodo durante el cual se permiten las transacciones.

Ejemplo 9: Fiscalidad progresiva(Progressive Taxation)


    uint256 public maxTransactionAmount = 1000000; // Maximum transaction amount (1 million tokens)
    uint256 public taxRate = 2; // Initial tax rate in percentage
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTransactionAmount, "Exceeded maximum transaction amount");
    
        uint256 taxAmount = (value * taxRate) / 100;
        uint256 netTransferAmount = value - taxAmount;
    
        // Transfer logic here for the net transfer amount
        ...
    }

Este ejemplo presenta un mecanismo fiscal progresivo en el que se aplica un impuesto (tasa) a las transacciones que superan un importe máximo.

El tipo impositivo (tasa) puede ajustarse con el tiempo o en función de determinadas condiciones.

Ejemplo 10: Límites de transacciones basados en los saldos de los titulares (Weighted Transaction Limits based on Token Holders' Balances)


    uint256 public maxTotalTransactionAmount = 5000000; // Maximum total transaction amount for all token holders
    mapping(address => uint256) public userTransactionLimit; // Transaction limits based on individual token holder balances
    
    function transfer(address to, uint256 value) public {
        require(value <= maxTotalTransactionAmount, "Exceeded maximum total transaction amount");
        require(value <= userTransactionLimit[msg.sender], "Exceeded individual transaction limit");
        ...
    }

Este ejemplo implementa límites de transacción basados tanto en el importe total de las transacciones como en el saldo de los poseedores individuales de tokens.

El enlace userTransactionLimit te permite establecer límites personalizados basados en los saldos de direcciones concretas.

 

Esperamos que estos ejemplos te hayan ayudado a comprender mejor el mecanismo AntiWhale en los contratos inteligentes.

 

Dado que toda la información de la cadena de bloques es abierta (siempre que, por supuesto, se verifique el código fuente del contrato), armado con este conocimiento puedes estudiar de forma independiente los contratos inteligentes e identificar diversas estafas.

Sin embargo, ¡ya lo hemos hecho todo por ti! Regístrate para obtener una suscripción Premium y accede a filtros exclusivos sobre las características de los contratos inteligentes y a nuevos análisis. Aumenta tus posibilidades de invertir con éxito en tokens rentables.

Saludos, equipo de Lotus Market.

All posts

Connect to a wallet

Metamask