Recentemente tenho revisitado o Solidity para reforçar os detalhes e estou escrevendo uma "Introdução Super Simples ao Solidity" para ajudar os iniciantes (os experts em programação podem procurar outros tutoriais), com atualizações semanais de 1 a 3 palestras.
Twitter: @0xAA_Science
Comunidade: Discord | Grupo no WeChat | Site oficial wtf.academy
Todo o código e tutoriais são open source no GitHub: github.com/AmazingAng/WTF-Solidity
Nesta palestra, vamos apresentar dois tipos de variáveis importantes em Solidity: arrays (arrays) e structs (estruturas).
Arrays (arrays) são um tipo de variável comum no Solidity, usada para armazenar um conjunto de dados (números inteiros, bytes, endereços, etc.). Os arrays podem ser de comprimento fixo ou de comprimento variável:
-
Arrays de comprimento fixo: o comprimento do array é especificado ao declarar. Declarados no formato
T[k]
, ondeT
é o tipo dos elementos ek
é o comprimento, por exemplo:// Array de comprimento fixo uint[8] array1; bytes1[5] array2; address[100] array3;
-
Arrays de comprimento variável (arrays dinâmicos): o comprimento do array não é especificado ao declarar. Declarados no formato
T[]
, ondeT
é o tipo dos elementos, por exemplo:// Array de comprimento variável uint[] array4; bytes1[] array5; address[] array6; bytes array7;
Nota:
bytes
é um caso especial, é um array, mas não utiliza[ ]
. Além disso, não é possível declarar um array de um único byte usandobyte[]
, você pode usarbytes
oubytes1[]
em vez disso.bytes
é mais econômico em termos de gas do quebytes1[]
.
Existem algumas regras a serem seguidas ao criar arrays no Solidity:
-
Para
arrays dinâmicos
com modificadoresmemory
, você pode usar o operadornew
para criar, mas é necessário declarar o comprimento e uma vez declarado, o comprimento não pode ser alterado. Por exemplo:// Arrays dinâmicos de memória uint[] memory array8 = new uint[](5); bytes memory array9 = new bytes(9);
-
Arrays literais são expressões de array escritas entre colchetes para inicializar o array, e o tipo de cada elemento é determinado pelo tipo do primeiro elemento. Por exemplo, em
[1,2,3]
, todos os elementos são do tipouint8
, porque no Solidity, se um valor não tem um tipo especificado, o tipo padrão é o tipo mínimo desse tipo, e o tipo mínimo parauint
éuint8
. Enquanto em[uint(1),2,3]
, todos os elementos são do tipouint
, porque o primeiro elemento definiu o tipo comouint
.No exemplo abaixo, se a conversão para
uint
não for feita no array passado para a funçãog()
, um erro será gerado.// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.16 <0.9.0; contract C { function f() public pure { g([uint(1), 2, 3]); } function g(uint[3] memory _data) public pure { // ... } }
-
Se você está criando um array dinâmico, você precisa atribuir os elementos um por um.
uint[] memory x = new uint[](3); x[0] = 1; x[1] = 3; x[2] = 4;
length
: Um array possui um membrolength
que indica o número de elementos. O comprimento de um array em memória é fixo após a criação.push()
: Arrays dinâmicos têm o membropush()
, que permite adicionar um novo elemento0
ao final do array e retorna uma referência para o novo elemento.push(x)
: Arrays dinâmicos possuem o membropush(x)
, que permite adicionar o elementox
ao final do array.pop()
: Arrays dinâmicos possuem o membropop()
, que remove o último elemento do array.
Exemplo:
O Solidity suporta a definição de novos tipos através da construção de structs. Os elementos de uma struct podem ser de tipos primitivos ou de tipos de referência; structs podem ser elementos de arrays ou mapeamentos. A criação de uma struct é feita da seguinte forma:
// Struct
struct Student {
uint256 id;
uint256 score;
}
Student student; // Inicialização de uma struct Student
Há quatro maneiras de atribuir valores a uma struct:
// Atribuir valores a uma struct
// Método 1: Criar uma referência struct storage dentro da função
function initStudent1() external {
Student storage _student = student; // atribuir uma cópia da struct student
_student.id = 11;
_student.score = 100;
}
Exemplo:
// Método 2: Atribuir diretamente a struct de variável de estado
function initStudent2() external {
student.id = 1;
student.score = 80;
}
Exemplo:
// Método 3: Construtor
function initStudent3() external {
student = Student(3, 90);
}
Exemplo:
// Método 4: Chave-valor
function initStudent4() external {
student = Student({id: 4, score: 60});
}
Exemplo:
Nesta palestra, apresentamos os conceitos básicos de arrays (arrays) e structs (estruturas) em Solidity. Na próxima palestra, abordaremos mapas (mappings) em Solidity.