El modificador onlyOwner es probablemente uno de los patrones más comunes en Solidity.
En el siguiente ejemplo, la función setMessage() solo puede ser llamada por la dirección designada como el propietario.
function setMessage(string calldata _message) external onlyOwner {
message = _message;
}
Sin embargo, la implementación Ownable de OpenZeppelin comúnmente utilizada tiene la deficiencia de permitir al propietario transferir la propiedad a una dirección inexistente o mal escrita.
Ownable2Step es más seguro que Ownable para los smart contracts porque el propietario no puede transferir accidentalmente la propiedad del smart contract a una dirección mal escrita. En lugar de transferirla directamente al nuevo propietario, la transferencia solo se completa cuando el nuevo propietario acepta la propiedad.
Ownable2Step se lanzó en enero de 2023 durante la actualización de la versión 4.8 de OpenZeppelin. Aquí está el código.
Aquí tienes un ejemplo mínimo:
import "@openzeppelin/contracts/access/Ownable2Step.sol";
contract ExampleOwnable2Step is Ownable2Step {
string public message;
constructor() Ownable(msg.sender) {}
function setMessage(string calldata _message) external onlyOwner {
message = _message;
}
}
Ownable2Step hereda de Ownable y sobrescribe transferOwnership() para que el nuevo propietario quede “pendiente”. El receptor debe entonces llamar a acceptOwnership() para finalizar la transferencia. Esto asegura que solo una dirección que tenga acceso a sus claves privadas, o que controle la dirección del smart contract, pueda controlar el smart contract.
Todavía no hay una verificación en dos pasos para renunciar a la propiedad, es decir, transferir la propiedad a la dirección cero. Si no hay necesidad de renunciar a la propiedad, es más seguro sobrescribir “renounceOwnership()” para que haga revert al ser llamada.
Aprende más
Este tutorial es parte de nuestro solidity bootcamp avanzado.
Publicado originalmente el 8 de abril de 2023