WEB3DEV

Dione Bastos
Dione Bastos

Posted on • Atualizado em

Criando um smart contract com Vyper

O artigo a seguir foi escrito por Dione Bastos.

O mercado web3 tem uma alta demanda para desenvolvedores de contratos inteligentes, dentre as tecnologias mais buscadas temos o Solidity que é a linguagem utilizada para criação de smart contracts com o blockchain Ethereum.

Só que o solidity não é a única linguagem para criar contratos na EVM (Máquina Virtual Ethereum), também podemos escrevê-los utilizando o Vyper que possui uma sintaxe muito semelhante ao Python.

Lembrando que ambas são linguagens de alto nível e necessitam de um compilador que transformará nosso contrato em um bytecode que a EVM consiga entender.

O vyper ainda não é tão popular pelo fato de ser uma linguagem relativamente nova, também não possui tantos recursos como o solidity, mas isso não quer dizer que o vyper é pior que o solidity, na verdade, isso é proposital. O objetivo do vyper é ser uma linguagem menos complexa e mais segura para contratos inteligentes, dificultando a escrita de códigos fraudulentos ou vulneráveis por acidente.

De fato, as três principais características do vyper, são:

  • Simplicidade;
  • Segurança;
  • Auditabilidade.

Agora que você conhece um pouco do vyper, vamos codar...

Nesse tutorial irei utilizar o Remix IDE, que irá me ajudar a implantar o contrato de forma mais rápida e prática, você também pode utilizar alguma outra ferramenta de desenvolvimento local (visual estúdio, Atom, VI, etc), para escrever contratos com o vyper.

Image description

Repare que o remix já inicia com 3 contratos simples, você pode apaga-los.

Na pasta contracts, crie um arquivo com nome MyContract.vy. Este será o arquivo do nosso contrato. A extensão 'vy' identifica que o contrato utiliza a linguagem vyper.

Image description

Em seguida cole o seguinte comando no seu arquivo MyContract.vy, que irei explicar em detalhes.

userName: public(String[100])

@external
def __init__(name: String[100]):
    self.userName = name

@view
@external
def getUserName() -> String[100]:
    return self.userName
Enter fullscreen mode Exit fullscreen mode

O puglin do vyper no remix não me obriga a informar a versão do compilador pragma - responsável por compilar meu contrato para bytecode - Por isso, meu código compila com ou sem a versão informada. Já em um desenvolvimento local recomendo informar a versão que você está utilizando, para evitar incompatibilidades, dessa forma:

# @version ^0.2.0
Enter fullscreen mode Exit fullscreen mode

Image description

Primeiramente, declaramos a variável userName que usaremos para guardar nosso nome, mas fique a vontade para escrever o que quiser. Como iremos usar palavras e não valores numéricos, precisamos especificá-la como string e ela aceitará até 100 caracteres.

userName: public(String[100])
Enter fullscreen mode Exit fullscreen mode

O próximo bloco mostra uma função do tipo @external, que só pode ser chamada de fora. O objetivo dela é capturar algum valor digitado pelo usuário e salvar na variável userName.

@external
def __init__(name: String[100]):
    self.userName = name
Enter fullscreen mode Exit fullscreen mode

O parâmetro __init__ significa que ele é o método construtor do contrato e será iniciada no deploy.

A última função também é uma função @external e do tipo @view que não tem poder para alterar nenhum dado no blockchain, apenas consumir algo já existente. Iremos utilizá-la para retornar o valor salvo na variável userName.

@view
@external
def getUserName() -> String[100]:
    return self.userName
Enter fullscreen mode Exit fullscreen mode

Antes de compilar nosso contrato e verificar se possui algum problema, precisamos instalar o plugin do vyper no remix. Clique no ícone de plugue.

Image description

Pesquise por Vyper, em seguida clique em activate:

Image description

Em seguida, clique no ícone do Vyper, vá na aba Remote Compiler depois clique em compile contracts/MyContract.vy.

Image description

Você deverá ver isso:

Image description

Repare que agora o ícone do vyper está com um símbolo de verificado, isso significa que nosso código não tem nenhum problema de sintaxe. Note que ele também gerou para nós, o código ABI do nosso contrato, ele é muito importante na construção de dapps, é com a ABI que podemos interagir com nosso contrato utilizando outras ferramentas ou linguagens externas, como, por exemplo, javasript. Agora que compilamos nosso contrato já podemos realizar o deploy para o blockchain.

Para isso utilizamos o remix com a opção Injected Provider, que irá requisitar a conexão com a nossa carteira:

Image description

Conecte a sua carteira, mas lembre-se de utilizar uma rede de testes para não gastar dinheiro de verdade, a carteira do exemplo está utilizando a rede Goerli (Rede de testes da Ethereum).

Image description

Antes do deploy vamos conferir os dados:

  • Account: é o endereço da carteira conectada;
  • Contract: é o arquivo que será usado para efetuar o deploy;
  • Deploy > Name: é o campo do nosso método construtor, onde iremos passar algum valor e ele será executado junto ao deploy;
  • Transact: Realiza o deploy conforme a rede conectada;

Para realizar o deploy basta clicar em transact, em seguida sua carteira será chamada para efetuar o deploy e pagar a taxa correspondente.

Image description

Pronto, a partir de agora iremos interagir com um contrato que já está implantado no blockchain. Do lado esquerdo temos as duas funções externas, uma para alterar o valor da variável userName e outra para capturar o que foi salvo. Do lado direito podemos ver a transação que foi realizada:

Image description

Clicando na primeira função que é apenas de leitura eu consigo visualizar o valor iniciado no contrato, repare também que ele não me custou gás para ser chamado:

Image description

Agora você deve está se perguntando, é só isso?

Sim, a implantação de um contrato com o vyper é extramente simples, claro que nesse caso nosso contrato foi menos complexo, para algo de escalar maior você precisará utilizar de métodos mais rebuscados e com um ambiente mais controlado que o remix. 🤓💻

Latest comments (0)