Análisis de smart contracts
03.04.2024

Contratos inteligentes con función Pause

Continuamos la serie de artículos dedicados a la descripción de esquemas fraudulentos en los contratos inteligentes. Hoy examinaremos los contratos inteligentes con la función de Pause.

Los contratos inteligentes con funciones de Pause ofrecen la posibilidad de detener temporal o permanentemente determinadas operaciones o funciones dentro del contrato. Aunque las funciones de Pausa pueden ser útiles para la seguridad y el mantenimiento, también suponen un riesgo potencial si son explotadas por los defraudadores. Para protegerte e identificar posibles amenazas, debes comprender los riesgos, los esquemas de fraude habituales y cómo reconocerlos en un contrato inteligente.

Los peligros de los contratos inteligentes con función Pause:

  • Pausa no autorizada: Los defraudadores pueden hacerse con el control de la función Pause y detener el contrato sin la debida autorización, lo que podría provocar la interrupción del negocio o pérdidas económicas.

  • Retrasos engañosos: Los contratos maliciosos pueden suspender transacciones críticas, como retiradas o transferencias, bajo el pretexto de mantenimiento temporal o medidas de seguridad, con la intención de negar a los usuarios el acceso a sus activos.

  • Falsas alegaciones de emergencias: Los defraudadores pueden alegar falsamente emergencias o vulnerabilidades para justificar la suspensión de un contrato y luego utilizar los fondos de los usuarios durante la pausa.

  • Pretexto de seguridad: Los contratos maliciosos pueden alegar que se ha descubierto una vulnerabilidad de seguridad, lo que provoca la activación de la función de suspensión. En realidad, los estafadores pueden pretender aprovecharse de la situación.

  • Planes de emergencia: Los estafadores pueden utilizar un lenguaje o escenarios que induzcan al miedo, como alegar un "intento de robo" o una "emergencia" para justificar una pausa durante la cual pueden cometer actos ilegales.

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

Si quieres determinar por ti mismo la presencia de funciones de Pause en los contratos inteligentes, los siguientes consejos te serán útiles para hacerlo.

  1. Examina el código fuente del contrato para ver si existe una función de Pause. Asegúrate de que el mecanismo de pausa está bien documentado y tiene controles de acceso adecuados.

  2. Averigua quién controla la función Pause. La posesión no autorizada o no controlada de la función Pause es un problema potencial.

  3. Familiarízate con la documentación y las especificaciones del proyecto para asegurarte de que proporcionan información clara y precisa sobre la función Pause, su finalidad y las circunstancias en que puede utilizarse.

  4. Comprueba la transparencia del uso de la función Pause. Asegúrate de que existen procedimientos claros para gestionar y decidir si activar o desactivar la Pause.

  5. Presta atención a las auditorías externas de la seguridad de los contratos inteligentes, especialmente del mecanismo de pausa. Los auditores deben evaluar la seguridad y la transparencia de la función Pause.

  6. Observa el comportamiento del contrato y asegúrate de que la función Pause sólo se activa en circunstancias legítimas, por ejemplo, por razones de mantenimiento o seguridad.

  7. Comprométete con la comunidad del proyecto y con otros usuarios para comprender sus experiencias y retos al utilizar la función Pause.

  8. 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).

Para detectar una funcionalidad potencialmente maliciosa en un contrato inteligente con una función de pausa, actúa con la diligencia debida y escudriña el código y la documentación del proyecto. Evita los contratos con un comportamiento sospechoso o falta de transparencia respecto al uso de la función Pause.

El escáner de seguridad de Lotus Market encuentra todas las funciones comunes (incluidas las ocultas) de Pause el 99,9% de las veces. Utiliza nuestra suscripción Premium y protege tus fondos de las amenazas.

A continuación, veremos algunos de los ejemplos más comunes de funcionalidad de Pause que la Plataforma Lotus Market encuentra con éxito.

quieres determinar por ti mismo

