WEB3DEV

Cover image for Tutorial de DApp Full-stack com Vite + React, Tailwind CSS, e Solidity
Dimitris Carvalho Calixto
Dimitris Carvalho Calixto

Posted on

Tutorial de DApp Full-stack com Vite + React, Tailwind CSS, e Solidity

Neste tutorial, demonstraremos como construir um DApp full-stack, testá-lo no Ropsten testnet e implementá-lo com a plataforma de desenvolvimento Web3 Alchemy. Vamos usar Vite, React e Tailwind CSS para construir o frontend do DApp e Solidity para criar o backend.

Pule adiante:

  • Pré-requisitos
  • Começando
  • Cimbrando o projeto
  • Construindo a UI com Vite+React e Tailwind CSS]
  • Construindo o contrato inteligente usando Hardhat
  • Testando o contrato inteligente com o Ropsten testnet
  • Implantando o DApp no Alchemy

Pré-requisitos

Para acompanhar a demonstração deste artigo, você vai precisar do seguinte:

  • Experiência profissional em construção de UIs de Front-end com React e CSS
  • Familiaridade com Tailwind CSS, Vite, VS Code, e npm
  • Compreensão básica da sintaxe da linguagem Solidity
  • Familiaridade com o ecossistema Ethereum

Além disso, será útil ter as seguintes extensões no VS Code:

Começando

Começaremos criando uma pasta com o nome de nosso projeto pretendido. Em seguida, abriremos a pasta no VS code. Você pode usar o editor de código de sua escolha.

Agora, vamos criar duas pastas, client e smart_contract, e depois navegamos até a pasta client no terminal.

Cimbrando o projeto

Vamos criar um cimbramento para nossa aplicação React usando Vite. Esta ferramenta de construção (Vite em francês significa rapidez) ajuda os desenvolvedores a criar um cimbramento de forma rápida e fácil.

Instale o Vite com npm, assim:

$ npm create vite@latest

Em seguida, execute o seguinte comando para inicializar um cimbramento para o projeto e permitir a instalação de create-vite@latest:

$ npm init vite@latest

Quando a criação do cimbramento estiver completo, você verá a saída em seu terminal solicitando detalhes do projeto.

Escolha um nome do projeto e depois um nome do pacote. Esta demonstração usa web3-world.com tanto para o nome do projeto como para o nome do pacote.

Em seguida, selecione React tanto para o framework quanto para a variante.

Você deverá ver o seguinte na tela:

Image

Isto cria os seguintes arquivos para o projeto:

  • index.html
  • package.json
  • pasta src
  • vite.config.js

Em seguida, execute os seguintes comandos:


$ npm install

$ npm run dev

Enter fullscreen mode Exit fullscreen mode

Este código implementará o projeto como uma aplicação React acessível na rede local especificada. Se Navegarmos até a porta no localhost, deveremos ver o seguinte:

Image

Podemos parar o terminal de hospedar o servidor com o comando Ctrl + C.

Em seguida, vamos navegar no diretório smart_contract e executar o seguinte:

$ npm init -y

Isto cria um arquivo package.json para nossa pasta smart_contract.

Agora, vamos usar o npm para instalar o CSS Tailwind. Vamos adicionar o Tailwind ao nosso projeto React com o create-react-app. Para fazer isso, simplesmente seguiremos os quatro passos descritos na documentação do Tailwind.

Depois, instalamos o Tailwind na pasta client, assim:


$ npm install -D tailwindcss postcss autoprefixer

$ npx tailwindcss init -p

Enter fullscreen mode Exit fullscreen mode

Após executar estes comandos, podemos confirmar que dois arquivos foram adicionados a nossa pasta de projetos: um arquivo de configuração CSS Tailwind e um arquivo de configuração PostCSS.

Agora, vamos apagar o conteúdo do arquivo tailwind.config.js do projeto e substituí-lo pelo conteúdo do arquivo tailwind.config na página da documentação:


module.exports = {

 content: [

   "./src/**/*.{js,jsx,ts,tsx}",

 ],

 theme: {

   extend: {},

 },

 plugins: [],

}

