Atualizado em 19/11/24!
Uma das partes mais cruciais e frequentes em projetos web3 é o desenvolvimento de smart contracts, sendo a linguagem Solidity a mais comumente utilizada no mercado. Como em todo projeto de software é normal que existam prazos e pressão para que eles sejam cumpridos, o que nos faz ter preocupações com produtividade, mas sem abrir mão de segurança e performance, dois fatores cruciais em projetos deste tipo. Uma brecha de segurança, por exemplo, pode arruinar completamente um protocolo DeFi, e um problema de performance pode gerar custos astronômicos de gás que afastem os usuários da sua aplicação (entenda mais aqui).
Mas como se manter produtivo, seguro e com um dapp “barato” de usar? Uma alternativa muito recorrente é o reuso de código, afinal, boa parte dos projetos costuma ser ou começar a partir de padrões comuns, principalmente quando o assunto são tokens. Afinal, se milhares de tokens ERC-20 já foram codificados, deve ter uma base comum de código a ser usada entre eles, certo? O mesmo vale para NFTs (ERC-721) e outros.
Mas será que, quando o assunto é web3, posso confiar em código copiado da Internet?
E a resposta é sim, se você souber de ONDE copiar.
E quando o assunto é Web3, esse ONDE se chama OpenZeppelin.
O que é a OpenZeppelin?
Se preferir, estas duas seções iniciais (teóricas) podem ser vistas no vídeo abaixo.
A OpenZeppelin é uma empresa dedicada ao desenvolvimento de tecnologias relacionadas a contratos inteligentes e segurança blockchain. Fundada em 2015, a OpenZeppelin tem sido uma figura proeminente no ecossistema Ethereum, fornecendo soluções de segurança e auditoria para contratos inteligentes.
A empresa é conhecida por sua biblioteca de contratos inteligentes de código aberto chamada OpenZeppelin Contracts, que oferece implementações seguras e testadas de diversos padrões comuns para o desenvolvimento de contratos inteligentes. Esses padrões incluem funcionalidades como token ERC-20, token ERC-721 (NFTs), entre outros.
Além disso, a OpenZeppelin oferece serviços de auditoria de segurança para contratos inteligentes, ajudando projetos e empresas a identificar e corrigir possíveis vulnerabilidades em suas implementações blockchain. A segurança é uma consideração crítica no espaço blockchain, e a expertise da OpenZeppelin nessa área é altamente valorizada pela comunidade.
Mas deixando esses serviços personalizados de lado, eu quero falar hoje sobre o OpenZeppelin Contracts, o serviço mais utilizado pela comunidade.
O que é OpenZeppelin Contracts?
A biblioteca OpenZeppelin Contracts é uma coleção de contratos inteligentes de código aberto para o desenvolvimento seguro e padronizado de aplicativos descentralizados (DApps) na blockchain Ethereum (e demais compatíveis com EVM). Ela foi projetada para facilitar o processo de criação de contratos inteligentes, fornecendo implementações robustas de padrões comuns e componentes essenciais. Podemos destacar alguns aspectos-chave da biblioteca OpenZeppelin Contracts:
Padrões de Token: A OpenZeppelin Contracts inclui implementações padrão para diversos padrões de tokens Ethereum, como ERC-20 (para tokens fungíveis), ERC-721 (para tokens não fungíveis ou NFTs) e ERC-1155 (multitoken). Isso permite que os desenvolvedores criem facilmente tokens personalizados sem se preocupar com a implementação básica.
Controle de Acesso: A biblioteca oferece contratos que facilitam a implementação de sistemas de controle de acesso (simples e por roles), permitindo que os desenvolvedores restrinjam o acesso a determinadas funções com base em permissões específicas.
Utilidades Gerais: Oferece uma variedade de utilidades e contratos auxiliares que podem ser úteis no desenvolvimento, como manipulação de strings, controle de tempo, manipulação de endereços, acordos seguros (escrow) e matemática segura.
Upgradability: A biblioteca também aborda o conceito de upgradability, permitindo que os desenvolvedores construam contratos inteligentes que podem ser atualizados sem perder o estado atual.
Todos os contratos da OpenZeppelin passam por rigorosas auditorias de segurança, o que significa que eles são desenvolvidos com foco na minimização de vulnerabilidades e são testados quanto à robustez. A OpenZeppelin Contracts é amplamente utilizada na comunidade Ethereum e é considerada uma base sólida para o desenvolvimento de contratos inteligentes seguros e confiáveis. Desenvolvedores muitas vezes incorporam esses contratos como dependências em seus próprios projetos, aproveitando a confiabilidade e segurança oferecidas pela biblioteca.
Como usar OpenZeppelin Contracts no site?
Eu mostro isso na prática no vídeo abaixo.
O uso desta biblioteca começa no builder de contratos disponibilizados pela OpenZeppelin em seu próprio site, acesse aqui e que tem a aparência abaixo, que pode variar com o tempo.
No topo, você tem algumas abas para alguns tipos comuns de contratos pré-construídos e algumas ferramentas:
- ERC20: para criar contratos de tokens fungíveis (as famosas “criptomoedas”);
- ERC721: para criar contratos de tokens não-fungíveis (as famosas “NFTs”);
- ERC1155: para criar contratos multi-token, misturando os tipos anteriores;
- Governor: para contratos de governança (muito usados em DAOs);
- Custom: criação livre;
Após selecionar a base de contrato que mais atende à sua necessidade, é hora de personalizar o código gerado usando as ferramentas à esquerda. Ali você pode personalizar uma série de características dos contratos além de adicionar diversas funcionalidades utilitárias que muitas vezes adicionam mais contratos da biblioteca à sua solução final.
Peguemos como exemplo a solução mais comum, de token ERC20. Ao selecionar esta aba você pode personalizar, por exemplo:
- Name: o nome do seu token;
- Symbol: a sigla do seu token (geralmente três ou quatro letras maiúsculas);
- Premint: quantos tokens serão emitidos na criação do contrato;
- Mintable: se seu contrato vai permitir a emissão de mais tokens no futuro (expansão monetária);
- Burnable: se seu contrato vai permitir a queima de tokens existentes (contração monetária);
- Pausable: se seu contrato permite a interrupção geral de funcionamento (pause);
- Permit: implementação da ERC-2612
- Votes: usada por DAOs para votações entre os token holders;
- Flash Minting: para implementação de Flash Loans;
- Access Control: onde você pode optar pelas formas de controle baseada em Owner (single admin), em Roles e Roles Gerenciáveis (que podem ser alteradas);
- Upgradeability: que implementam padrões como Adapter ou Proxy para permitir atualizações do contrato;
Entre outras que mudam com o passar do tempo ou com a categoria de contrato (as que citei acima estão disponíveis para tokens ERC-20).
Mais abaixo você tem ainda a opção de adicionar mecanismos de controle de acesso e de atualização do contrato (por padrão os contratos não são atualizáveis).
Assim, facilmente você pode ir montando o esqueleto de um contrato real sem escrever uma linha de código sequer.
Como usar OpenZeppelin Contracts no projeto?
Claro que o resultado final, em um projeto profissional, irá depender que você seja capaz de personalizar o código gerado e até mesmo integrá-lo a uma solução muito maior, mas o ganho de produtividade, segurança e performance que irá ter usando da OpenZeppelin Contracts é imenso nos tipos de projeto que ela atende. Uma vez com o código-base criado é hora de levá-lo para edição em sua ferramenta favorita, sendo que hoje no mercado temos duas opções principais: Remix e VS Code/HardHat.
No Remix, basta que você crie um novo arquivo Solidity e cole o código copiado do OZ Contracts. A ferramenta por padrão já conhece os contratos da biblioteca e os imports irão funcionar sem qualquer necessidade de configuração adicional, veja abaixo.
Então basta você copiar e colar o código do OZ Contracts no Remix e fazer as edições que deseja, para depois poder avançar para um possível deploy na blockchain.
Agora se você trabalhar com VS Code + HardHat, após a etapa inicial de criação de um novo projeto HardHat, você terá de instalar a dependência do OZ Contracts via terminal, como abaixo:
1 2 3 |
npm install -D @openzeppelin/contracts |
Isso permitirá que você use qualquer um dos contratos da biblioteca normalmente em seus códigos de smart contracts Solidity. Veja abaixo:
Então após você instalar o pacote via NPM, basta você copiar e colar o código do OZ Contracts no VS Code e fazer as edições que deseja, para depois poder avançar para a etapa de testes unitários (sim, recomendo que faça todos os testes possíveis, principalmente se editou algo no código) e mais tarde um possível deploy na blockchain.
E com isso você acabou de aprender a usar um poderoso aliado em seus projetos de smart contracts que tenho certeza que pode fazer a diferença no seu dia a dia como dev web3.
Até a próxima!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.