WEB3DEV

ViniBlack
ViniBlack

Posted on • Originalmente publicado em Medium

Mappings em Solidity explicados em menos de dois minutos

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
Enter fullscreen mode Exit fullscreen mode

exemplo de tabela hash

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;
Enter fullscreen mode Exit fullscreen mode

Mapping 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];
}
Enter fullscreen mode Exit fullscreen mode

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;

Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)