Enter fullscreen mode Exit fullscreen mode

Em seguida, substituiremos o conteúdo da cópia do arquivo index.css do projeto pelas diretrizes mostradas na página de documentação:


@tailwind base;

@tailwind components;

@tailwind utilities;

Enter fullscreen mode Exit fullscreen mode

Construindo a UI do DApp

Agora, vamos trabalhar na construção do frontend da nossa aplicação.

Vamos começar criando uma nova pasta, chamada de componentes, dentro da pasta src. Lá, criaremos os componentes do painel de controle para nosso projeto:

  • Navigation_bar.jsx
  • Footer.jsx
  • Loader.jsx
  • Services.jsx
  • Welcome.jsx
  • Transactions.jsx

Cada um desses componentes conterá o seguinte código, substituindo o Component_name por seus respectivos nomes:


const Component_name = () => {

    return (

    <h1>Component_name</h1>

    );

}

export default Component_name;

Enter fullscreen mode Exit fullscreen mode

Usaremos o seguinte código para criar um arquivo index.js para exportar todos estes componentes:


export { default as Loader } from './Loader';

export { default as Navbar } from './Navbar';

export { default as Footer } from './Footer';

export { default as Welcome } from './Welcome';

export { default as Services } from './Services';

export { default as Transactions } from './Transactions';

Enter fullscreen mode Exit fullscreen mode

Em seguida, vamos nos concentrar em trabalhar na interface de usuário do cliente. Por enquanto, trataremos principalmente destes três arquivos e pastas:

  • index.css: contém nosso estilo de front-end desejado
  • pasta images: esta está localizada sob a pasta do cliente e contém nossas imagens desejadas
  • pasta components: contém nossos elementos do dashboard, como os listados acima

Agora, vamos instalar os react-icons e os pacotes ethers. O pacote ethers nos permitirá interagir com o contrato inteligente.

$ npm install react-icons ethers

Se executarmos a aplicação após a instalação, devemos ver as novas mudanças.

Construindo o contrato inteligente usando Hardhat

Hardhat é um ambiente de desenvolvimento Ethereum que é usado para executar o código Solidity localmente.

Execute o seguinte comando na pasta smart_contracts para instalar o Hardhat em sua máquina local:

npm install --save-dev hardhat @nomiclabs/hardhat-waffle ethereum-waffle chai @nomiclabs/hardhat-ethers ethers

Este comando instala as dependências necessárias para utilizar o ecossistema de desenvolvimento do Hardhat. Você vai notar que há novas pastas e arquivos na base do código. Para testar que estes estão funcionando perfeitamente, execute este comando:

npx hardhat test

Isto deve compilar o arquivo fonte Solidity agora disponível na pasta contracts no diretório principal do projeto. Ele implantará o arquivo de Solidity e testará para ver se ele funciona com sucesso.

Para construir o backend para nosso DApp, adicionaremos nosso código Solidity à pasta contracts e apagaremos o arquivo Greeter.sol.

Em seguida, criaremos um arquivo Transactions.sol e inserimos o seguinte código:


// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

// o nome do contrato é convencionalmente o mesmo que o nome do arquivo

contract Transactions {

    //transactionCounter tem o número das nossas transações

    uint256 transactionCounter;

    // nós vamos chamar o evento mais tarde

    event Transfer(address from, address receiver, uint amount, string message, uint256 timestamp, string keyword);

    // struct terá todas as propriedades dos objetos acima

    struct TransferStructure {

        address sender;

        address receiver;

        uint amount;

        string message;

        uint256 timestamp;

        string keyword;

    }

    // criar um array para armazenar transações com os objetos acima como campos

    TransferStructure[] transactions;

    function addToBlockchain(address payable receiver, uint amount, string memory message, string memory keyword) public {

        transactionCounter += 1;

        transactions.push(TransferStructure(msg.sender, receiver, amount, message, block.timestamp, keyword));

        emit Transfer(msg.sender, receiver, amount, message, block.timestamp, keyword);

    }

    function getAllTransactions() public view returns (TransferStructure[] memory) {

        return transactions;

    }

    function getTransactionCount() public view returns (uint256) {

        return transactionCounter;

    }

}

