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.
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çãoconstructor
é 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 {
}
}
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.
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
Vamos considerar o arquivo Owner.sol
.
-
Compile e implante o contrato no Remix.
-
Clique no botão
owner
para ver o valor atual da variávelowner
. -
Chame a função
changeOwner
com o endereço doowner
. A transação será bem-sucedida. -
Chame a função
changeOwner
com um endereço que não é oowner
. A transação falhará devido à verificação do modificadoronlyOwner
.
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.