Lição: 035: Mapeamentos Aninhados em Solidity
Em Solidity, mapeamentos são uma estrutura de dados fundamental utilizada para associar chaves únicas com valores. Embora os mapeamentos básicos sejam bastante simples, os mapeamentos aninhados possibilitam relações de dados complexas que são essenciais para a construção de contratos inteligentes mais avançados. Nesta aula, vamos explorar como usar mapeamentos aninhados em Solidity, incluindo exemplos práticos.
O que são Mapeamentos?
Antes de mergulharmos nos mapeamentos aninhados, é importante entender os fundamentos de um mapeamento. Um mapeamento em Solidity pode ser pensado como uma tabela hash. A sintaxe para declarar um mapeamento é a seguinte:
mapping(tipoChave => tipoValor) public meuMapa;
Por exemplo:
mapping(endereco => uint) public saldos;
Este mapeamento associa um endereço Ethereum a um saldo correspondente.
Mapeamentos Aninhados
Mapeamentos aninhados são essencialmente mapeamentos de mapeamentos. Isso permite criar relações mais sofisticadas associando um mapeamento a outro. A sintaxe geral para um mapeamento aninhado se parece com isto:
mapping(tipoChave1 => mapping(tipoChave2 => tipoValor)) public meuMapaAninhado;
Exemplo de Mapeamentos Aninhados
Vamos considerar um exemplo prático onde queremos criar um contrato para gerenciar as notas de alunos. Teremos um mapeamento que associa endereços de alunos às suas notas por disciplina.
Aqui está como definir um mapeamento aninhado para esse caso:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Escola {
// Mapeamento aninhado: endereco => (disciplina => nota)
mapping(address => mapping(string => uint8)) private notas;
// Função para atribuir uma nota a um aluno em uma disciplina específica
function atribuirNota(address aluno, string memory disciplina, uint8 nota) public {
require(nota <= 100, "Nota deve estar entre 0 e 100");
notas[aluno][disciplina] = nota;
}
// Função para obter a nota de um aluno em uma disciplina específica
function obterNota(address aluno, string memory disciplina) public view returns (uint8) {
return notas[aluno][disciplina];
}
}
Explicação do Exemplo
-
Declaração do Mapeamento:
mapping(address => mapping(string => uint8)) private notas;
cria um mapeamento aninhado onde cada aluno (identificado pelo seu endereço) tem um mapeamento para suas notas em várias disciplinas.
-
Atribuindo Notas:
- A função
atribuirNota
aceita o endereço de um aluno, a disciplina e a nota. Ela garante que a nota esteja dentro de um intervalo válido (0-100) e a atribui à posição relevante no mapeamento aninhado.
- A função
-
Recuperando Notas:
- A função
obterNota
permite que qualquer pessoa consulte a nota de um aluno em uma disciplina específica fornecendo o endereço do aluno e o nome da disciplina.
- A função
Vantagens dos Mapeamentos Aninhados
-
Estruturas de Dados Complexas: Mapeamentos aninhados possibilitam a criação de relações de dados complexas, que podem ser muito úteis para aplicações específicas, como associações em várias camadas (por exemplo, em jogos, educação, etc.).
-
Armazenamento Eficiente: Mapeamentos são eficientes em termos de custos de gás porque não armazenam entradas vazias, e mapeamentos aninhados podem ajudar a manter os dados organizados sem inchar.
Considerações
-
Custos de Gás: Operações em mapeamentos são relativamente baratas, mas mapeamentos aninhados podem aumentar os custos de gás devido à complexidade da recuperação de dados.
-
Visibilidade dos Dados: Cuidado com o acesso aos dados. Mapeamentos não são iteráveis em Solidity, o que significa que você não pode percorrê-los nativamente. Você precisa gerenciar o rastreamento das chaves separadamente se precisar iterar.
Conclusão
Nesta aula, aprendemos sobre mapeamentos aninhados em Solidity, como funcionam e como podem ser aplicados em cenários do mundo real, como a gestão das notas de alunos. Mapeamentos aninhados são uma ferramenta poderosa no desenvolvimento de contratos inteligentes que podem ajudar a organizar relações complexas. À medida que você constrói contratos mais avançados, dominar mapeamentos aninhados aumentará significativamente sua capacidade de gerenciar e estruturar dados de maneira eficaz.