Aula 013: Tipo de Endereço em Solidity
Nesta aula, vamos nos aprofundar no tipo address
em Solidity, um dos tipos de dados mais fundamentais usados em contratos inteligentes Ethereum. Compreender endereços é crucial, pois eles são usados para rastrear contas, contratos e várias interações na blockchain Ethereum.
O que é um Endereço?
Em Solidity, o tipo address
é usado para representar endereços Ethereum. Ele pode apontar para a conta de um usuário ou um contrato implantado na blockchain Ethereum. Um endereço Ethereum é um valor de 20 bytes (40 caracteres hexadecimais) que identifica de forma única uma conta ou um contrato.
Declarando um Endereço
Você pode declarar uma variável de endereço em Solidity da seguinte forma:
pragma solidity ^0.8.0;
contract ExemploEndereco {
address public proprietario;
constructor() {
proprietario = msg.sender; // Armazena o endereço do implantador
}
}
Neste exemplo, declaramos uma variável pública proprietario
do tipo address
e a inicializamos com o endereço da conta que implantou o contrato, utilizando msg.sender
.
Funções de Endereço
Solidity fornece várias funções embutidas que podem ser usadas com tipos de endereço:
- Transferir Ether: Você pode enviar Ether de um endereço para outro.
- Chamadas de Contrato: Você pode interagir com outros contratos inteligentes enviando chamadas para seus endereços.
- Verificação de Saldo: Você pode verificar o saldo de um endereço.
Enviando Ether
Você pode enviar Ether para outro endereço usando o método transfer
, que está disponível para todos os tipos de endereço. Aqui está um exemplo de um contrato simples que permite ao proprietário enviar Ether para um usuário.
pragma solidity ^0.8.0;
contract TransferenciaEther {
address payable public proprietario;
constructor() {
proprietario = payable(msg.sender); // Converte msg.sender para um endereço pagável
}
function enviarEther(address payable destinatario, uint256 quantia) public {
require(msg.sender == proprietario, "Apenas o proprietário pode enviar Ether");
require(address(this).balance >= quantia, "Saldo insuficiente no contrato");
destinatario.transfer(quantia); // Transfere a quantia especificada para o destinatario
}
// Permite que o contrato receba Ether
receive() external payable {}
}
Neste contrato:
- O proprietário pode enviar Ether para endereços
destinatario
. - A função
enviarEther
verifica se o chamador é o proprietário e se o contrato possui saldo suficiente antes de transferir a quantia especificada.
Verificando Saldo
Você também pode verificar o saldo de um endereço usando a propriedade .balance
. Aqui está um exemplo demonstrando como verificar saldos.
pragma solidity ^0.8.0;
contract VerificadorSaldo {
function obterSaldo(address conta) public view returns (uint256) {
return conta.balance; // Retorna o saldo do endereço especificado
}
}
Neste contrato simples:
- A função
obterSaldo
retorna o saldo de Ether do endereçoconta
especificado.
Interagindo com Outros Contratos
Você também pode usar o tipo de endereço para interagir com outros contratos, chamando suas funções. Veja como você pode fazer isso usando uma interface.
pragma solidity ^0.8.0;
interface IToken {
function transfer(address destinatario, uint256 quantia) external returns (bool);
}
contract InteracaoToken {
function enviarTokens(address enderecoToken, address destinatario, uint256 quantia) public {
IToken contratoToken = IToken(enderecoToken); // Cria uma instância do contrato token
contratoToken.transfer(destinatario, quantia); // Chama o método transfer
}
}
Neste exemplo:
- Definimos uma interface
IToken
que declara uma funçãotransfer
. - A função
enviarTokens
recebe o endereço de um contrato token, o endereço do destinatário e a quantia a ser transferida. Ela cria uma instância do contrato token e chama a funçãotransfer
nele.
Conclusão
O tipo address
é um tipo de dado fundamental em Solidity que permite gerenciar contas e interagir com contratos. Você aprendeu como declarar um endereço, enviar Ether, verificar saldos e interagir com outros contratos. Compreender como trabalhar com endereços é vital para desenvolver aplicações descentralizadas na Ethereum.
Agora que você tem uma compreensão sólida do tipo address
, pode começar a aplicar esse conhecimento para construir contratos inteligentes mais complexos!