JavaScript required
We’re sorry, but Coda doesn’t work properly without JavaScript enabled.
Skip to content
Gallery
blockchain
timeline of technology
web 3.0
elements of computing
cryptography
DLT
fabric network
web3dev
money definition...
More
Share
Explore
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
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
usando
hardhat.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
https://hardhat.org/advanced/hardhat-runtime-environment.html
executando o contrato na rede local
npx hardhat run scripts/run.js
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
// aqui pegamos o endereço da carteira do proprietário do contrato
//e também um endereço aleatório (que chamamos de
randomPerson)
const
waveContractFactory
=
await
hre
.
ethers
.
getContractFactory
(
"WavePortal"
);
const
waveContract
=
await
waveContractFactory
.
deploy
();
await
waveContract
.
deployed
();
console.
log
(
"Contract deployed to:"
,
waveContract
.
address
);
console.
log
(
"Contract deployed by:"
,
owner
.
address
);
//para ver o endereço da pessoa que está fazendo o deploy do nosso contrato
let
waveCount
;
waveCount
=
await
waveContract
.
getTotalWaves
();
let
waveTxn
=
await
waveContract
.
wave
();
await
waveTxn
.
wait
();
waveCount
=
await
waveContract
.
getTotalWaves
();
};
const
runMain
=
async
()
=>
{
try
{
await
main
();
process
.
exit
(
0
);
}
catch
(
error
)
{
console.
log
(
error
);
process
.
exit
(
1
);
}
};
runMain
();
chamamos a função
mudamos a variável de estado
lemos o novo valor da variável
testando acessar a função com outro usuário
itens adicionados ao bloco de código script/run.js
waveTxn
=
await
waveContract
.
connect
(
randomPerson
).
wave
();
await
waveTxn
.
wait
();
waveCount
=
await
waveContract
.
getTotalWaves
();
mantendo rede local ativa (assim contagem não recomeça)
npx hardhat node
Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/
Accounts
========
WARNING: These accounts, and their private keys, are publicly known.
Any funds sent to them on Mainnet or any other live network WILL BE LOST.
Account #0: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 (10000 ETH)
Private Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
...
Account #19: 0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199 (10000 ETH)
Private Key: 0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e
WARNING: These accounts, and their private keys, are publicly known.
Any funds sent to them on Mainnet or any other live network WILL BE LOST.
hardhat nos deu 20 contas para trabalhar e deu a todas elas 10.000 ETH
deploy na rede local
ato de enviar código fonte do contrato inteligente, do seu computador para a blockchain.
scripts/deploy.js
const
main
=
async
()
=>
{
const
[
deployer
]
=
await
hre
.
ethers
.
getSigners
();
const
accountBalance
=
await
deployer
.
getBalance
();
console.
log
(
"Deploying contracts with account: "
,
deployer
.
address
);
console.
log
(
"Account balance: "
,
accountBalance
.
toString
());
const
Token
=
await
hre
.
ethers
.
getContractFactory
(
"WavePortal"
);
const
portal
=
await
Token
.
deploy
();
await
portal
.
deployed
();
console.
log
(
"WavePortal address: "
,
portal
.
address
);
};
const
runMain
=
async
()
=>
{
try
{
await
main
();
process
.
exit
(
0
);
}
catch
(
error
)
{
console.
error
(
error
);
process
.
exit
(
1
);
}
};
runMain
();
toda vez que você fizer uma mudança no código enquanto estiver desenvolvendo, você precisa fazer um deploy.
enquanto desenvolvemos, fazemos vários deploys locais
npx hardhat run scripts/deploy.js --network localhost
endereço contrato rede local = 0x5FbDB2315678afecb367f032d93F642f64180aa3
implantamos contrato e temos seu endereço na blockchain!
nosso site vai precisar disso para saber onde procurar contrato na blockchain
na janela do terminal com a rede local ativa
primeiro bloco registrado na
blockchain local
, que consumiu recursos para ser gerado
Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
Ctrl
P
) instead.