---
title: "O que é mapping em Solidity?"
description: "Aprenda como funciona mapping em Solidity"
---

# O que é mapping em Solidity?

Mappings em [Solidity](https://www.alchemy.com/overviews/solidity) são tabelas hash que armazenam dados como pares chave-valor, onde a chave pode ser qualquer um dos tipos de dados nativos suportados pela Ethereum. Mappings são um conceito fundamental para entender ao [aprender desenvolvimento em Solidity](https://www.alchemy.com/overviews/learn-solidity).

Este artigo explica o que são mappings, como funcionam, as diferenças entre mappings e arrays, e apresenta exemplos de mappings para que você possa desenvolver os melhores smart contracts na Ethereum e em blockchains compatíveis com Solidity, como Optimism e Arbitrum.

## **O que é uma tabela hash?**

Uma tabela hash é uma estrutura de dados que armazena dados de forma associativa. Os dados são mantidos em formato de array em uma tabela hash, com cada valor de dado tendo seu próprio valor de índice único. Tabelas hash usam um array como meio de armazenamento e empregam a técnica de hash para estabelecer um índice a partir do qual um elemento será inserido ou localizado.

<ImageBlock
  src="https://media.alchemy.com/1703922693-mapping-in-solidity.png"
  alt="Mappings em Solidity Explicado por Doug Crescenzi"
  width={429}
  height={329}
  caption="Fonte: Mappings em Solidity Explicado por Doug Crescenzi"
/>

Quando o índice do dado necessário é conhecido, ele pode ser retornado extremamente rápido. Como resultado, tabelas hash são estruturas de dados nas quais as operações de inserção e busca são extremamente rápidas, independentemente da quantidade de dados.

## **O que é mapping em Solidity?**

Mapping é uma tabela hash em Solidity que armazena dados como pares chave-valor, onde a chave pode ser qualquer um dos tipos de dados nativos, excluindo tipos de referência, e o valor do tipo de dado pode ser qualquer tipo.

Mappings são geralmente usados em Solidity e na blockchain Ethereum para conectar um endereço Ethereum único a um valor correspondente.

Em qualquer outra linguagem de programação, um mapping equivale a um dicionário.

### Qual é a diferença entre tabelas hash e mappings em Solidity?

Mappings funcionam como tabelas hash, com pares de tipos de chave e tipos de valor correspondentes, e são valiosos porque podem conter um grande número de **\_KeyTypes** para **\_ValueTypes**. Mappings não têm comprimento, nem têm o conceito de definir uma chave ou um valor. Mappings só se aplicam a variáveis de estado que servem como tipos de referência de armazenamento. Quando mappings são inicializados, eles incluem todas as chaves possíveis, mapeadas para valores cuja representação em bytes é toda zero.

Mappings são definidos em Solidity da mesma forma que qualquer outro tipo de variável:

### Qual é a diferença entre arrays e mappings em Solidity?

[**Arrays em Solidity**](https://www.alchemy.com/overviews/solidity-arrays) são melhores para iterar por um grupo de dados (por exemplo, usando um loop for), em comparação com mappings, que são melhores quando você consegue obter valores com base em uma chave conhecida (ou seja, você não precisa percorrer os dados).

Como iterar sobre um array em Solidity pode ser caro em comparação com buscar dados em mappings, e os desenvolvedores podem querer armazenar tanto um valor quanto sua chave dentro de um smart contract, às vezes os desenvolvedores criam um array de chaves que serve como referência para dados que podem então ser recuperados de dentro de um mapping.

Desenvolvedores nunca devem deixar um array em Solidity crescer demais, pois iterar por um array grande pode custar mais em taxas de gas em Solidity do que o valor da transação, tornando os mappings uma implementação de smart contract [mais eficiente em termos de gas](https://www.alchemy.com/overviews/solidity-gas-optimization).

**Aqui estão algumas características adicionais sobre mappings:**

- Mappings não têm comprimento.
- Mappings também não entendem o conceito de uma chave ou um valor sendo definidos.
- Mappings só podem ser usados para variáveis de estado que servem como tipos de referência de armazenamento.

## **O que é um nested mapping?** 

Nested mapping é um mapping de um mapping para outro. Por exemplo, se tivermos um nome de usuário e uma idade e quisermos armazenar essa informação com a ajuda de um ID especial, de modo que outros só possam obtê-la com o auxílio desse ID, isso é conhecido como double mapping em Solidity.

Aqui está um exemplo de nested mapping:

Neste contrato, construímos um nested mapping, chamado de User. Nesse mapping, ligamos dois mappings:

1. um para registrar a informação sobre o id do usuário específico
1. um para armazenar o nome e a idade do usuário específico.

O bloco de código abaixo é uma função getter simples, que retorna informações do usuário.

## **Como usar mappings em Solidity**

Aqui está um exemplo de uso de mappings em Solidity. As funções do trecho de código a seguir são:

- Mapping de address para uint, garantindo que o mapping sempre retorne um valor
- Se o valor nunca foi definido, ele retornará o valor padrão.
- Atualizar o valor no endereço mapeado
- Redefinir o valor para o valor padrão.
- Criar um nested mapping de address para outro mapping
- Obter valores de um nested mapping mesmo quando ele não foi inicializado

## **Exemplos de mapping em Solidity**

Aqui estão três exemplos de mappings em Solidity:

1. Saldos de tokens ERC20
1. Uso de lógica booleana
1. Consulta de membros de uma DAO

### **1. Saldos de usuários ERC20**

Este trecho de código mapeia endereços de usuários com seus respectivos saldos ERC20.

### **2. Exemplo de mapping bool em Solidity**

Este trecho de código foi projetado para listar nomes de candidatos e retornar quantos votos cada candidato recebeu. Este exemplo tem casos de uso em [DAOs](https://www.alchemy.com/dapps/top/daos), onde espera-se que os membros votem em decisões organizacionais.

### **3. É membro (DAOs)**

Este exemplo é do smart contract da Dominion DAO, que mapeia _raisedProposals_, _stakeholderVotes_, _votedOn_, _contributors_ e _stakeholders_.

Este exemplo de código lista campos para duas [structs em Solidity](https://www.alchemy.com/overviews/solidity-struct): _ProposalStruct_ e _VotedStruct_.

## **Mapping de string em Solidity**

Vamos tentar adicionar alguns valores ao mapping enquanto ele é construído, para melhor entendimento. No exemplo a seguir, nós:

- Criamos um contrato
- Definimos uma estrutura
- Declaramos diferentes elementos da estrutura
- Criamos um mapping
- Adicionamos valores ao mapping

## **FAQs sobre mapping em Solidity**

Aqui estão algumas perguntas frequentes sobre mappings em Solidity:

1. Qual é o comprimento de um mapping em Solidity?
1. Quais são os valores padrão dos mappings em Solidity?
1. Como você pode ver mappings em Solidity publicamente?

### **Qual é o comprimento de um mapping em Solidity?**

**Mappings não têm comprimento. Os dados de uma chave não são salvos em um mapping, mas sim seu hash keccak256** é usado para armazenar o valor ao qual os dados da chave se referem. Não existe o conceito de uma chave e um valor "por si só".

### **Quais são os tipos de valores padrão de mapping em Solidity?**

Aqui estão os tipos de valores padrão para mappings em Solidity:

- **int/uint** - tipo de chave = sim; tipo de valor = sim
- **string** - tipo de chave = sim; tipo de valor = sim
- **byte/bytes** - tipo de chave = sim; tipo de valor = sim
- **address** - tipo de chave = sim; tipo de valor = sim
- **struct** - tipo de chave = não; tipo de valor = sim
- **mapping** - tipo de chave = não; tipo de valor = sim
- **enum** - tipo de chave = não; tipo de valor = sim
- **contract** - tipo de chave = não; tipo de valor = sim
- **array de tamanho fixo** - tipo de chave = sim; tipo de valor = sim
- **array de tamanho dinâmico** - tipo de chave = não; tipo de valor = sim
- **array multidimensional** - tipo de chave = não; tipo de valor = sim
- **variable** - tipo de chave = não; tipo de valor = não

### **Como ver mappings em Solidity publicamente?**

Como [a propriedade é pública](https://www.alchemy.com/overviews/solidity-function-visibility), você pode usar a função getter criada pelo **compilador Solidity** para acessá-la.
