WTF Introdução básica ao Solidity: 11. Construtores e Modificadores
June 12, 2024 · View on GitHub
Recentemente, estou revisando Solidity para reforçar alguns detalhes e escrever uma "Introdução básica ao Solidity da WTF", para uso de iniciantes (programadores experientes podem buscar outros tutoriais). Atualização semanal de 1 a 3 palestras.
Twitter: @0xAA_Science
Comunidade: Discord | Grupo do WhatsApp | Site oficial wtf.academy
Todo o código e tutoriais estão disponíveis no GitHub: github.com/AmazingAng/WTF-Solidity
Nesta palestra, vamos usar o exemplo do contrato de controle de permissão (Ownable) para apresentar os conceitos de construtores (constructor) e modificadores (modifier) exclusivos do Solidity.
Construtores
Os construtores (constructor) são funções especiais que podem ser definidas em um contrato e são executadas automaticamente uma vez quando o contrato é implantado. Eles podem ser usados para inicializar alguns parâmetros do contrato, como definir o endereço do owner:
address owner; // Definindo a variável owner
// Construtor
constructor() {
owner = msg.sender; // Define o owner como o endereço que implantou o contrato.
}
Observação⚠️: A sintaxe dos construtores varia de acordo com a versão do Solidity. Antes da versão 0.4.22, os construtores eram declarados com o mesmo nome do contrato, o que podia resultar em erros de digitação e, consequentemente, em construtores comuns. A partir da versão 0.4.22, a palavra-chave constructor é usada para definir o construtor.
Exemplo de código do antigo estilo de construtor:
pragma solidity =0.4.21;
contract Parents {
// O construtor tem o mesmo nome do contrato (método construtor antigo)
function Parents() public {
}
}
Modificadores
Os modificadores (modifier) são exclusivos do Solidity e são semelhantes aos decoradores em programação orientada a objetos. Eles declaram características que uma função deve possuir e ajudam a reduzir a redundância de código. Os modificadores são comuns para realizar verificações antes da execução de uma função, como verificar um endereço, uma variável ou um saldo.
Vamos definir um modificador chamado onlyOwner:
// Definindo um modificador
modifier onlyOwner {
require(msg.sender == owner); // Verifica se o chamador é o owner
_; // Se for o owner, executa o corpo da função; caso contrário, reverte a transação
}
Uma função com o modificador onlyOwner só pode ser chamada pelo endereço do owner. Por exemplo:
function changeOwner(address _newOwner) external onlyOwner {
owner = _newOwner; // Apenas o owner pode chamar esta função e alterar o owner
}
Neste exemplo, a função changeOwner pode alterar o owner do contrato, mas somente o endereço original do owner pode chamar a função devido ao modificador onlyOwner. Este é um dos métodos mais comuns para controlar permissões em contratos inteligentes.
Implementação padrão de Ownable da OpenZeppelin
A OpenZeppelin mantém uma biblioteca de códigos padronizados em Solidity e sua implementação padrão do Ownable pode ser encontrada em: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
Exemplo de demonstração no Remix
Vamos considerar o arquivo Owner.sol.
-
Compile e implante o contrato no Remix.
-
Clique no botão
ownerpara ver o valor atual da variávelowner.
-
Chame a função
changeOwnercom o endereço doowner. A transação será bem-sucedida.
-
Chame a função
changeOwnercom um endereço que não é oowner. A transação falhará devido à verificação do modificadoronlyOwner.
Conclusão
Nesta palestra, apresentamos os construtores e modificadores do Solidity, usando um exemplo do contrato Ownable para ilustrar o controle de permissões em contratos inteligentes.