Enter fullscreen mode Exit fullscreen mode

Neste ponto, todo o backend está completo!

Agora, podemos passar aos testes e depois à implantação. Na pasta de scripts, há um sample-script.js que podemos converter para um script deploy-script.js script.

Usaremos o seguinte para o conteúdo do script deploy-script.js script:


const main = async () => {



  // Nós pegamos o contrato para implantar

  const Transactions = await hre.ethers.getContractFactory("Transactions");

  const transactions = await Transactions.deploy();

  await transactions.deployed();

  console.log("Transactions deployed to:", transactions.address);

}

const runMain = async () => {

  try {

    await main();

    process.exit(0);

  } catch (error) {

    console.error(error);

    process.exit(1);

  }

}

runMain(); 

Enter fullscreen mode Exit fullscreen mode

Você deve ter uma estrutura de projeto semelhante a esta:

Image

Testando o contrato inteligente com o Ropsten testnet

A construção do projeto está completa e o roteiro de implantação está pronto para ser executado. Entretanto, a implantação de contratos inteligentes na blockchain Ethereum garante o uso de um recurso computacional chamado gas. O gas deve ser comprado com ether, e o preço pode flutuar. Dependendo do poder do contrato inteligente, o preço pode ser um pouco ou pode ser muito.

Felizmente, o Ethereum permite o uso de ether de teste (ether falso) que pode ser usado para testar contratos inteligentes em redes de teste. Para tirar proveito disso, criaremos uma carteira Ethereum com a MetaMask. Em seguida, solicitamos o ether de teste para nossa implantação.

Depois de criar, ou entrar na sua carteira Ethereum no metamask.io, vá para Show Test Networks em Settings e selecione Ropsten Account. A seguir, copie o endereço Ropsten e navegue até faucet.egorfine.com para obter o testenet faucet.

Uma vez que você receba o eth de test em seu endereço, passaremos à implantação.

Implantação com Alchemy

Vamos implantar nosso contrato inteligente com a plataforma de desenvolvimento Alchemy Web3.

A partir do site alchemy.com, clicamos em Get started for free e registre-se para obter uma conta. Em seguida, selecionaremos a opção Ethereum + L2 e depois clicamos em Get Started.

Isto nos levará a um painel de controle onde podemos especificar as credenciais solicitadas:

Image

No painel de controle suspenso, no campo Network, selecionaremos Ropsten. Se preferir, você pode selecionar as redes Kovan ou Rinkeby; ambas permitem pedidos de eth de teste.

A seguir, seremos solicitados a escolher um plano de implantação. Como isto é uma demonstração, selecionaremos o plano FREE FOREVER por $0, Skip For Now para detalhes de pagamento e Capped Capacity para a política de escalonamento. A seguir, clique em Continue.

No painel de controle, clicamos no botão +Create App. Em seguida, adicionaremos uma descrição para o aplicativo. Estamos implantando na rede de teste Ropsten agora, mas podemos implantar este mesmo contrato na Mainnet (usando a eth principal) mais tarde.

Clique no botão View Key e copie a chave HTTP. Agora, vamos voltar ao nosso ambiente de codificação e colar a chave no arquivo hardhat.config.js na pasta smart_contract de nossa base de códigos.

Vamos formatar o arquivo para conter o seguinte código:


require("@nomiclabs/hardhat-waffle");

module.exports = {

  solidity: "0.8.0",

  networks: {

    ropsten: {

      url: 'https://eth-ropsten.alchemyapi.io/v2/HwDxJjZs10sSafsRoYKKqQ0Db1Yaexhv',

      accounts: '0xPrivateKeyToYourAccount' // replace with your private key

    }

  }

};

Enter fullscreen mode Exit fullscreen mode

Para implantar o contrato inteiro, navegaremos para nossa pasta smart_contract no terminal e executaremos o seguinte comando:

npx hardhat run scripts/deploy.js --network ropsten