Ejemplo 1: Función básica Pause


    contract BasicPauseToken {
        address public owner;
        bool public paused;
    
        constructor() {
            owner = msg.sender;
            paused = false;
        }
    
        modifier whenNotPaused() {
            require(!paused, "Contract is paused");
            _;
        }
    
        function pause() public {
            require(msg.sender == owner, "Only the owner can pause");
            paused = true;
        }
    
        function unpause() public {
            require(msg.sender == owner, "Only the owner can unpause");
            paused = false;
        }
    
        function transfer(address to, uint256 amount) public whenNotPaused {
            // Transfer logic when the contract is not paused
        }
    }

Consejos de identificación: Busca un contrato con funciones como pausar y despausar o funciones similares que puedan conmutar el estado de pausa.

Comprueba si se ha aplicado un modificador de tipo whenNotPaused a determinadas funciones para garantizar que sólo puedan ejecutarse cuando el contrato no esté suspendido.

Comprueba el mecanismo de control de acceso, que debe permitir que sólo el propietario o las personas autorizadas puedan suspender y revocar la suspensión del contrato.

Ejemplo 2: Pausa activada por tiempo


    contract TimeActivatedPauseToken {
        address public owner;
        bool public paused;
        uint256 public pauseStartTime;
        uint256 public pauseDuration;
    
        constructor(uint256 _duration) {
            owner = msg.sender;
            paused = false;
            pauseStartTime = 0;
            pauseDuration = _duration;
        }
    
        modifier whenNotPaused() {
            require(!paused, "Contract is paused");
            _;
        }
    
        function pause() public {
            require(msg.sender == owner, "Only the owner can pause");
            paused = true;
            pauseStartTime = block.timestamp;
        }
    
        function unpause() public {
            require(msg.sender == owner, "Only the owner can unpause");
            require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
            paused = false;
        }
    
        function transfer(address to, uint256 amount) public whenNotPaused {
            // Transfer logic when the contract is not paused
        }
    }

Consejos de identificación: Busca un contrato con un mecanismo de pausa activado por tiempo, en el que la pausa y la cancelación de la pausa tengan una duración determinada.

Comprueba si hay un modificador de tipo whenNotPaused aplicado a determinadas funciones. Asegúrate de que el contrato impone la duración de la pausa y sólo permite cancelarla una vez transcurrido el periodo de tiempo especificado.

Al identificar las funciones de Pause en un contrato inteligente, es fundamental examinar el código, los controles de acceso y la finalidad del mecanismo de pausa. Revisa cuidadosamente la documentación y el modelo de gestión del contrato, y colabora con la comunidad del proyecto para evaluar la legitimidad del contrato y si es adecuado para su finalidad. Sé siempre precavido y aplica la diligencia debida antes de participar en cualquier transacción o inversión que implique contratos suspendibles.

pausa activada por tiempo

Ejemplo 3: Función de pausa condicional


    contract ConditionalPauseToken {
        address public owner;
        bool public paused;
    
        constructor() {
            owner = msg.sender;
            paused = false;
        }
    
        modifier whenNotPaused() {
            require(!paused || msg.sender == owner, "Contract is paused");
            _;
        }
    
        function pause() public {
            require(msg.sender == owner, "Only the owner can pause");
            paused = true;
        }
    
        function unpause() public {
            require(msg.sender == owner, "Only the owner can unpause");
            paused = false;
        }
    
        function transfer(address to, uint256 amount) public whenNotPaused {
            // Transfer logic when the contract is not paused, except for the owner
        }
    }

Consejos de identificación: Busca un contrato con un mecanismo de pausa condicional que permita al propietario realizar determinadas operaciones aunque el contrato esté suspendido.

Comprueba si el modificador de tipo whenNotPaused se aplica a las funciones que requieren que el contrato esté en estado no pausado.

Ejemplo 4: Función de pausa de emergencia


    contract EmergencyPauseToken {
        address public owner;
        bool public paused;
    
        constructor() {
            owner = msg.sender;
            paused = false;
        }
    
        modifier whenNotPaused() {
            require(!paused || msg.sender == owner, "Contract is paused");
            _;
        }
    
        function pause() public {
            require(msg.sender == owner, "Only the owner can pause");
            paused = true;
        }
    
        function emergencyPause() public {
            require(msg.sender == owner, "Only the owner can initiate emergency pause");
            paused = true;
        }
    
        function unpause() public {
            require(msg.sender == owner, "Only the owner can unpause");
            paused = false;
        }
    
        function transfer(address to, uint256 amount) public whenNotPaused {
            // Transfer logic when the contract is not paused, except for the owner
        }
    }

