bootcamp 1 - solidity

ambiente

git
node.js (+yarn)
hardhat
criar uma rede Ethereum local
fornecer ETH de teste falso e contas de teste falsas para trabalhar
compilar smart contracts e testar em blockchain local

cd code/w3dB1
npm init -y
Wrote to /code/w3dB1/package.json:
{
"name": "w3dB1",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
npm install --save-dev hardhat
npx hardhat
> create a basic sample project
npm install --save-dev @nomiclabs/hardhat-waffle ethereum-waffle chai @nomiclabs/hardhat-ethers ethers
npx hardhat accounts

endereços Ethereum gerados pelo hardhat para simular usuários reais na blockchain
0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
0x70997970C51812dc3A010C7d01b50e0d17dc79C8
0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
0x90F79bf6EB2c4f870365E785982E1f101E93b906
0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65
0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc
0x976EA74026E726554dB657fA54763abd0C3a0aa9
0x14dC79964da2C08b23698B3D3cc7Ca32193d9955
0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f
0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
0xBcd4042DE499D14e55001CcbB24a551F3b954096
0x71bE63f3384f5fb98995898A86B02Fb2426c5788
0xFABB0ac9d68B0B445fB7357272Ff202C5651694a
0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec
0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097
0xcd3B766CCDd6AE721141F452C550Ca635964ce71
0x2546BcD3c84621e976D8185a91A922aE77ECEc30
0xbDA5747bFD65F08deb54cb465eB87D40e51B197E
0xdD2FD4581271e230360230F9337D5c0430Bf44C0
0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199
npx hardhat compile
npx hardhat test
image.png

smart contract → contracts/WavePortal.sol

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;
//versão do compilador dessa pra cima

import "hardhat/console.sol";
//usando harhat pra logar mensagens no console
//funcionalidade instalada na pasta node_modules

contract WavePortal {
constructor() {
console.log("contrato inteligente? desde quando advogado escreve algo inteligente? :p");
}
}
//contratos inteligentes parecem uma 'classe' em outras linguagens

próximos passos

compilar contrato
implantar contrato em blockchain local
daí o console.log vai rodar :)
no mundo real, contratos inteligentes vivem na blockchain
queremos que nosso site e contrato inteligente sejam usados por pessoas reais
para que elas possam dar tchauzinho ou fazer XYZ
então, trabalhando localmente, queremos imitar esse ambiente

script para executar contrato na rede local → scripts/run.js

const main = async () => {
const waveContractFactory = await hre.ethers.getContractFactory("WavePortal");
//compila contrato e gera arquivos necessários para trabalhar com contrato na pasta artifacts
//HRE = Hardhat Runtime Environment, objeto que contém todas as funcionalidades hardhat
//todo comando que começa com npx hardhat, cria um objeto hre usandohardhat.config.js
const waveContract = await waveContractFactory.deploy();
//hardhat cria rede Ethereum local que é excluida depois que script chega no fim
//facilita a depuração dos erros
//waveContractFactory.deploy implanta contrato na blockchain!
await waveContract.deployed();
//espera contrato ser oficialmente implantado na blockchain local!
//constructor é executado quando fazemos deploy
console.log("Contract deployed to:", waveContract.address);
//dá o endereço do contrato na blockchain
};

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

runMain();
para aprender mais sobre hardhat runtime environment

executando o contrato na rede local

npx hardhat run scripts/run.js
image.png

alterando o contrato

uma blockchain é como um provedor de nuvem, como a AWS
executada pelo poder computacional de máquinas de mineração em todo o mundo
um contrato inteligente é como o código do nosso servidor com diferentes funções,
um software público que qualquer pessoa pode executar.
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

import "hardhat/console.sol";

contract WavePortal {
uint256 totalWaves;
//variável totalWaves é inicializada automaticamente em zero
//é uma "variável de estado" armazenada permanentemente na área de armazenamento do contrato

constructor() {
console.log("inteligente? desde quando advogado escreve algo inteligente?");
}

function wave() public {
//função fica disponível para ser chamada na blockchain se usamos a palavra-chave especial public
//como um endpoint de API pública :)
totalWaves += 1;
console.log("%s deu um beijo!", msg.sender);
//este é o endereço da carteira da pessoa que chamou a função, como autenticação embutida
//para chamar uma função de um contrato inteligente você precisa estar conectado com uma carteira válida!
//podemos escrever funções que apenas determinados endereços de carteira podem acessar
}

function getTotalWaves() public view returns (uint256) {
console.log("temos um total de %d beijo(s)!", totalWaves);
return totalWaves;
}
}

alterando scripts/run.js pra testar funções do novo contrato

const main = async () => {
const [owner, randomPerson] = await hre.ethers.getSigners();
//pra fazer o deploy de algo na blockchain, precisamos ter um endereço de carteira!
//hardhat faz isso em segundo plano
Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.