SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
15.11.2024

Aula 032: Estruturas em Solidity

Nesta aula, vamos explorar as estruturas em Solidity, uma maneira poderosa de agrupar tipos de dados relacionados em uma única entidade. As estruturas são particularmente úteis nos contratos inteligentes do Ethereum, onde muitas vezes é necessário gerenciar estruturas de dados complexas.

O que é uma Estrutura?

Uma estrutura (abreviação de "estrutura") é um tipo de dado personalizado que permite combinar várias variáveis de diferentes tipos de dados em uma única unidade. Isso ajuda a organizar dados relacionados, tornando seus contratos inteligentes mais claros e fáceis de entender.

Definindo uma Estrutura

Para definir uma estrutura em Solidity, você usa a palavra-chave struct seguida pelo nome da estrutura e pelas propriedades que ela contém. Aqui está a sintaxe:

struct NomeDaEstrutura {
    tipoDeDado1 propriedade1;
    tipoDeDado2 propriedade2;
    // ... adicione mais propriedades conforme necessário
}

Exemplo: Definindo uma Estrutura

Vamos criar uma estrutura simples para representar um Livro.

pragma solidity ^0.8.0;

contract Biblioteca {
    struct Livro {
        string titulo;
        string autor;
        uint256 anoPublicacao;
        bool disponivel;
    }
}

Neste exemplo, a estrutura Livro contém quatro propriedades: titulo, autor, anoPublicacao e disponivel.

Usando Estruturas

Armazenando Estruturas

Você pode armazenar estruturas em variáveis de estado, arrays ou mapeamentos. Vamos ver como usar nossa estrutura Livro em um contrato.

pragma solidity ^0.8.0;

contract Biblioteca {
    struct Livro {
        string titulo;
        string autor;
        uint256 anoPublicacao;
        bool disponivel;
    }

    Livro[] public livros;

    function adicionarLivro(string memory _titulo, string memory _autor, uint256 _anoPublicacao) public {
        Livro memory novoLivro = Livro({
            titulo: _titulo,
            autor: _autor,
            anoPublicacao: _anoPublicacao,
            disponivel: true
        });

        livros.push(novoLivro);
    }
}

Neste exemplo, temos um array de estruturas Livro chamado livros. A função adicionarLivro nos permite criar uma nova instância de Livro e adicioná-la ao array livros.

Acessando Propriedades da Estrutura

Você pode acessar as propriedades de uma estrutura usando a notação de ponto. Vamos adicionar uma função para recuperar os detalhes de um livro pelo seu índice.

pragma solidity ^0.8.0;

contract Biblioteca {
    struct Livro {
        string titulo;
        string autor;
        uint256 anoPublicacao;
        bool disponivel;
    }

    Livro[] public livros;

    function adicionarLivro(string memory _titulo, string memory _autor, uint256 _anoPublicacao) public {
        Livro memory novoLivro = Livro({
            titulo: _titulo,
            autor: _autor,
            anoPublicacao: _anoPublicacao,
            disponivel: true
        });

        livros.push(novoLivro);
    }

    function obterLivro(uint256 indice) public view returns (string memory, string memory, uint256, bool) {
        Livro memory livro = livros[indice];
        return (livro.titulo, livro.autor, livro.anoPublicacao, livro.disponivel);
    }
}

Na função obterLivro, recuperamos uma estrutura Livro do array livros e retornamos suas propriedades.

Atualizando Propriedades da Estrutura

Você também pode atualizar as propriedades de uma estrutura acessando-as diretamente. Veja como implementar uma função para marcar um livro como indisponível:

pragma solidity ^0.8.0;

contract Biblioteca {
    struct Livro {
        string titulo;
        string autor;
        uint256 anoPublicacao;
        bool disponivel;
    }

    Livro[] public livros;

    function adicionarLivro(string memory _titulo, string memory _autor, uint256 _anoPublicacao) public {
        Livro memory novoLivro = Livro({
            titulo: _titulo,
            autor: _autor,
            anoPublicacao: _anoPublicacao,
            disponivel: true
        });

        livros.push(novoLivro);
    }

    function marcarComoIndisponivel(uint256 indice) public {
        require(indice < livros.length, "Índice do livro fora dos limites");
        livros[indice].disponivel = false;
    }
}

Na função marcarComoIndisponivel, usamos a declaração require para garantir que o índice fornecido esteja dentro dos limites antes de atualizar a propriedade disponivel do respectivo Livro.

Conclusão

As estruturas em Solidity fornecem uma maneira poderosa de agrupar dados relacionados a uma entidade comum, tornando seus contratos inteligentes mais fáceis de gerenciar e mais legíveis. Com o conhecimento adquirido nesta aula, você deve ser capaz de criar e manipular estruturas de forma eficaz em seus contratos Solidity.

Boa programação!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!