🚩 Nesse tutorial vamos criar, testar e “deployar” um contrato escrito em Vyper usando o framework ApeWorx.
Sumário
1 . Tecnologias que usaremos
2 . Comparações
3 . Ambiente
4 . Contrato: Vyper
4.1. Crie a variável flip
4.2. Crie o evento Fliped
4.3. Crie o construtor init
4.4. Crie a função flipping
5 . Contrato completo
6 . Testes: Ape + Python + Pytest
6.1. Crie as fixtures em conftest.py
6.2. Crie os testes em test flipper.py
6.3. Teste o estado inicial do contrato
6.4. Teste o estado do contrato após um flipping
6.5. Teste se o contrato emite um evento após ser flipado
7 . Deploy
💾 Tecnologias que usaremos:
-
Vyper: linguagem para criar o contrato -
Pyteste: framework de testes para linguagemPython -
ApeWorX: framework de “workflow” para construir contratos usando a linguagemPython
⚠️ Referências
Meu Repositório Flipper
Documentação do Ganache
Documentação do ApeWorX
Academy do ApeWorX
🔄 Comparações
Solidityestá para oVyperassim como oHardHatestá para oApeWorX
Jestestá para oPytestassim como oJavaScriptestá para oPython
Brincadeiras a partes, o workflow para escrever contratos é mesmo independente da stack:
- Escrever o contrato.
- Testar automatizadamente.
- Efetuar deploy local >> testnet >> mainnet.
O contrato consiste apenas em salvar um variável “boolena” que tem a possibilidade de trocar de estado, ou seja, “flipar” quando alguém chama uma função do contrato. Portanto, nosso contrato terá apenas uma variável um evento e uma função.
🌳 Ambiente:
🚨 Instale o Python antes
🚨 Instale também o Ganache
Instale o ApeWorX:
pip install eth-ape
ou
poetry add eth-ape
E o plugin do Vyper:
ape plugins install vyper
Crie um pasta vazia e “rode”:
ape init
O terminal vai te pedir o nome do projeto, em seguida “dê enter”.
O ape criará uma estrutura de diretórios para você:
contracts/
interfaces/
scripts/
tests/
ape-config.yaml
Por fim precisamos adicionar um plugin para que o ape baixe o compilador do Vyper, por padrão ele tem apenas o compilador do Solidity.
Abra o arquivo ape-config.yaml e adicione o seguinte:
name: flipper
plugins:
- name: vyper
🐍 Contrato: Vyper
Crie um arquivo no diretório contracts chamado Flipper.vy.
🚨 Você pode trocar os nomes, se souber o que está fazendo
Crie a variável flip
flip: public(bool)
- As variáveis globais do contrato são declaradas no início e depois acessadas com
self.nome_da_variável, nesse caso:self.flip. - O
Vypergera umgetterautomaticamente quando a declaração da variável usa opublic.
Crie o evento Fliped
event Fliped:
state: bool
- Evento é um recurso que possibilita o envio de dados em tempo real a partir de um full-node para um cliente qualquer.
- Aqui ele será usado para notificar quando o estado do
flipfor alterado.
Crie o construtor init
@external
def __init__():
self.flip = True
- O decorator
externalrestringe a função a ser chamada apenas via transação ou por outro contrato e não pode ser chamada internamente. -
__init__é o construtor default do Python. -
selfaqui indica que a variável “é do próprio contrato”,selfé o mesmo quethisem outras linguagens. - Um contrato em
Vyperé como criar uma classe emPython.
Crie a função flipping
@external
def flipping() -> bool:
self.flip = not self.flip
log Fliped(self.flip)
return self.flip
- A função
flippingacessa oflippor meio doselfe “flipa” o valor dela, se fortrue“vira”falsee o inverso. - Depois envia o evento
Flipedpara notificar que o estado do contrato foi alterado. - Por fim retorna o novo estado do contrato.
🏁 Contrato completo
# @version ^0.3.0
flip: public(bool)
event Fliped:
state: bool
@external
def __init__():
self.flip = True
@external
def flipping() -> bool:
self.flip = not self.flip
log Fliped(self.flip)
return self.flip
🧪 Testes: Ape + Python + Pytest
Agora testaremos o contrato para saber se ele se comporta como esperamos, para isso usaremos o Ape, Pytest e Python.
🚨 Você pode usar outro framework, se souber o que está fazendo
-
Pythoné a linguagem de programação, assim como oJavaScript. -
Pytesté o mais maduro framework de teste do ambientePython, assim como oJest. -
ApeWorXé um framework escrito emPythonpara compilar, testar, e implantar contratos, assim como oHardHat.
No diretório tests crie dois arquivos:
tests/
conftest.py
test_flipper.py
-
conftest.pyé o primeiro arquivo que oPytestvai procurar para iniciar os testes, nele configuraremos nossas fixtures, não mude o nome desse arquivo. -
test_flipper.pyé onde vamos escrever os testes do contrato, pode trocar por qualquer nome que comece comtest_*.pyou termine com*_test.py.
Crie as fixtures em conftest.py
from pytest import fixture
@fixture
def owner(accounts):
return accounts[0]
@fixture
def another(accounts):
return accounts[1]
@fixture
def flipper(project, owner):
return owner.deploy(project.Flipper)
-
Fixtureé um tema massa por si só, de forma simples, são funções que vão ser executadas antes dos testes principais e que podemos usar seu retorno nos testes. -
ownergera um endereço aleatório que vamos usar para “deployar” o contrato. -
anothergera um endereço aleatório que vamos usar “chamar” com o contrato. -
flipperé a instância do contrato depois de “deployar”.
Crie os testes em test flipper.py
✅ Teste o estado inicial do contrato
def test_flipper_initial(flipper):
assert flipper.flip() == True
- Aqui vamos validar se o contrato realmente inicia com o valor de
flipcomotrue.
✅ Teste o estado do contrato após um flipping
def test_change_flip(flipper, another):
flipper.flipping(sender=another)
assert flipper.flip() == False
- Depois de
another“flipar” nosso contrato o estado deve inverter parafalse.
✅ Teste se o contrato emite um evento após ser flipado
def test_get_fliped_event(flipper, another):
tx = flipper.flipping(sender=another)
event_list = tx.decode_logs(flipper.Fliped)
event = event_list[0].event_arguments
assert event == {"state": False}
- Depois de
another“flipar” nosso contrato armazenamos o retorno emtx. -
txcontém os logs do momento que a transaçãoflippingfoi feita. - Então precisamos fazer o decode do nosso evento.
- Por fim, pegamos o primeiro evento e comparamos se ele tem a chave
statee o valorfalse.
🚀 Deploy
Por fim faremos o deploy em uma rede local usando o ganache.
Coloque no arquivo ape-config.yaml:
geth:
ethereum:
mainnet:
uri: http://127.0.0.1:8545
Agora precisamos de uma carteira que tenha ETH para fazer o deploy.
Inicie o ganache que ele irá gerar algumas.
ganache -s "SEED"
⚠️ Usando o -s podemos passar um valor qualquer para que o ganache crie carteiras de forma determinística
Pegue uma chave privada do ganache e ⚠️ abra outro terminal para importar ela no ape:
ape accounts import my_wallet
Enter Private Key: COLE_A_CHAVE_PRIVADA_AQUI
Create Passphrase: CRIE_UMA_SENHA
Repeat for confirmation: CRIE_UMA_SENHA
SUCCESS:
A new account 'SEU_ENDEREÇO_AQUI'
has been added with the id 'my_wallet'
Por último coloque no arquivo scripts/deploy.py o conteúdo do deploy:
def main():
from ape import project, accounts
owner = accounts.load("my_wallet")
owner.deploy(project.Flipper)
Para “deployar” o contrato “rode” no terminal:
ape run deploy --network ::geth
⚠️ Lembrando que o ganache precisa estar “rodando”
⏭ Próximos passos
- Interagir com seu contrato pelo console.
- Lançar o contrato em uma testnet.
Abrace a oportunidade de elevar sua jornada de desenvolvimento para um nível superior. Codar contratos em Vyper é apenas o começo; os builds incríveis da WEB3DEV representam a chave de entrada para o emocionante cenário web3. 🚀🧑💻
Não perca tempo, 👉inscreva-se👈 agora mesmo e comece a desbravar o universo Blockchain!
Seja também WEB3DEV!




Top comments (0)