Modificadores de funciones
Clase 12 de 21 • Curso de Introducción al Desarrollo Blockchain: Smart Contracts
Resumen
Solidity implementa un tipo de función especial denominada Modificadores que nos permiten ejecutar una pieza de código antes o después del comportamiento de la propia función.
Comportamiento de una función
Los usos más frecuentes de los modificadores suelen ser la validación de datos o la restricción de acceso a una función si el usuario no tiene permisos. Dichas validaciones puedesn realizarse con modificadores que además permiten ser reutilizadas.
Estos nos permiten hacer validaciones antes de ejecutar las funciones. De esta forma, podemos evitar comportamientos inesperados o que alguien sin autorización ejecute la función.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract FunctionModifier {
address public owner;
constructor() {
// Guardamos la información del dueño del contrato para validar al mismo
owner = msg.sender;
}
// Modificador para validar que la llamada la realiza el dueño del contrato
modifier onlyOwner() {
require(msg.sender == owner, "No eres el owner");
_;
}
// Solo el dueño del proyecto puede cambiar al mismo
function changeOwner(address _newOwner) public onlyOwner {
owner = _newOwner;
}
}
La sintaxis de un modificador es sencilla, utilizando la palabra reservada modifier
, declaramos la función y dentro del mismo utilizamos un require
para realizar una validación y un _
para indicarle al compilador de Solidity que continúe ejecutando el resto de la función si la condición se cumplió correctamente.
En el caso de que la condición no se cumpla y el modificador rechace la transacción, el require
realizará un revert
para volver atrás todos los cambios de estado del contrato por nosotros y que no tengamos que preocuparnos. Las operaciones en Solidity son atómicas, lo que quiere decir que se ejecuta correctamente cada una de las instrucciones o no se ejecuta ninguna.
Finalmente, una función puede implementar el modificador en la declaración de la misma. A lo igual que indicamos que una función es public
o pure
, también le implementamos el nombre del modificador que utilizará.
function changeOwner(address _newOwner) public onlyOwner { }
La lógica dentro del modificador puede ser del nivel de complejidad que necesitemos, usando condicionales u otros flujos de control. Con esta característica de Solidity, ya estás listo o lista para desarrollar contratos con permisos y validaciones de datos para que el flujo del mismo sea el esperado.
Contribución creada por: Luis Enrique Herrera y Kevin Fiorentino (Platzi Contributors).