Roadmap
Avançado

𝕏 (Twitter) Descentralizado

Crie um clone do twitter na blockchain

ethers
solidity
vue
tailwind
vercel
github

Como salvar dados em variáveis no contrato inteligente

Agora que temos todo nosso ambiente para testar localmente podemos começar colocar a mão na massa.

Lembre-se que a blockchain é como se fosse uma nuvem (AWS, GCP, Azure, etc) e o contrato inteligente é como se fosse uma API. Aqui que vamos escrever as funções a serem executadas na blockchain.

Agora, vamos atualizar o arquivo XPost.sol com os seguintes trechos de código:

XPost.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.19;

import "hardhat/console.sol";

contract XPost {
    uint256 totalPosts;

    constructor() {
        console.log("Eu serei o contrato inteligente para fazer um post no Twitter descentralizado.");
    }

    function createPost() public {
        totalPosts += 1;
        console.log("%s criou o post!", msg.sender);
    }

    function getTotalPosts() public view returns (uint256) {
        console.log("Eu tenho %d posts!", totalPosts);
        return totalPosts;
    }
}
Clique aqui para expandir

Como diria o Rodrigo Goes: "Wooow, look at this!". Nesse código criamos duas funções, a função de createPost que basicamente só está aumentando o número do totalPosts e retornando o endereço do usuário que criou o post com o msg.sender.

Só lembrando que a variável totalPosts é especial porque não é uma variável comum, ela vai ser inicializada como 0 (zero) quando a gente fizer o deploy do contrato, mas sempre que atualizarmos o contrato em produção ela não será resetada, ela age como uma variável, mas ao mesmo tempo uma célula no banco de dados.

Uma coisa interessante do msg.sender é que você consegue retornar o endereço da carteira conectada que realizou aquela função, que te permite criar regras para permitir ações somente de uma carteira específica.

Atualizando o script run.js para rodar o código novo

Nós precisamos atualizar as funções dentro do arquivo run.js pois adicionamos mais coisas no contrato inteligente.

Você pode perceber que dentro do run.js tem uma função waitForDeployment() e, depois que essa função for executada, você pode chamar qualquer função nova que criou no seu contrato inteligente. Então, vamos fazer as seguintes atualizações:

run.js
const main = async () => {
  const [owner] = await hre.ethers.getSigners();
  const xPost = await hre.ethers.deployContract("XPost");
  await xPost.waitForDeployment();

  console.log("Deploy do contrato no endereço:", xPost.target);
  console.log("Deploy do contrato feito por:", owner.address);

  await xPost.getTotalPosts();

  const waveTxn = await xPost.createPost();
  await waveTxn.wait();

  await xPost.getTotalPosts();
};

const runMain = async () => {
  try {
    await main();
    process.exit(0);
  } catch (error) {
    console.log(error);
    process.exit(1);
  }
};

runMain();
Clique aqui para expandir

O que mudou com essas atualizações? 🤔

Toda vez que subirmos um contrato inteligente numa blockchain, seja ela local (sua máquina) ou não, nós usaremos uma carteira blockchain.

O hardhat faz esse processo automaticamente, então nesse código const [owner] = await hre.ethers.getSigners(); nós estamos pegando o endereço da carteira que o Hardhat usou para fazer o deploy do contrato.

Nós também adicionamos as funções getTotalPosts, createPost e getTotalPosts, respectivamente. Isso é para mostrar que quando iniciarmos o contrato ele vai ter 0 posts. Depois vamos criar um post (que na verdade não é um post ainda, só incrementar o contador) e vamos verificar que o número aumentou depois do post ser criado.

Agora você vai rodar o script npx hardhat run scripts/run.js no seu terminal e vai verificar que a última mensagem vai mostrar Eu tenho 1 posts como nesse print aqui:

Dica: se você atualizar o arquivo run.js colocando várias funções de createPost, você verificará que o número na mensagem Eu tenho {número} posts atualizará.

Opa, calma aí!

Parece que você não está logado, caso tenha interesse em salvar seu progresso de estudo faça login agora.