Isto compilará o código e o implantará em um endereço contratual. Esse endereço contratual será especificado no terminal, e um novo arquivo Transactions.json será criado na pasta contracts.

Em seguida, faremos uma pasta utils e, em seguida, criaremos os seguintes arquivos nela:

  • constants.js
  • Transactions.json, contendo o conteúdo de Transactions.json na pasta de contratos
  • dados fictícios em um arquivo JavaScript aleatório (dummyData.js, por exemplo)

Importaremos a Interface Binária de Aplicação (ABI) do arquivo Transactions.json para o arquivo Constants.js, desta forma:


import abi from "./Transactions.json";

export const contractAddress = "0xTheGeneratedContractAddress";

export const contractABI = abi.abi;

Enter fullscreen mode Exit fullscreen mode

Uma pasta context no diretório cliente/src terá de ser conectada à blockchain. Dentro da pasta, nós escreveremos um arquivo TransactionContext.jsx que importará o seguinte:


import React, { useEffect, useState } from "react";

import { ethers } from "ethers";

import { contractABI, contractAddress } from "../utils/constants";

export const TransactionContext = React.createContext();

Enter fullscreen mode Exit fullscreen mode

Também conterá o objeto da janela Ethereum que nos permitirá administrar a conexão com a blockchain Ethereum:

const { ethereum } = window;

É isso aí! Nós construímos, testamos e implantamos nosso DApp!

Conclusão

Neste tutorial, demonstramos um processo passo-a-passo para a construção de um DApp full-stack que poderia servir como um mercado NFT ou uma plataforma de troca para negociar Ethereum. Mostramos como estruturar um projeto DApp full-stack e detalhamos os requisitos e o processo para construir, testar e implantar um contrato inteligente Solidity.

Espero que tenham gostado deste tutorial. Para melhorar ainda mais suas habilidades de desenvolvimento da Web3, tente construir este projeto por você mesmo usando este artigo como guia.

Visibilidade total na produção de Aplicações React

Depuração de Aplicações React podem ser difíceis, especialmente quando os usuários experimentam problemas difíceis de reproduzir. Se você estiver interessado em monitorar e rastrear o estado do Redux, automaticamente navegarr por erros JavaScript e rastrear solicitações de redes lentas e tempo de carga de componentes, experimente o LogRocket.

Image

LogRocket é como um DVR para aplicativos web e móveis, gravando literalmente tudo o que acontece em seu aplicativo React. Em vez de adivinhar por que os problemas acontecem, você pode agregar e relatar em que estado seu aplicativo estava quando um problema ocorreu. O LogRocket também monitora o desempenho de seu aplicativo, relatando com métricas como carga de CPU do cliente, uso de memória do cliente, e muito mais.

O pacote de middleware LogRocket Redux acrescenta uma camada extra de visibilidade em suas sessões de usuário. O LogRocket registra todas as ações e estados de suas lojas Redux.

Modernize como você depura suas aplicações React – comece a monitorar de graça

Junte-se a organizações como Bitso e Coinsquare que usam LogRocket para monitorar proativamente seus aplicativos Web3

Problemas do lado do cliente que afetam a capacidade dos usuários de ativar e transacionar em seus aplicativos podem afetar drasticamente seus resultados. Se você estiver interessado em monitorar problemas de UX, automaticamente navegar por erros JavaScript e rastrear solicitações de rede lentas e tempo de carga de componentes, experimente o LogRocket.

Image

https://logrocket.com/signup/

LogRocket é como um DVR para aplicativos web e móveis, gravando tudo o que acontece em seu aplicativo web ou site. Em vez de adivinhar por que os problemas acontecem, você pode agregar e relatar as principais métricas de desempenho do frontend, reproduzir as sessões do usuário junto com o estado do aplicativo, registrar as solicitações da rede e automaticamente detectar todos os erros.

Modernize como você depura aplicações web e móveis – comece a monitorar de graça

Artigo escrito por MacBobby Chibuzor. A versão original pode ser encontrada aqui. Traduzido e adaptado por Dimitris Calixto.

Oldest comments (0)