Adquiere por un a帽o todos los cursos, escuelas y certificados por un precio especial.

Antes: $249

Currency
$219/a帽o

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Comprar ahora

Termina en:

1D
19H
12M
7S
Curso de Introducci贸n a OpenZeppelin

Curso de Introducci贸n a OpenZeppelin

Sebasti谩n Leonardo Perez

Sebasti谩n Leonardo Perez

Propiedad con Ownable

2/19
Recursos

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.

// SPDX-License-Identifier: GPL-3.0
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.

// SPDX-License-Identifier: GPL-3.0
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).

Aportes 5

Preguntas 4

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Revisando la librer铆a, veo que al renunciar al owner lo que pasa es que se transfiere el owner del contrato a la direcci贸n 鈥0鈥, por lo que entiendo que en Solidity no se puede quedar un contrato sin owner, simplemente se le asigna a 0 para que ninguna direcci贸n sea la due帽a.

Es interesante porque a partir de ah铆, ser铆a imposible reasignar el owner si no se llama a la funci贸n desde la direcci贸n 鈥0鈥, elegante y sencillo.

Esas funciones para renunciar al owner se podr铆an usar por ejemplo si tenemos ciertos pasos previos a empezar la operaci贸n del contrato?

Digamos que hay una funci贸n que asigna tokens manualmente de acuerdo a un nivel de usuario, esto en una ICO o similar, una vez que termin贸 esa etapa se podr铆a dejar al contrato trabajando en autom谩tico y para darle transparencia al asunto, inutilizar esa funci贸n de asignaci贸n manual renunciando al owner, de este modo el contrato trabajar铆a solo de acuerdo a las reglas programadas.

Es algo as铆 o podr铆a ser?

Muy buen inicio de curso, aplicando los aprendido durante las 煤ltimas clases del curso de introducci贸n a solidity, larga vida a las clases y a la herencia

脡ste es el contrato Ownable

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

Aunque peligroso el m茅todo que permite renunciar al contrato se puede utilizar como mecanismo de seguridad para dejar un contrato obsoleto, algo as铆 como quemar el contrato si se sospecha que la cuenta del due帽o del contrato fue robada.
驴Tambi茅n me pregunto qu茅 otros usos o bajo qu茅 circunstancias alguien quisiera renunciar a sus permisos dentro del contrato?
Igual que terrible si alguien accede a tu cuenta y renuncia a los permisos solo por hacerte da帽o鈥