Atenção: esse tutorial utiliza HardHat Scripts para o deploy. Se estiver procurando aprender a usar HardHat Ignition, use este outro tutorial.
Recentemente escrevi alguns tutoriais sobre como criar Smart Contracts usando a linguagem Solidity e o toolkit HardHat, você confere um olá mundo neste link e um CRUD neste link. 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 bytecodes que possam ser interpretados pela EVM (Ethereum Virtual Machine) e envio esses bytecodes para um provedor distribuir aos demais nós da rede. Durante os tutoriais anteriores testamos tudo usando testes unitários automatizados e deploy em uma rede interna do HardHat, de testes (chamada HardHat Network). 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, pode assistir ao vídeo abaixo ao invés de ler, mais ao final dessa aula fazemos o deploy da mesma forma que aqui no tutorial.
#1 – Preparando a Carteira
Já falei extensivamente da MetaMask, a principal carteira cripto de browser do mundo, tanto aqui no blog quanto no meu canal, sendo que se você não possui uma ainda, use o vídeo abaixo para aprender como criar e configurar a sua, é gratuita.
A MetaMask não é um provider, ela é uma carteira, mas funciona conectada a um provider da Infura, uma empresa irmã provedora de blockchain em nuvem (ambas são projetos da ConsenSys). Usaremos a MetaMask para criarmos uma conta que será usada para o pagamento da taxa de rede (gas fee) necessária ao deploy e envio dos bytecodes para um nó da blockchain, 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 Chain (também conhecida como “blockchain da Binance” ou BSC) mas pode ser em qualquer rede EVM (lista extensa de redes e configurações neste link).
Os dados da rede de teste da BNB são (obtidos no site oficial):
- Nome da Rede: BNB Chain Testnet
- Novo URL do RPC: https://data-seed-prebsc-1-s1.binance.org:8545/
- ID da chain: 97
- Símbolo da moeda: tBNB
- 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, fica no topo superior esquerdo da carteira) 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 BNB Chain neste link. 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. Caso você seja aluno dos meus cursos, você pode usar o meu faucet também.
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 chave privada da sua carteira MetaMask, a fim de que o deploy seja todo automatizado usando HardHat. Esta chave é aquela que fica oculta em Configurações > Detalhes da Conta > Detalhes > Show Private Key e muito cuidado com ela pois quem a tiver tem controle total sobre sua carteira.
Vamos salvar esta chave em um arquivo .env na raiz do projeto com uma única chave PRIVATE_KEY, 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 install dotenv |
Crie o arquivo .env, preencha a chave PRIVATE_KEY e vamos em frente.
Agora é importante você entender que o script que vai fazer o deploy do seu contrato na blockchain é o deploy.ts que deve existir na pasta scripts. Crie ele se não existir e coloque o seguinte conteúdo que vou explicar na sequência.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import { network } from "hardhat"; const { ethers } = await network.connect(); async function main() { const BookDatabase = await ethers.getContractFactory("BookDatabase"); const bookDatabase = await BookDatabase.deploy(); await bookDatabase.waitForDeployment(); console.log(`Contract deployed to ${bookDatabase.target}`); } // We recommend this pattern to be able to use async/await everywhere // and properly handle errors. main().catch((error) => { console.error(error); process.exitCode = 1; }); |
Esse script importa a biblioteca Ethers a partir da VM de teste (HardHat Network) e com ela carrega o nosso contrato Solidity que deve estar com o mesmo nome presente na pasta contracts (BookDatabase no meu exemplo). Com o factory desse contrato carregado nós chamamos as funções necessárias ao deploy e imprimimos o resultado no console, que será o endereço do contrato na blockchain. O último trecho de código é padrão e serve para sermos avisados de quaisquer erros que ocorrerem.
Agora, vamos nos focar no seu hardhat.config.ts. Por padrão estávamos usando uma rede default de teste e agora devemos apontar para a rede onde faremos o deploy, configurando corretamente os dados do nosso nó de blockchain, que no nosso caso é um nó da Testnet da BNB Chain. 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 30 31 32 33 34 35 36 37 |
import type { HardhatUserConfig } from "hardhat/config"; import hardhatToolboxMochaEthersPlugin from "@nomicfoundation/hardhat-toolbox-mocha-ethers"; import "dotenv/config"; const config: HardhatUserConfig = { plugins: [hardhatToolboxMochaEthersPlugin], solidity: { profiles: { default: { version: "0.8.28", }, production: { version: "0.8.28", settings: { optimizer: { enabled: true, runs: 200, }, }, }, }, }, networks: { bnbtest: { type: "http", chainType: "l1", url: "https://data-seed-prebsc-1-s1.binance.org:8545/", chainId: 97, accounts: [`${process.env.PRIVATE_KEY}`] } } }; export default config; |
Estes dados são de um full node da rede da BNB Chain. 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.PRIVATE_KEY 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 HardHat em nosso projeto.
1 2 3 |
npx hardhat run scripts/deploy.ts --network bnbtest |
Este comando vai compilar o seu contrato definido no deploy.ts, vai assinar a transação usando a conta da sua carteira (definida pela frase mnemônica) e vai enviar os bytescodes nessa transação para a blockchain configurada no hardhat.config.js. Ao término de todo o processo, você terá as informações do deploy bem sucedido, como abaixo.
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 no futuro todos os detalhes das transações que já aconteceram com esse contrato, como abaixo.
Ou seja, seu contrato agora 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.
Um próximo passo possível e opcional é você verificar o seu contrato, o que ensino neste tutorial.
Até a próxima!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.