Pular para o conteúdo principal
Change page

Biblioteca de contratos inteligentes

Última edição: @guilhermevendramini(opens in a new tab), 19 de janeiro de 2024

Você não precisa escrever todos os contratos inteligentes em seu projeto a partir do zero. Há muitas bibliotecas de contratos inteligentes de código aberto disponíveis que fornecem blocos de construção reutilizáveis para o seu projeto que podem evitar que você tenha que reinventar a roda.

Pré-Requisitos

Antes de entrar em bibliotecas de contratos inteligentes, é uma boa ideia ter uma boa compreensão da estrutura de um contrato inteligente. Vá até a anatomia do contrato inteligente se você ainda não fez isso.

O que há em uma biblioteca

Geralmente, você pode encontrar dois tipos de blocos de construção em bibliotecas de contratos inteligentes: comportamentos reutilizáveis podem ser adicionados aos seus contratos, e a implementação de várias normas.

Comportamentos

Ao escrever contratos inteligentes, há uma boa chance de você escrever padrões semelhantes repetidamente, como atribuir um endereço de administrador _ para realizar operações protegidas em um contrato, ou adicionando um botão de emergência _pause em caso de um problema inesperado.

As bibliotecas inteligentes de contratos geralmente fornecem implementações reutilizáveis destes comportamentos como bibliotecas(opens in a new tab) ou via herança(opens in a new tab) em Solidity.

Como exemplo, a seguir é uma versão simplificada do contrato próprio(opens in a new tab) da biblioteca de contratos OpenZeppelin(opens in a new tab), que concebe um endereço como proprietário de um contrato e fornece um modificador para restringir o acesso a um método apenas para esse proprietário.

1contract Ownable {
2 address public owner;
3
4 constructor() internal {
5 owner = msg.sender;
6 }
7
8 modifier onlyOwner() {
9 require(owner == msg.sender, "Ownable: caller is not the owner");
10 _;
11 }
12}
Exibir tudo
Copiar

Para usar um bloco de construção como esse no seu contrato, você precisa primeiro importá-lo, e depois integrá-lo nos seus próprios contratos. Isso permitirá que você use o modificador fornecido pelo contrato base Ownable para proteger suas próprias funções.

1import ".../Ownable.sol"; // Caminho para a library importada
2
3contract MyContract is Ownable {
4 // A seguinte função só pode ser chamada pelo proprietário
5 function secured() onlyOwner public {
6 msg.sender.transfer(1 ether);
7 }
8}
Copiar

Outro exemplo popular é o SafeMath(opens in a new tab) ou DsMath(opens in a new tab). Estas são bibliotecas (em oposição aos contratos base) que fornecem as funções aritméticas com verificações de excesso de fluxo, que não são fornecidas pela linguagem. É uma boa prática usar uma dessas bibliotecas em vez de operações aritméticas para proteger seu contrato contra transbordos, que pode ter consequências desastrosas!

Padrões

Para facilitar a composição e a interoperabilidade, a comunidade Ethereum definiu vários padrões na forma de ERCs. Você pode ler mais sobre eles na seção de padrões.

Ao incluir um ERC como parte de seus contratos, É uma boa ideia procurar implementações padrão ao invés de tentar implantar a sua própria. Muitas bibliotecas de contratos inteligentes incluem implementações para os ERC mais populares. Por exemplo, o onipresente padrão de token fungível lERC20 universal pode ser encontrado em HQ20(opens in a new tab), DappSys(opens in a new tab) e OpenZeppelin(opens in a new tab). Além disso, alguns ERCs também fornecem implementações canônicas como parte do próprio ERC.

Vale a pena mencionar que alguns ERCs não são sozinhos, mas são adições a outros ERCs. Por exemplo, ERC2612(opens in a new tab) adiciona uma extensão ao ERC20 para melhorar sua usabilidade.

Como adicionar uma biblioteca

Sempre consulte a documentação da biblioteca que você está incluindo para instruções específicas sobre como incluí-la no seu projeto. Várias bibliotecas de contratos Solidity são empacotadas usando o npm, então você pode apenas npm instale-as. A maioria das ferramentas para compilar contratos irá analisar os seus node_modules para bibliotecas de contratos inteligentes, assim você poderá fazer o seguinte:

1// Isto irá carregar a biblioteca @openzeppelin/contracts de seus node_modules
2importe "@openzeppelin/contracts/token/ERC721/ERC721. ol";
3
4contrato MyNFT é ERC721 {
5 constructor() ERC721("MyNFT", "MNFT") público { }
6}
Copiar

Independente do método que você usa, ao incluir uma biblioteca, sempre fique de olho na versão de linguagem. Por exemplo, não é possível usar uma biblioteca para Solidity 0.6 se você estiver escrevendo seus contratos em Solidity 0.5.

Quando usar

Usar uma biblioteca de contratos inteligente para o seu projeto traz vários benefícios. Em primeiro lugar e acima de tudo, economiza seu tempo fornecendo blocos de construção prontos para usar que você pode incluir no seu sistema, ao invés de ter que programar você mesmo.

A segurança é também um importante ganho. Bibliotecas de contratos inteligentes de código aberto também são frequentemente cuidadosamente controladas. Dado que muitos projectos dependem deles, existe um forte incentivo por parte da comunidade para os manter sob constante revisão. É muito mais comum encontrar erros no código do aplicativo do que em bibliotecas de contratos reutilizáveis. Algumas bibliotecas também são submetidas a auditorias externas(opens in a new tab) para segurança adicional.

No entanto, o uso de bibliotecas de contratos inteligentes acarreta o risco de incluir código com que você não está familiarizado no seu projeto. É tentador importar um contrato e incluí-lo diretamente no seu projeto, mas sem um bom entendimento do que esse contrato faz, você pode estar inadvertidamente a introduzir um problema no seu sistema devido a um comportamento inesperado. Certifique-se de ler a documentação do código que você está importando, e, em seguida, revise o próprio código antes de torná-lo parte do seu projeto!

Por último, ao decidir se deve incluir uma biblioteca, considere a sua utilização global. Uma comunidade amplamente adoptada tem os benefícios de ter uma comunidade mais vasta e de olhar para ela com mais olhos para as questões. A segurança deve ser seu foco principal ao construir com contratos inteligentes!

OpenZeppelin Contracts - Biblioteca para o desenvolvimento de contratos inteligentes seguros.

DappSys - Blocos de código seguros, simples e flexíveis para contratos inteligentes.

HQ20 - Um projeto Solidity com contratos, bibliotecas e exemplos para ajudá-lo a construir aplicações distribuídas completas para o mundo real.

thirdweb Solidity SDK - Fornece as ferramentas necessárias para criar contratos inteligentes e personalizados com eficiência

Leitura adicional

Conhece um recurso da comunidade que te ajudou? Edite essa página e adicione!

Este artigo foi útil?