Una necesidad muy frecuente en un contrato inteligente es poder controlar el acceso al contrato y restringir el mismo al dueño del contrato.
Propiedad de un contrato
Por lo general, la dirección que despliega el contrato se convierte en el owner del mismo. Puedes obtener la dirección de quién realice el despliegue con msg.sender
, asignárselo a una variable y, con la misma, hacer la validación del dueño del contrato.
pragma solidity >=0.7.0 <0.9.0;
contract MiContrato {
address private owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Debes ser el owner del contrato para continuar");
_;
}
function functionParaElOwner() public onlyOwner {}
}
Propiedad del contrato con OpenZeppelin
Al tratarse de un caso de uso muy trivial e importante, puedes utilizar una librería de OpenZeppelin para solucionarlo en menos líneas de código.
pragma solidity >=0.7.0 <0.9.0;
import "@openzeppelin/contracts/access/Ownable.sol";
contract MiContrato is Ownable {
function functionParaElOwner() public onlyOwner {}
}
Tu contrato hereda de Ownable
para disponer del modificador onlyOwner
. De esta forma, aseguras tu contrato a no cometer ningún error con respecto a la manipulación de su dueño.
Cambiar el dueño de un contrato
El contrato Ownable
de OpenZeppelin trae consigo dos características más que pueden serte de utilidad en la lógica que tengas que desarrollar en tu propio contrato.
La primera es la posibilidad de cambiar el dueño del contrato. La función transferOwnership(address)
recibe por parámetro una dirección y asignará la misma como nuevo owner del contrato.
Cabe destacar que solo el actual dueño del contrato puede llamar a esta función y ceder la propiedad del contrato.
La segunda característica es la posibilidad de que el dueño actual del contrato renuncie a este. La función renounceOwnership()
le asignará un 0 a la variable que guarda la dirección del dueño del contrato, haciendo imposible su recuperación.
¡Ten cuidado!
Es importante tener cuidado con esta función, ya que el contrato podría quedar inutilizable si nadie es el owner del mismo.
Conclusión
Tener la posibilidad de que una sola cuenta ejecute determinadas acciones en un contrato puede llevar a centralizar el mismo. Impleméntalo en casos de uso donde verdaderamente una sola persona deba poder gestionarlo y tener un buen motivo para que así sea.
Sin embargo, administrar correctamente el owner de un contrato es crucial para evitar robos de fondos o identidades en un proyecto y utilizar contratos ya probados y auditados como lo es Ownable
de OpenZeppelin es más que aconsejable hacerlo.
Contribución creada por: Kevin Fiorentino (Platzi contributor).
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?