Recentemente escrevi alguns tutoriais sobre como criar Smart Contracts usando a linguagem Solidity e a suíte Truffle, você confere um olá mundo neste link e um CRUD neste outro. Uma coisa que não ensinei na ocasião é que é extremamente importante é o processo de deploy do seu smart contract na blockchain e este é o objetivo do tutorial de hoje.
O processo de fazer deploy consiste da compilação do seu contrato em bytescodes que possam ser interpretados pela EVM (Ethereum Virtual Machine) e envio esses bytecodes para um provedor distribuir aos nós da rede. Durante os tutoriais anteriores testamos tudo usando testes unitários automatizados e deploy em uma rede interna do Truffle, de testes. Agora, para enviar a um provider de blockchain existem várias formas mas a que escolhi para este tutorial aqui é usando a carteira de criptomoedas MetaMask.
Se preferir, ao invés de ler este tutorial você pode assistir a este vídeo.
#1 – Preparando a Carteira
Já falei extensivamente da MetaMask e também ensinei como criar uma gratuitamente neste tutorial aqui então vou partir do pressuposto que você já possui uma no seu browser. Se tiver dificuldade no processo, confere o vídeo abaixo.
A MetaMask não é um provider, ela é uma carteira, mas funciona conectada a um provider da Infura se não estou enganado. Usaremos a MetaMask para o pagamento da taxa de rede (gas fee) necessária ao deploy e envio dos bytecodes para o provider dela, que distribuirá nosso código pela rede.
Outro ponto importante a considerar é em qual rede você fará o seu deploy. Eu usarei aqui a Testnet da BNB Smart Chain (antiga BSC, a blockchain da Binance). Isso porque a taxa de rede dos deploys costuma ficar alta e como é apenas um contrato para fins didáticos não faz sentido gastar moedas reais com ele. Sendo assim, recomendo que configure a rede de teste da Binance pois é muito útil não apenas para este tutorial como para outras atividades usando a carteira. Para adicionar redes, você deve ir até as configurações da MetaMask e em Redes.
Os dados da rede de produção da Binance (BSC) são (obtidos no site oficial):
- Nome da Rede: Smart Chain
- Novo URL do RPC: https://bsc-dataseed.binance.org/
- ID da chain: 56
- Símbolo da moeda: BNB
- URL do Block Explorer: https://bscscan.com
E os dados da rede de teste (Testnet), que usaremos neste tutorial, são:
- Nome da Rede: Smart Chain – Testnet
- Novo URL do RPC: https://data-seed-prebsc-1-s1.binance.org:8545/
- ID da chain: 97
- Símbolo da moeda: BNB
- URL do Block Explorer: https://testnet.bscscan.com
Certifique-se de deixar a rede de testes selecionada como principal na sua MetaMask (repare na imagem abaixo, tipo direito) para que nosso desenvolvimento seja realizado em cima dela a fim de não gastarmos fundos com os testes. Basta deixar ela aparecendo no topo da sua carteira e em seguida copie o endereço da sua carteira de testes, que fica logo abaixo do nome da sua conta, como na imagem abaixo.
Agora, antes de sairmos fazendo deploy, nosso próximo passo é adicionarmos fundos para os testes. Você pode fazê-lo usando o Faucet da Binance no Discord. Entre no servidor deles com este convite. Uma vez no server, escolha qualquer role e vá no canal testnet-faucet usando o comando abaixo para pedir saldo:
!faucet <endereco da sua carteira>
Isso vai te fornecer 0.1 BNB . Precisaremos sempre ter BNB já que é a moeda oficial da rede e é com ela que pagamos as taxas das transações. Note que você só pode fazer isso uma vez a cada 24h e que esse saldo é completamente fake, só funciona na testnet, não pode ser transacionado nas exchanges e não pode ser sacado mas pode ser transferido entre carteiras de teste, que é o que faremos aqui.
Agora com saldo na carteira e ela apontada para a Testnet, podemos avançar para o deploy em si.
#2 – Fazendo o Deploy
Uma vez que sua carteira esteja devidamente configurada no seu browser, volte ao VS Code para fazermos o deploy. Você vai precisar da frase mnemônica da sua carteira MetaMask, a fim de que o deploy seja todo automatizado usando Truffle. Esta frase são aqueles famosas 12 palavras secretas que você recebe quando cria a sua carteira e muito cuidado com ela pois quem a tiver tem controle total sobre sua carteira.
Vamos salvar estas palavras em um arquivo .env na raiz do projeto com uma única chave SECRET, sendo que este arquivo não deve ser versionado então é de bom tom colocá-lo no .gitignore caso esteja usando Git. Para que possamos usar arquivos .env para configurações do projeto instale a dependência do DotEnv no projeto.
1 2 3 |
npm i dotenv |
Agora é importante você entender que o script que vai fazer o deploy do seu contrato na blockchain é aquele que está na pasta migrations. Certifique-se de que ele está carregando o contrato certo, como no meu exemplo abaixo onde ele informa que vai fazer deploy do contrato StoreCustomers.
1 2 3 4 5 6 7 |
const StoreCustomers = artifacts.require("StoreCustomers"); module.exports = function(deployer) { deployer.deploy(StoreCustomers); }; |
Agora para fazermos o deploy precisamos conectar o Truffle na MetaMask para a assinatura e pagamento da transação e também devemos configurar a rede onde será feito o deploy. Para fazer a conexão com a carteira usaremos um pacote chamado hdwallet-provider que você deve instalar no seu projeto com o comando abaixo.
1 2 3 |
npm install @truffle/hdwallet-provider |
Agora, vamos nos focar no seu truffle-config.js. Por padrão estávamos usando uma configuração vazia no campo networks justamente porque estávamos apenas testando. Agora que queremos fazer deploy temos de configurar corretamente os dados do nosso provedor de rede, que no nosso é a MetaMask e a rede em si, que no nosso caso é a Testnet da BNB Smart Chain (antiga BSC). Os dados de rede a serem utilizados são os mesmos que citei anteriormente, na etapa de configuração da carteira MetaMask.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
require("dotenv").config(); const HDWalletProvider = require("@truffle/hdwallet-provider"); module.exports = { networks: { bsctest: { provider: new HDWalletProvider({ mnemonic: { phrase: process.env.SECRET }, providerOrUrl: "https://data-seed-prebsc-1-s1.binance.org:8545/", }), network_id: "97" } }, compilers: { solc: { version: "^0.8.17", settings: { optimizer: { enabled: true, // Default: false runs: 200 // Default: 200 }, } } } }; |
Estes dados são de um full node da rede da Binance. O mais comum é que os full nodes sejam pagos, mas a Binance e outras redes que querem ser mais dev friendly oferecem full nodes gratuitos para serem usados em desenvolvimento. Repare que o .env está sendo carregado logo no início para que process.env.SECRET possa ser chamado mais tarde. Se quiser, pode colocar a URL da rede no .env também, a fim de não deixar nenhuma configuração diretamente no código.
Com isso, estamos com tudo configurado para o deploy e para fazê-lo de fato, basta rodar o comando abaixo do Truffle em nosso projeto.
1 2 3 |
truffle migrate --network bsctest |
Este comando vai baixar o compilador, se necessário, vai compilar o seu contrato definido na migration, vai assinar a transação usando sua carteira MetaMask e vai enviar os bytescodes nessa transação para a blockchain configurada no truffle-config.js. Ao término de todo o processo, você terá as informações do deploy bem sucedido, como abaixo.
Repare que tem algumas informações em ETH, mas que na rede da Binance são BNB na verdade. Isso acontece porque a BNB Smart Chain é um fork da rede Ethereum e para o máximo de compatibilidade não foram feitas “traduções” de ETH por BNB. Neste log de deploy você tem custos da transação mas principalmente o hash da mesma e o endereço do contrato.
Para conferir se a transação foi um sucesso basta você pegar o hash que recebeu e ir conferir no site da BSC Scan, lembrando que como é um teste, deve usar o BSC Scan Testnet que fica neste endereço. Colando o endereço/hash do seu contrato (ou da transação) você verá se o deploy dele já foi finalizado e todos os detalhes das transações que já aconteceram com esse contrato, como abaixo.
Quando a transação de deploy estiver marcada como concluída/bem sucedida o seu contrato já está live na blockchain, ou seja, pode ser usado normal e publicamente por qualquer pessoa que possua o endereço dele, invocando todas as funções e propriedades públicas do mesmo.
#3 – Testando o Contrato
Depois que você faz o deploy na blockchain o contrato pode ser testado em produção e uma das maneiras mais simples de fazer isso é pelo próprio site da BSC Scan. Para fazer isso primeiro você terá de publicar e verificar também o código-fonte do contrato, o que faremos com a ajuda de mais um pacote chamado truffle-plugin-verify. Se preferir, o vídeo abaixo ensina o mesmo passo a passo.
1 2 3 |
npm i -D truffle-plugin-verify |
Este plugin requer que você tenha uma conta criada na BSC Scan (é gratuita, mas tem de ser feita na BSC Scan mainnet) e que na área de configurações da sua conta você crie uma API Key. De posse dessa Api Key, vá no seu /env e adicione mais uma chave lá, ficando como abaixo (substitua <…> pelos valores).
1 2 3 4 |
SECRET=<12-palavras-da-wallet> API_KEY=<sua-api-key-bsc-scan> |
Agora, vamos ajustar novamente o nosso truffle-config.js para que consigamos rodar o script de publicação e verificação dos fontes. Adicione antes da propriedade networks as seguintes propriedades novas.
1 2 3 4 5 6 |
plugins: ["truffle-plugin-verify"], api_keys: { bscscan: process.env.API_KEY }, |
Repare que a propriedade interna de api_keys deve ter exatamente o mesmo nome do site que irá verificar o contato (bscscan no meu caso) e que a chave API_KEY deve ser igual ao que você definiu no .env. Com tudo devidamente configurado agora você pode ir no terminal e rodar o script de verificação, usando o nome do contrato, seguido de arroba (@) e o endereço do contrato que acabou de fazer o deploy (sem <…>).
1 2 3 |
truffle run verify StoreCustomers@<contrato> --network bsctest |
Depois de algum tempo que pode demorar dado o tamanho do seu contrato, ele irá aparecer como verificado no site da BSC Scan, com um ícone de check verde ao lado da aba contract, como na imagem abaixo. Tudo estando certo a sua aba Contract da tela do contrato agora irá lhe fornecer as opções de “Read Contract” e “Write Contract”, respectivamente as operações públicas possíveis de leitura e de escrita, este último incorrendo em taxas de rede (gas fee). Atenção ao link de Reset no canto direito, ele é importante para atualizar a página pois ela não o faz automaticamente.
Para as operações de escrita você precisará pagar as taxas de rede e para isso precisará de uma carteira, certo? O site BSC Scan também se integra com a MetaMask, basta clicar no link “Connect to Web3” que fica com uma bolinha vermelha na esquerda, até que a conexão seja feita e você autorize o dapp BSC Scan na sua carteira quando solicitado.
Você então pode usar os botões azuis fornecidos para invocar as propriedades e funções públicas do contrato, fazendo seus testes em produção. Caso queira ver como ficou o meu, confira neste link. Mais tarde, você pode fazer testes usando algum dapp criado por você, como os que eu ensino a criar neste tutorial aqui pegando o ABI gerado no BSC Scan.
Espero que tenha gostado do tutorial, qualquer dúvida deixe nos comentários!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.