Consejos de identificación: Busca un contrato con una función de pausa de emergencia que permita al propietario suspender inmediatamente el contrato, incluso sin los procedimientos de suspensión habituales.

Comprueba si hay un modificador de tipo whenNotPaused para determinar qué operaciones se restringen cuando se suspende el contrato.

Presta atención a las funciones de pausa de emergencia del contrato y asegúrate de que su uso está estrictamente controlado y bien documentado.

Haz coincidir las funciones de suspensión del contrato con su modelo de gobernanza y los procesos de toma de decisiones para activar y desactivar la función de suspensión.

Ejemplo 5: Pausa controlada por el propietario con límite de tiempo


    contract TimedPauseToken {
        address public owner;
        bool public paused;
        uint256 public pauseStartTime;
        uint256 public pauseDuration;
    
        constructor(uint256 _duration) {
            owner = msg.sender;
            paused = false;
            pauseStartTime = 0;
            pauseDuration = _duration;
        }
    
        modifier whenNotPaused() {
            require(!paused, "Contract is paused");
            _;
        }
    
        function pause() public {
            require(msg.sender == owner, "Only the owner can pause");
            paused = true;
            pauseStartTime = block.timestamp;
        }
    
        function unpause() public {
            require(msg.sender == owner, "Only the owner can unpause");
            require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
            paused = false;
        }
    
        function transfer(address to, uint256 amount) public whenNotPaused {
            // Transfer logic when the contract is not paused
        }
    }

Consejos de identificación: Busca un contrato con una pausa controlada por el propietario que incluya una duración específica de la pausa y la cancelación de la misma.

Comprueba si hay un modificador de tipo whenNotPaused aplicado a las funciones apropiadas para restringir las operaciones cuando el contrato está suspendido.

pausa controlada por el propietario con límite de tiempo

Ejemplo 6: Pausa de terceros con límite de tiempo


    contract ThirdPartyTimedPauseToken {
        address public owner;
        address public thirdParty;
        bool public paused;
        uint256 public pauseStartTime;
        uint256 public pauseDuration;
    
        constructor(address _thirdParty, uint256 _duration) {
            owner = msg.sender;
            thirdParty = _thirdParty;
            paused = false;
            pauseStartTime = 0;
            pauseDuration = _duration;
        }
    
        modifier whenNotPaused() {
            require(!paused || msg.sender == owner || msg.sender == thirdParty, "Contract is paused");
            _;
        }
    
        function pause() public {
            require(msg.sender == thirdParty, "Only the third party can pause");
            paused = true;
            pauseStartTime = block.timestamp;
        }
    
        function unpause() public {
            require(msg.sender == thirdParty, "Only the third party can unpause");
            require(block.timestamp >= pauseStartTime + pauseDuration, "Pause duration not over");
            paused = false;
        }
    
        function transfer(address to, uint256 amount) public whenNotPaused {
            // Transfer logic when the contract is not paused, except for the owner and the third party
        }
    }

Consejos de identificación: Busca un contrato con un mecanismo de suspensión gestionado por terceros, en el que éstos puedan suspender y desconectar el contrato con una duración determinada.

Comprueba si hay un modificador de tipo whenNotPaused para determinar qué operaciones se restringen cuando se suspende un contrato.

Garantizar que los mecanismos de control de acceso a las funciones de Pause del contrato, ya sean propiedad del propietario, gestionadas por la comunidad o por terceros, sean transparentes y estén bien diseñados.

Cuando se identifica una función de Pause en un contrato inteligente, se debe realizar un análisis exhaustivo del código, probar los controles de acceso y comprender la finalidad y el modelo de control del mecanismo de Pause. Es fundamental llevar a cabo la diligencia debida y comprometerse con la comunidad del proyecto para evaluar la legitimidad del contrato y si es adecuado para su propósito. Sé siempre precavido e investiga adecuadamente antes de firmar contratos que ofrezcan la opción de pausa para mitigar posibles riesgos.

 

Esperamos que estos ejemplos te hayan ayudado a comprender mejor el esquema de la función Pause 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