A primeira parte de uma série de artigos sobre como ler smart contracts. Este tutorial é feito principalmente para entusiastas que desejam aprender a entender o mundo das criptomoedas, mas não possuem um conhecimento profundo de protocolos, mecanismos internos de blockchains, etc.
Este material foi criado por Alex Kruegger (Telegram: @kruegger), autor do AK74-Lab Telegram Channel. Traduzido pela equipe do projeto swap.net.
Noções básicas de DeFi
smart contracts
Um smart contract é um código que é executado em nós da blockchain e o resultado da execução (se especificado no programa) é armazenado na blockchain em um repositório especial - dados de persistência. O código do smart contract, uma vez carregado na blockchain, é bloqueado adicionalmente para evitar quaisquer alterações acidentais ou intencionais no código.
As funções de um smart contract podem ser chamadas de fora (da carteira do usuário ou de outro contrato) e divididas em dois grandes grupos:
- Não alterar os dados de persistência (somente leitura do blockchain)
- Alterando os dados de persistência
Chamar o primeiro grupo de funções não tem custo de gas ou dinheiro e não vai além do nó mais próximo (Balance of, TotalSupply, Allowance). Na BSC scan, essas funções estão no guia “READ”.
Chamar o segundo grupo de funções se transforma em uma transação completa, que é extraída, incluída no bloco e cujo resultado é gravado na blockchain (Approve, Transfer, TransferFrom). Na BSC scan, essas funções estão na guia “WRITE”.
Blockchains de estado
Ethereum e Blockchains baseados em Ethereum (Polygon, BSC, etc.) são blockchains de estado. Cada endereço armazena na blockchain o valor de seu saldo na moeda nativa da blockchain (ETH, BNB, MATIC, etc.). Cada smart contract armazena na blockchain os valores de suas variáveis persistentes. O estado atual da blockchain é descrito pelo saldo de todos os endereços existentes na rede e os valores atuais das variáveis de persistência de todos os smart contracts na blockchain.
Contas
A Seed-Phrase (12 palavras) que você anotou quando criou sua carteira é transformada em uma chave privada usando o protocolo BIP 39, que é transformado em uma chave pública usando o ECDSA (Elliptic Curve Digital Signature Algorithm), que é transformado em seu endereço na blockchain usando hashing e trimming.
Seed-Phrase →Chave Privada →Chave Pública →Endereço
Você sempre obterá o mesmo endereço com seu saldo da mesma frase inicial. Para transferir sua conta para outra carteira (MetaMask, Trust Wallet, SafePal, Coin98, etc.) você só precisa restaurar sua conta na nova carteira usando a Seed-Phrase salva. Guarde essa frase com cuidado, pois ela dá acesso total à sua conta.
Onde estão os Tokens?
Para cada conta (endereço), a blockchain armazena apenas o saldo desse endereço na moeda blockchain nativa e pronto. O saldo do seu endereço em cada token comprado é armazenado no smart contract desse token na tabela de saldos — o endereço/saldo em tokens.
Na BSC scan esta tabela é exibida na aba “HOLDERS”.
O token deve ser adicionado à sua carteira para que o saldo apareça. Após a adição, a carteira consulta o smart contract do token para o saldo atual da sua conta e o exibe na interface.
Um endereço – muitas chains
Ethereum foi a primeira blockchain construída em torno da ideologia dos smart contracts. Ela gerou muitos clones que diferem uns dos outros apenas pelo algoritmo de consenso e gas de transação. É por isso que você pode usar o mesmo endereço para blockchains BSC, Ethereum, Polygon.
Imagine estar na estação de trem segurando um bilhete 0x…bc19. Existem muitas plataformas ao seu redor chamadas Ethereum, BSC, Polygon, etc. Perto delas existem diferentes ferrovias e trens: movidas a carvão, reator nuclear, alguns ainda puxados por cavalos. Mas cada um está sobre trilhos, há locomotivas e vagões por toda parte. E seu bilhete sempre te garante um assento em qualquer vagão em qualquer plataforma.
Para resumir o que foi dito acima
A chave para a conta é uma Seed Phrase / Chave secreta que identifica o endereço online e dá acesso total à conta.
O saldo do token está no smart contract desse token
Você pode usar um endereço para todos as blockchains baseadas em Ethernet.
Um smart contract é um programa intangível + dados variáveis armazenados em uma blockchain
Um smart contract tem dois grupos de funções que podem ser chamadas de fora — aquelas que não alteram o estado da blockchain (READ) e aquelas que mudam (WRITE).
Interface ERC 20/BEP 20 como base de um contrato simbólico, uma divisão das funções do contrato.
O que é uma Interface
Interface — uma descrição de influências externas (controles) em algum objeto e as reações do objeto a esse controle.
Por exemplo, dirigir um carro. A interface é um conjunto de controles (volante, pedais, caixa de câmbio) e as respostas do carro ao uso desses controles.
Interface ERC-20
No momento, muitos tokens já foram criados e estão sendo criados todos os dias. Podemos interagir com qualquer token da mesma forma — enviar, trocar, aprovar, etc. Então, como ocorre essa unificação?
O token deve “implementar” a interface ERC 20/BEP 20. Implementar significa que um smart contract de token deve conter um conjunto definido de funções e parâmetros com uma reação inequívoca (o que um smart contract deve fazer) para cada uma dessas funções.
Interface do padrão ERC20 conforme definido no EIP.
FUNÇÕES:
- totalSupply()
- balancef(conta)
- transfer(destinatário, valor)
- transferFrom(remetente, destinatário, valor)
- allowance(proprietário, gastador)
- approve(gastador, valor)
EVENTOS:
Transferência (de, para, valor)
Aprovação (proprietário, gastador, valor)
Cada chamada de função tem mais dois parâmetros:
msg.sender — endereço de onde veio a transação (quem chamou a função)
msg.value — a quantidade de tokens (ETH/BNB) enviados com a transação
EVENTO — uma maneira de passar informações de um smart contract para o programa web3 que chamou o contrato. Como uma caixa de seleção para dizer que tal operação foi feita.
Descrição das funções do ERC-20
Vamos dividir 6 funções em dois grupos:
Funções READ (somente leitura na blockchain):
totalSupply() — mostra a emissão total do token
balance Of(conta) — mostra o saldo da conta de endereço
allowance(proprietário, gastador) — mostra a quantidade total de tokens que o proprietário permitiu que o gastador debitasse (verifique aprovar)
Funções WRITE (alterando a blockchain):
transfer(recipient, amount)- transfere o valor do token do msg.sender para o destinatário
transferFrom(remetente, destinatário, valor)- transfere o valor do token do remetente para o destinatário
approve(gastador, valor)- permite que o gastador debite o valor do token do saldo do msg.sender. (verificar abono)
Para resumir o que foi dito acima
Existe um padrão ERC-20 que descreve a interface (funções, seus parâmetros e valores de retorno) que deve implementar um smart contract para ser chamado de token.
Se um smart contract implementa a interface ERC-20, podemos usá-lo sempre que pudermos usar o token - enviar para DEX, enviar para outra pessoa, queima-lo, etc. E não importa o que o contrato realmente é.
Se algo se parece com um pato, anda como um pato e grasna como um pato, podemos usá-lo como um pato, não importa o que realmente seja
O que acontece ao trabalhar com um contrato / Exemplo
Exemplo:
- Ben decide criar seu próprio token. Ele pega a implementação mais padrão do ERC20, altera o nome, número (1.000), prescreve que todos os 1.000 tokens devem ser destinados (transferidos) a ele ao criar o contrato e implanta o smart contract na blockchain.
Um smart contract executa uma função de construtor (uma função especial que é executada uma vez quando um contrato é implantado) que inicializa variáveis internas, cria duas tabelas vazias - saldos e subsídios e, em seguida, chama a função mint, que cria a primeira linha nos saldos:
- BEN - 1000
E ele está terminando o trabalho. O contrato está pronto.
- Ben decide dar a seus amigos Ivan e Jake 100 tokens cada.
A carteira de Ben inicia duas transações no smart contract do token: transfer(Ivan, 100) e transfer(Jake, 100). Nesse caso, quem deve ser debitado com as moedas é determinado por quem enviou a transação — o saldo de Ben (msg.sender).
O smart contract simplesmente altera a tabela adicionando duas novas linhas e alterando o valor de Ben:
- BEN - 800
- IVAN - 100
JAKE - 100
Ben decide colocar o token na DEXchange, então ele vai para a pancake(por exemplo) e cria um par de liquidez do Token-BNB (800 tokens - 2 BNB).
O roteador Pancake cria um par de liquidez, Ben transfere 800 tokens e 2 BNB para ele, como resultado, em algum lugar no outro universo, uma linha CAKE-LP-Token — 2 aparece no contrato BNB, e a tabela de contrato do token agora se parece com isso:
- BEN - 0
- IVAN - 100
- JAKE - 100
Roteador CAKE-LP-Token/Pancake — 800
(Na BSC scan podemos ver a liquidez nos titulos)Ivan decide comprar mais 100 tokens, vai ao Pancake, diz “quero comprar 100 tokens para BNB”
O roteador Pancake pede ao par de liquidez a taxa de câmbio atual do token para o BNB (usando o algoritmo AMM) e diz a Ivan: “Vai custar 0,25 BNB + taxa”.
- Ivan envia 0,25 BNB para a Pancake e aguarda seus tokens.
O roteador Pancake vê que o dinheiro chegou e cria uma transação no smart contract do token : transfer(Kolya, 100) em nome do par LP.
O smart contract atende à solicitação debitando a conta do par e creditando a conta de Ivan. O resultado:
- BEN - 0
- IVAN - 200
- JAKE - 100
- CAKE-LP-Token - 700
O roteador pancake envia 0,25 _BNB para a outra ponta do universo e na outra parte do par LP no contrato BNB o valor do saldo do par CAKE-LP-Token aumenta de 2 para 2,25
- Neste momento Jake decide vender todos os tokens e comprar Binamon. Ele vai até a pancake e diz: “Quero vender 100 tokens”.
O roteador pancake solicita ao LP a taxa de câmbio atual do token para o BNB (usando o algoritmo AMM) e informa a Jake — Isso custará 0,37 BNB + taxa.
Em seguida, a Pancake pergunta ao smart contract do token se Jake permitiu que ele (a Pancake) debitasse tokens de sua conta, para fazer isso, ele solicita ao smart contract do token o resultado da função: allowance(JAKE, roteador Pancake)
O roteador Pancake não confia logicamente em ninguém, então todas as transações de débito ocorrem em seu nome, e é por isso que Jake tem que dizer que confia na Pancake para debitar seu saldo de tokens
Jake não vendeu nada antes, o resultado = 0. A Pancake vê isso e mostra um botão “APROVAR” para Jake na interface de troca.
- Jake pressiona “APROVAR”
A carteira de Jake inicia uma transação para o smart contract do token: approve(roteador Pancake, 999999999999999999999), permitindo que o roteador debite sua conta com quantos tokens ele (o roteador) precisar.
Na verdade seria mais correto dar permissão para cada transação apenas pelo valor daquela transação, mas as pessoas são criaturas preguiçosas e por isso geralmente ninguém se incomoda e coloca o número máximo possível como o número de tokens permitidos a serem debitados. Em nosso exemplo, para simplificar, são muitos 9s.
O smart contract do token executa a operação adicionando uma linha à tabela de subsídios:
JAKE - (Roteador Pancake, 999999999) e gera um evento de Aprovação
O roteador Pancake vê este evento e repete novamente o smart contract para o resultado da função: allowance(JAKE, roteador punk).
Se o smart contract retornar 9999999999 e esse valor for maior ou igual ao valor da transação atual, o roteador removerá o botão “APROVAR” da interface e habilitará o botão “SWAP”. Se 0 for retornado, o botão “APROVAR” não desaparecerá, o botão “SWAP” ainda estará inativo.
- Jake aperta “SWAP”
O roteador Pancake comanda a parte BNB do par de LPs para enviar 0,37 BNB para Jake e cria uma transação no smart contract do token chamando a função transferFrom(JAKE,roteador da punk, 100).
O smart contract verifica se há uma tabela de linha de abatimento permitindo que a Pancake debite moedas do endereço de Jakes, encontre e execute a operação.
A tabela agora está assim:
- BEN - 0
- IVAN - 200
- JAKE - 0
CAKE-LP-Token — 800
Tudo deu certo, todos estão felizes, todas as operações foram realizadas
Resumindo:
Os tokens são transferidos do saldo do remetente da transação (geralmente a carteira do usuário) para qualquer outro endereço usando a função de transferência.
Os tokens podem ser enviados de qualquer endereço para qualquer endereço, somente se houver permissão através da função de aprovação para debitar no endereço do devedor.
A função aprovar é chamada pelo dono do endereço, que dá permissão para outro endereço debitar tokens de seu saldo.
A permissão pode ser visualizada através da função de permissão.
Com qualquer transferência, os tokens simplesmente se movem de uma linha do balanço para outra, nunca deixando os limites de seu smart contract.
Se você quiser pré-aprovar a venda do token, então vá para o smart contract do TOKEN, aba WRITE, procure a função APPROVE lá e insira o endereço do roteador do smart contract do local onde você deseja trocar. No nosso caso este é o endereço do roteador da Pancake: 0x10ED43C718714eb63d5aA57B78B54704E256024E
Neste tutorial, analisamos as coisas fundamentais sobre suas contas, contratos e vimos os principais pontos de interação entre eles.
Aconselho fortemente que você faça um curso básico de programação para poder ler o código do contrato em um nível mínimo e entender pelo menos aproximadamente o que um determinado pedaço de código faz.
Um enorme agradecimento da equipe Swap.net a Alex Kruegger
Autor: Alex Kruegger (TG @kruegger), Canal — https://t.me/ak74lab
Traduzido pela equipe SWAP.NET
Site oficial — https://swap.net/
Twitter — https://twitter.com/NFTSwapnet
Discord — https://t.co/uzz0Qt12tf
Médio — https://medium.com/@NFTSwapnet
Documentos&WhitePaper — http://docs.swap.net
Esse artigo é uma tradução de (Swap.Net - NFT Aggregator & Exchange) feita por (Jhonattan Farias). Você pode encontrar o artigo original aqui
Top comments (0)