Bibliotecas de contratos inteligentes
Você não precisa escrever cada contrato inteligente do seu projeto do zero. Existem muitas bibliotecas de contratos inteligentes de código aberto disponíveis que fornecem blocos de construção reutilizáveis para o seu projeto, o que pode evitar que você tenha que reinventar a roda.
Pré-requisitos
Antes de mergulhar nas bibliotecas de contratos inteligentes, é uma boa ideia ter um bom entendimento da estrutura de um contrato inteligente. Acesse anatomia dos contratos inteligentes 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 que você pode adicionar aos seus contratos e implementações de vários padrões.
Comportamentos
Ao escrever contratos inteligentes, há uma boa chance de você se pegar escrevendo padrões semelhantes repetidas vezes, como atribuir um endereço de admin (administrador) para realizar operações protegidas em um contrato, ou adicionar um botão de pause (pausa) de emergência no caso de um problema inesperado.
As bibliotecas de contratos inteligentes geralmente fornecem implementações reutilizáveis desses comportamentos como bibliotecas (opens in a new tab) ou via herança (opens in a new tab) em Solidity.
Como exemplo, a seguir está uma versão simplificada do contrato Ownable (opens in a new tab) da biblioteca OpenZeppelin Contracts (opens in a new tab), que designa um endereço como o proprietário de um contrato e fornece um modificador para restringir o acesso a um método apenas a esse proprietário.
contract Ownable {
address public owner;
constructor() internal {
owner = msg.sender;
}
modifier onlyOwner() {
require(owner == msg.sender, "Ownable: caller is not the owner");
_;
}
}
Para usar um bloco de construção como este em seu contrato, você precisaria primeiro importá-lo e, em seguida, estendê-lo em seus próprios contratos. Isso permitirá que você use o modificador fornecido pelo contrato base Ownable para proteger suas próprias funções.
import ".../Ownable.sol"; // Caminho para a biblioteca importada
contract MyContract is Ownable {
// A função a seguir só pode ser chamada pelo proprietário
function secured() onlyOwner public {
msg.sender.transfer(1 ether);
}
}
Outro exemplo popular é SafeMath (opens in a new tab) ou DsMath (opens in a new tab). Estas são bibliotecas (em oposição a contratos base) que fornecem funções aritméticas com verificações de overflow, que não são fornecidas pela linguagem. É uma boa prática usar qualquer uma dessas bibliotecas em vez de operações aritméticas nativas para proteger seu contrato contra overflows, o que pode ter consequências desastrosas!
Padrões
Para facilitar a composabilidade e 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 em vez de tentar criar a sua própria. Muitas bibliotecas de contratos inteligentes incluem implementações para os ERCs mais populares. Por exemplo, o onipresente padrão de token fungível ERC-20 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 independentes, mas são adições a outros ERCs. Por exemplo, o ERC-2612 (opens in a new tab) adiciona uma extensão ao ERC-20 para melhorar sua usabilidade.
Como adicionar uma biblioteca
Sempre consulte a documentação da biblioteca que você está incluindo para obter instruções específicas sobre como incluí-la em seu projeto. Várias bibliotecas de contratos Solidity são empacotadas usando npm, então você pode simplesmente usar npm install nelas. A maioria das ferramentas para a compilação de contratos procurará em seu node_modules por bibliotecas de contratos inteligentes, então você pode fazer o seguinte:
// Isso carregará a biblioteca @openzeppelin/contracts do seu node_modules
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract MyNFT is ERC721 {
constructor() ERC721("MyNFT", "MNFT") public { }
}
Independentemente do método que você usar, ao incluir uma biblioteca, fique sempre de olho na versão da linguagem. Por exemplo, você não pode usar uma biblioteca para Solidity 0.6 se estiver escrevendo seus contratos em Solidity 0.5.
Quando usar
Usar uma biblioteca de contratos inteligentes para o seu projeto tem vários benefícios. Em primeiro lugar, economiza seu tempo, fornecendo blocos de construção prontos para uso que você pode incluir em seu sistema, em vez de ter que codificá-los você mesmo.
A segurança também é uma grande vantagem. As bibliotecas de contratos inteligentes de código aberto também são frequentemente examinadas de perto. Como muitos projetos dependem delas, há um forte incentivo da comunidade para mantê-las sob revisão constante. É muito mais comum encontrar erros no código do aplicativo do que em bibliotecas de contratos reutilizáveis. Algumas bibliotecas também passam por auditorias externas (opens in a new tab) para segurança adicional.
No entanto, o uso de bibliotecas de contratos inteligentes traz o risco de incluir código com o qual você não está familiarizado em seu projeto. É tentador importar um contrato e incluí-lo diretamente em seu projeto, mas sem um bom entendimento do que esse contrato faz, você pode estar introduzindo inadvertidamente um problema em seu sistema devido a um comportamento inesperado. Certifique-se sempre 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 seu uso geral. Uma biblioteca amplamente adotada tem os benefícios de ter uma comunidade maior e mais olhos procurando por problemas. A segurança deve ser seu foco principal ao construir com contratos inteligentes!
Ferramentas relacionadas
OpenZeppelin Contracts - A biblioteca mais popular para o desenvolvimento seguro de contratos inteligentes.
- Documentação (opens in a new tab)
- GitHub (opens in a new tab)
- Fórum da comunidade (opens in a new tab)
DappSys - Blocos de construção seguros, simples e flexíveis para contratos inteligentes.
HQ20 - Um projeto Solidity com contratos, bibliotecas e exemplos para ajudá-lo a construir aplicativos distribuídos completos para o mundo real.
thirdweb Solidity SDK - Fornece as ferramentas necessárias para construir contratos inteligentes personalizados de forma eficiente
Tutoriais relacionados
- Considerações de segurança para desenvolvedores Ethereum – Um tutorial sobre considerações de segurança ao construir contratos inteligentes, incluindo o uso de bibliotecas.
- Entenda o contrato inteligente de token ERC-20 - Tutorial sobre o padrão ERC-20, fornecido por várias bibliotecas.
Leitura adicional
Conhece um recurso da comunidade que o ajudou? Edite esta página e adicione-o!