Skip to content

Latest commit

 

History

History
 
 

17_Library

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
title tags
17. Contrato de Biblioteca
solidity
avançado
wtfacademy
biblioteca
usando para

WTF Introdução Simples ao Solidity: 17. Contrato de Biblioteca - Ficando nos ombros de gigantes

Recentemente, tenho estudado Solidity novamente para consolidar alguns detalhes e escrever um "WTF Introdução Simples ao Solidity" para iniciantes (programadores experientes podem procurar outros tutoriais). Serão lançadas de 1 a 3 aulas por semana.

Twitter: @0xAA_Science

Comunidade: DiscordGrupo do WeChatSite oficial wtf.academy

Todo o código e tutoriais estão disponíveis no GitHub: github.com/AmazingAng/WTF-Solidity


Nesta aula, vamos usar o contrato de biblioteca String referenciado pelo ERC721 para explicar os contratos de biblioteca (Library) no Solidity e resumir as bibliotecas mais comumente usadas.

Contratos de Biblioteca

Contratos de biblioteca são um tipo especial de contrato que existe para aumentar a reutilização de código no Solidity e reduzir o consumo de gás. Contratos de biblioteca são uma coleção de funções criadas por especialistas ou pelos desenvolvedores de um projeto. Nós apenas precisamos ficar nos ombros de gigantes e saber como usá-los.

Contratos de Biblioteca: Ficando nos ombros de gigantes

Eles têm algumas diferenças em relação aos contratos normais:

  1. Não podem ter variáveis de estado
  2. Não podem ser herdados nem herdar outros contratos
  3. Não podem receber Ether
  4. Não podem ser destruídos

Contrato de Biblioteca String

O contrato de biblioteca String é uma biblioteca de código que converte um tipo uint256 em seu equivalente em string. O código de exemplo é o seguinte:

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) public pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) public pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) public pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Ele contém principalmente duas funções: toString(), que converte uint256 em string, e toHexString(), que converte uint256 em sua representação hexadecimal em string.

Como usar contratos de biblioteca

Vamos usar a função toHexString() do contrato de biblioteca String para demonstrar duas maneiras de usar as funções de um contrato de biblioteca.

  1. Usando a instrução using for

    A instrução using A for B; pode ser usada para anexar uma biblioteca (A) a qualquer tipo (B). Após adicionar a instrução, as funções da biblioteca A serão automaticamente adicionadas como membros da variável do tipo B e podem ser chamadas diretamente. Observe que, ao chamar a função, essa variável será passada como o primeiro parâmetro:

    // Usando a instrução using for
    using Strings for uint256;
    function getString1(uint256 _number) public pure returns(string memory){
        // As funções do contrato de biblioteca serão automaticamente adicionadas como membros da variável uint256
        return _number.toHexString();
    }
  2. Chamando a função pelo nome da biblioteca

    // Chamando a função diretamente pelo nome da biblioteca
    function getString2(uint256 _number) public pure returns(string memory){
        return Strings.toHexString(_number);
    }

Vamos implantar o contrato e testar com o valor 170, ambas as formas retornarão a string hexadecimal correta "0xaa". Isso prova que chamamos com sucesso o contrato de biblioteca!

Chamando o contrato de biblioteca com sucesso

Conclusão

Nesta aula, usamos o contrato de biblioteca String, referenciado pelo ERC721, para explicar os contratos de biblioteca (Library) no Solidity. 99% dos desenvolvedores não precisam escrever seus próprios contratos de biblioteca, apenas precisam saber quando usar um contrato de biblioteca escrito por especialistas. Alguns dos mais comumente usados são:

  1. String: converte uint256 em String
  2. Address: verifica se um endereço é um contrato
  3. Create2: uso mais seguro da opcode Create2 do EVM
  4. Arrays: biblioteca relacionada a arrays.