Os mappings atuam como tabelas hash que consistem em tipos de chave e pares de tipos de valores correspondentes. Eles são definidos como qualquer outro tipo de variável no Solidity:
mapping(_KeyType => _ValueType) public mappingName
Os mappings são extremamente úteis para associações e frequentemente usados para associar endereços Ethereum exclusivos a tipos de valor associados. Por exemplo, no jogo de quebra-cabeça baseado em blockchain que construímos, era necessário mapear o endereço de um usuário para o nível correspondente no jogo:
mapping(address => uint) public userLevel;
Acessando tipos de valor de um mapeamento com tipos-chave
Com esse mapeamento implementado, construímos uma função para identificar o nível atual do usuário no jogo. Aqui passamos currentLevel
um argumento para a função — ou seja, o endereço de um usuário específico — e então usamos o userLevel
mapeamento para retornar o nível associado a esse usuário no jogo:
function currentLevel(address userAddress) public constant returns (uint) {
return userLevel[userAddress];
}
Usar um mapeamento aqui é útil porque pode armazenar muitos _KeyTypes
arquivos _ValueTypes
. Neste caso, há muitos usuários jogando ao mesmo tempo e cada um deles pode ter seu próprio arquivo userLevel
.
Um valor padrão de mappings
De acordo com a documentação do Solidity , “os mappings podem ser vistos como tabelas hash que são virtualmente inicializadas de forma que todas as chaves possíveis existam e sejam mapeadas para um valor cuja representação de bytes são todos zeros.”
Essencialmente, isso significa que os mappings não têm comprimento. Eles também não têm um conceito de chave ou valor sendo definido. Só podemos usar mappings para variáveis de estado que atuam como tipos de referência de armazenamento. É então possível criar uma chamada de função getter (como public
) na qual _KeyType
é o parâmetro usado pela função getter para retornar o _ValueType
.
Vamos refletir sobre o userLevel
mapeamento do nosso jogo:
mapping(address => uint) public userLevel;
Quando userLevel
é inicializado, é feito de forma que todos os endereços Ethereum possíveis existam no mapeamento e sejam mapeados para um nível correspondente de 0. Seja o endereço MetaMask de um usuário Ethereum aleatório que talvez nunca tenha ouvido falar do nosso jogo antes, ou talvez um contrato inteligente arbitrário na blockchain Ethereum fazendo algo totalmente não relacionado, não importa. Nosso mapeamento ainda os mapeia para um nível correspondente de 0 em nosso jogo ou, mais apropriadamente, mapeia para um “valor cuja representação de bytes são todos zeros”.
Aprendizado
- Os mappings atuam como tabelas hash que consistem em tipos de chave e pares de tipos de valores correspondentes
- Os mappings são úteis porque podem armazenar
_KeyTypes
muitos_ValueTypes
- Os mappings não têm comprimento, nem um conceito de chave ou valor sendo definido
- Os mappings só podem ser usados para variáveis de estado que atuam como tipos de referência de armazenamento
- Quando os mappings são inicializados, todas as chaves possíveis existem nos mappings e são mapeadas para valores cujas representações de bytes são todas zeros
Artigo original publicado por Doug Crescenzi.
Latest comments (0)