Modificadores en Solidity para código limpio

Resumen

Los modificadores en Solidity son una herramienta que te permite escribir contratos inteligentes más limpios, seguros y fáciles de mantener. Si estás aprendiendo a programar en blockchain, dominarlos te ayuda a refactorizar código repetitivo y a controlar permisos sin ensuciar la lógica principal de tus funciones.

¿Qué cambios hicimos al contrato Payables antes de usar modificadores?

Antes de saltar al modificador, el contrato Payables recibió ajustes pequeños pero significativos para alinearlo con buenas prácticas.

El arreglo que guarda los saldos pasó a llamarse balanceOf. Ese nombre no es casualidad: es el mismo método estándar que define el ERC-20, el estándar de tokens más usado en Ethereum. Mantener esa convención hace que tu contrato sea consistente con lo que otros desarrolladores esperan encontrar [01:30].

La dirección del charity se conserva con la misma regla, y la función deposit solo cambió el nombre de su variable interna. El cambio de fondo está en withdraw.

¿Cómo funciona require para validar permisos en Solidity?

Dentro de withdraw aparece require, una pieza clave para hacer contratos seguros.

require evalúa una condición antes de ejecutar el resto del código. Si la condición se cumple, la función continúa. Si no, revierte la transacción y devuelve un mensaje de error al usuario. Puedes pensarlo como un if defensivo que protege la ejecución [02:30].

¿Qué hace require en Solidity? Verifica que una condición se cumpla antes de ejecutar el resto de la función. Si falla, revierte la transacción y devuelve el mensaje de error que tú definas.

En el ejemplo, require compara msg.sender con la dirección del charity guardada en el contrato. Solo esa dirección puede retirar fondos. Cualquier otra wallet recibe el mensaje Not the charity y la transacción falla.

¿Cómo se ve esa validación en Remix?

Al desplegar el contrato en Remix y depositar 50 Ethereum desde una wallet cualquiera, el saldo de esa billetera baja en 50 unidades. Hasta ahí, todo normal.

Luego, al llamar a withdraw desde una wallet que no es la del charity, Remix muestra una cruz roja y el mensaje Not the charity. Cuando cambias a la wallet correcta, la del charity que desplegó el contrato, la transacción se ejecuta y los 50 Ethereum llegan a su saldo [05:00].

¿Qué es un modificador y cómo refactoriza tu código?

Un modificador es una pieza de código reutilizable que se ejecuta antes (o después) de una función. Es la forma elegante de mover esa validación de require fuera de withdraw para poder reutilizarla en cualquier otra función que la necesite.

La sintaxis usa la palabra modifier, seguida de un nombre. En este caso, OnlyOwner. Dentro va la línea con require, y al final un guion bajo con punto y coma: _;. Ese guion bajo le indica a Solidity dónde insertar el código de la función que use el modificador [06:30].

solidity modifier OnlyOwner() { require(msg.sender == charity, "Not the charity"); _; }

Después, en la función withdraw, agregas OnlyOwner justo después del visibilidad public. Remix incluso autocompleta la sugerencia.

solidity function withdraw() public OnlyOwner { // lógica de retiro }

¿Para qué sirve un modificador en Solidity? Para encapsular validaciones repetidas, como chequeos de permisos, y aplicarlas a varias funciones sin duplicar código. Mejora la legibilidad y la seguridad del contrato.

¿Por qué usar OnlyOwner en lugar de repetir require?

La ventaja se nota cuando tu contrato crece. Si tienes cinco funciones que solo el dueño puede ejecutar, repetir require en cada una te obliga a mantener cinco lugares distintos. Con OnlyOwner, defines la regla una sola vez y la aplicas donde haga falta.

Algunas razones concretas para usar modificadores:

  • Reutilizas la misma validación en varias funciones sin copiar código.
  • Si cambia la regla de permisos, la actualizas en un solo lugar.
  • La intención de cada función queda clara desde su firma: si dice OnlyOwner, sabes quién puede llamarla.
  • Reduces errores humanos al no tener que recordar pegar el require correcto en cada método.

¿Qué aprendiste sobre refactorización de contratos inteligentes?

La refactorización es la práctica de reescribir código que ya funciona para hacerlo más legible, mantenible y reutilizable. En Solidity, los modificadores son una de las herramientas más directas para lograrlo, junto con nombrar variables siguiendo estándares como ERC-20 y validar entradas con require.

Con OnlyOwner aplicado a withdraw, el contrato queda más seguro, más limpio y listo para crecer. La misma lógica te sirve para validar roles, estados o cualquier condición que se repita.

Me encantaría leer en los comentarios qué tan útiles te resultan los modificadores cuando refactorizas tus propios contratos.