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:
// 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;
}
}
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:
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();
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 decreatePost
, você verificará que o número na mensagemEu tenho {número} posts
atualizará.