WEB3DEV

Cover image for Exclusão De Array Imprópria
Banana Labs
Banana Labs

Posted on

Exclusão De Array Imprópria

O que é um Array em Solidity?

Um array é uma estrutura de dados que armazena uma coleção sequencial de tamanho fixo de elementos do mesmo tipo. Um array no Solidity pode ter um tamanho fixo em tempo de compilação ou tamanho variável. Os elementos de um array de armazenamento podem ser de vários tipos.

Arrays usam índices para acessar e referenciar seus elementos. Funciona da seguinte forma:

  1. 0 (Indexação baseada em zero) A entrada inicial do array tem um índice de zero.
  2. O primeiro elemento de um array refere-se ao índice 1, conhecido como indexação baseada em um.
  3. n (Indexação Baseada em n) — O índice base de um array pode ser selecionado com base na situação.

Exclusão Imprópria De Array no Solidity

Embora a remoção de um elemento de um array no Solidity possa ser simples, existem vários componentes complexos ocultos por trás dele. No Solidity, removemos um elemento de um array usando a função “delete”. No entanto, o comprimento e a sequência do array podem não permanecer conforme o esperado. Considere o código abaixo.

pragma solidity ^0.5.1;

contract EtherRemoval{
    uint[] public firstArray = [1,2,3,4,5];
    function removeItem(uint i) public{
        delete firstArray[i];
    }
    function getLength() public view returns(uint){
        return firstArray.length;
    }
}
Enter fullscreen mode Exit fullscreen mode

Dentro do contrato, criamos um array de inteiros e as funções getLength() e removeItem().

  1. FirstArray é um array inteiro.
  2. A função RemoveItem() remove um item especificado de um índice.
  3. O comprimento do array é determinado pela função getLength().

Vamos implantar o contrato e medir o comprimento do firstArray. Ele contém cinco números dentro dele. Portanto, é óbvio que o resultado é 5. Agora, se excluirmos o índice 2 do array, veremos que o comprimento do array permanece o mesmo, apenas que o valor no índice 2 foi definido como zero.
Se consultarmos o comprimento do array novamente, veremos que o comprimento permanece constante.

Remix editor

Por que o comprimento do array permaneceu constante?

O número do array não é removido ao usar a função delete. Em outras palavras, o valor desse índice é removido e substituído por “0”. O tamanho do array permanecerá o mesmo, mas o índice 2 agora será zero. Como visto na imagem acima, o 2º índice do firstArray é chamado; ele retornou 0.

Melhores Técnicas Para Exclusão De Array Em Solidity:

A seguir estão os métodos recomendados para exclusão de array em solidity, que também são benéficos para a segurança do contrato inteligente. Em vez de “delete” e “.length=0”, use as funções push e pop para interagir com os elementos do array.

1.Podemos remover os elementos do array deslocando-os da direita para a esquerda.

function remove(uint _index) public {
    require(_index < arr.length, "index out of bound");

    for (uint i = _index; i < arr.length - 1; i++) {
        arr[i] = arr[i + 1];
    }
    arr.pop();
}
Enter fullscreen mode Exit fullscreen mode

2.Podemos remover um elemento do array copiando o último elemento para o local a ser removido.

function remove(uint index) public {
   // Mova o último elemento para o local a ser excluído
   arr[index] = arr[arr.length - 1];
   // Remova o último elemento
   arr.pop();
}
Enter fullscreen mode Exit fullscreen mode

O SolidityScan detecta a exclusão imprópria de array e protege seus contratos de mais de 100 vulnerabilidades de segurança com o clique de um botão.

SolidityScan

Conclusão:

A exclusão imprópria do array pode levar a uma lógica de negócios errônea e causar resultados inesperados. É importante excluir os arrays corretamente. O SolidityScan detecta exclusão imprópria de array e protege seus contratos. Inscreva-se para uma avaliação gratuita em https://solidityscan.com/signup


Esse artigo é uma tradução feita por @bananlabs. Você pode encontrar o artigo original aqui

Latest comments (0)