WEB3DEV

Cover image for Strings com Solidity
Adriano P. Araujo
Adriano P. Araujo

Posted on

Strings com Solidity

“ String ” é um tipo de dado em solidity, que diferentemente dos outros tipos de dados ( uint256, bool, etc. ), pode ser complicado de usar.

Como em algumas outras linguagens de programação, strings em solidity são consideradas tipos de referência, na verdade, poderíamos dizer que as strings em solidity são apenas “bytes” sofisticados , que é uma matriz ilimitada de bytes.

Listarei certas peculiaridades e truques relacionados às strings em solidity que podem ser úteis em determinadas situações.

Introdução

String é um tipo de referência em solidity, o que significa que, quando você define uma string, precisa especificar sua localização ( a menos que seja uma variável de estado ) de : armazenamento, memória ou calldata.

Eles só podem conter caracteres ASCII imprimíveis ( entre 0x20 e 0x7E ) e devem ser incluídos entre aspas duplas ou simples.

As strings literais suportam caracteres de escape especiais( que também se traduzem na representação hexadecimal correspondente de ASCII ):

  • \<newline>( pula uma nova linha à partir da atual )

  • \\ ( barra invertida ) : 0x5c

  • \' (aspas simples ) : 0x27

  • \" ( aspas duplas ) : 0x22

  • \n ( nova linha ) : 0x0a

  • \r ( retorno da linha atual ) : 0x0d

  • `\tv ( tab ) : 0x09

  • \xNN( escape hexagonal, pega um valor hexadecimal e insere o byte apropriado )

  • \uNNNN( escape de unicode, pega um ponto de código Unicode e insere uma sequência UTF-8 )

Nos bastidores, as strings são realmente bytes que não permitem acesso do índice ou de seu comprimento, por outro lado, o solidity permite transformar facilmente um tipo de dados no outro.

Cada caractere  em uma sequência leva 1 byte ( sua representação ASCII ) e os caracteres são adicionados ao final da matriz de bytes que suporta a string. Por exemplo, a sequência “abcd” corresponderia em  bytes a “0x61626364” ( a = 0x61, b = 0x62, ... ).

Operações de string

É importante observar que, na maioria dos casos, é preferível usar bytes em vez de strings porque, como você verá abaixo, operações relacionadas a strings geralmente envolvem transformar strings em bytes e manipular a matriz de bytes antes de transformá-la novamente em uma string. Essas operações podem consumir muito gas, e é por isso que devem ser evitadas, se possível, talvez realizando-as fora da cadeia….

As operações descritas abaixo serão implementadas usando solidity, certamente existem outras maneiras de implementá-las, algumas podem ser mais eficientes em termos de gas, especialmente se você usar assembly, mas está além do escopo deste blog.

Vou apenas listar algumas das operações relacionadas a strings mais comuns, que em outras linguagens de programação podem ser executadas simplesmente invocando uma função predefinida.

  • Concatenação

  • Comparando duas strings

  • Comprimento da string

  • Obter o char na posição P

  • Extrair substring da posição P e comprimento L

  • Substituir a substring na posição P

  • Inverter string

  • Encontre a posição inicial da substring

Concatenação

A partir da solidity 0.8.12, você pode usar a função “string.concat ( s1, s2,... )” para concatenar strings.

Mas isso não era possível antes, se você precisasse concatenar duas strings, teria que transformá-las implicitamente em bytes, embalá-las como qualquer outra matriz de bytes, depois transformá-las em uma sequência novamente “string ( abi.encodePacked ( s1, s2, ... ) )”.

Comparar duas strings

Se você precisar comparar duas strings, precisará calcular o hash ( usando “ keccak256 ” ) de sua matriz de bytes e compará-los.

Comprimento

Para obter o número de caracteres em uma sequência, você precisará transformá-lo em uma matriz de bytes primeiro.

Char na posição

Você pode retornar o caractere na posição P da sequência S. Assim como em todas as operações anteriores, você terá que transformar sua string em uma matriz de bytes, extrair o byte na posição P, atribuir o byte extraído a uma nova matriz de bytes, depois transformar a matriz de bytes em uma sequência.

Apenas certifique-se de que a posição P esteja dentro do intervalo S da sequência.

Substring

Retorno de uma substring começando na posição P e comprimento L. Você terá que ter cuidado se P + L for maior que o comprimento da string original.

Substituir na posição

Substituir a substring começando na posição P de uma determinada sequência é muito semelhante ao retorno da substring começando na posição P da string.

A única diferença é que você também precisará transformar a nova substring em uma matriz de bytes e fazer a substituição antes de transformar a matriz original em uma string novamente.

Você só precisará ter cuidado, se quiser permitir que a sequência retornada seja maior que a original ou não.

O comprimento original da string não pode ser estendido

Se você deseja que a nova sequência seja potencialmente mais longa que a original, precisará usar uma matriz auxiliar e definir seu comprimento.

Inverter

Assim como nas operações anteriores, precisaremos de uma matriz auxiliar para o retorno. Desta vez, a matriz auxiliar e a matriz original ( da sequência original ) têm o mesmo comprimento.

Encontre a posição da substring

Essa é de longe a função que consome mais gas, inclui alguns loops ( for e while ), e provavelmente pode ser melhorado, mas funciona se você estiver lidando com strings pequenas.

Junte-se a Coinmonks no telegram e YouTube aprenda sobre comércio e investimento de crypto

Leia também


Este artigo foi escrito por Alberto Molina  e traduzido por Adriano P. de Araujo. O original em inglês pode ser encontrado aqui.

Latest comments (0)