4.3 Modificadores de funciones

html

4.3 Modificadores de Funciones en Solidity

En Solidity, los modificadores de funciones ofrecen una manera estructurada y reutilizable para añadir lógica adicional a las funciones. Los modificadores pueden validar condiciones antes y/o después de la ejecución de una función y ayudan a reducir la repetición de código.

Concepto Básico

Un modificador de función actúa como un intermediario que ejecuta su lógica antes de llamar a la función objetivo. Si las condiciones del modificador no se cumplen, la función no se ejecutará.

Definiendo un Modificador

Para definir un modificador, utilizamos la palabra clave modifier seguida del nombre del modificador y su lógica. Aquí un ejemplo simple:

    pragma solidity ^0.8.0

    contract Example {
        address public owner

        constructor() {
            owner = msg.sender
        }

        modifier onlyOwner() {
            require(msg.sender == owner, Not the contract owner)
            _
        }

        function securedFunction() public onlyOwner {
            // Function logic here
        }
    }
    

Profundizando en el Uso de Modificadores

El modifier onlyOwner() en el ejemplo anterior asegura que solo el propietario del contrato pueda llamar a securedFunction. Si alguien más intenta llamarla, la llamada fallará.

El carácter _ en un modificador indica dónde se insertará el cuerpo de la función objetivo. Esto permite al modificador ejecutar su lógica antes y/o después de la ejecución de la función.

Ejecución antes de la Función

En el ejemplo anterior, el modificador se ejecuta antes de la función, verificando que el mensaje provenga del dueño del contrato:

    modifier onlyOwner() {
        require(msg.sender == owner, Not the contract owner)
        _
    }
    

Ejecución después de la Función

    modifier executeAfter() {
        _
        // Lógica que se ejecuta después de la función
    }
    

Ejemplo Completo

En este contrato, combinamos ambos tipos de ejecuciones:

    pragma solidity ^0.8.0

    contract AdvancedExample {
        address public owner
        uint public lastAccess

        constructor() {
            owner = msg.sender
        }

        modifier onlyOwner() {
            require(msg.sender == owner, Not the contract owner)
            _
        }

        modifier updateLastAccessTime() {
            _
            lastAccess = block.timestamp
        }

        function securedFunction() public onlyOwner updateLastAccessTime {
            // Function logic here
        }
    }
    

En este ejemplo, onlyOwner se asegura de que solo el propietario pueda llamar a securedFunction, y updateLastAccessTime actualiza el tiempo de acceso después de ejecutar la función.

Modificadores con Parámetros

Los modificadores también pueden aceptar parámetros para personalizar su comportamiento:

    pragma solidity ^0.8.0

    contract ParameterExample {
        address public owner

        constructor() {
            owner = msg.sender
        }

        modifier onlyAfter(uint _time) {
            require(block.timestamp >= _time, Function called too early)
            _
        }

        function timeRestrictedFunction(uint _time) public onlyAfter(_time) {
            // Function logic here
        }
    }
    

Aquí, onlyAfter verifica que el tiempo actual sea mayor o igual que el tiempo especificado como parámetro antes de permitir la ejecución de la función timeRestrictedFunction.

Conclusiones

Los modificadores de funciones en Solidity son herramientas poderosas que permiten añadir lógica de manera modular y reutilizable. Facilitan la implementación de controles de acceso, validaciones y cualquier lógica que necesite ser ejecutada en varios puntos del contrato sin duplicar código.

AnteriorSiguiente

[mwai_chat]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *