WEB3DEV

Cover image for Como chamar um contrato inteligente a partir de outro contrato inteligente (Parte 1/3)
Fatima Lima
Fatima Lima

Posted on • Atualizado em

Como chamar um contrato inteligente a partir de outro contrato inteligente (Parte 1/3)

Image description

Um pequeno resumo:

Os contratos inteligentes são programas de computador auto-executáveis que funcionam em redes de blockchains. Entre as muitas possibilidades disponíveis, eles podem ser escritos na linguagem de programação Solidity e implantados na blockchain Ethereum e em outras blockchains compatíveis com a EVM.

Neste artigo, vamos nos concentrar nos contratos baseados em Solidity.

É possível que os contratos inteligentes interajam também por si mesmos com outros contratos implantados nestas redes. Os contratos inteligentes não se limitam a funcionar de forma isolada. Isto também é chamado de Cross-Contract Calling (Chamada entre Contratos), que é o termo que vamos usar para isso no resto do artigo.

Alguns exemplos de como esta interação pode ocorrer incluem:

  1. Emissor de Token: Um emissor de token, usando um contrato inteligente para emitir um token, pode fazer com que os contratos de cunhagem chamem o contrato do token e o emitam*.*
  2. Exchange (Câmbio) de Tokens: Os contratos de exchanges descentralizadas funcionam interagindo com os próprios contratos do token.
  3. Seguradora: Contratos inteligentes podem ser usados para criar uma apólice de seguro entre duas partes. O contrato calculará automaticamente o prêmio, enviará faturas e gerenciará o pagamento em caso de sinistro.
  4. Comércio automatizado: Contratos inteligentes podem ser usados para facilitar o comércio automatizado. Estes contratos podem monitorar o mercado para certas condições e realizar negociações no contrato da Exchange quando as condições são cumpridas.

Por que eu deveria saber como fazer Chamadas entre Contratos?

Chamar outro Contrato Inteligente de dentro de seu próprio Contrato Inteligente pode ser uma maneira eficaz de criar aplicativos complexos e interconectados.

Ao utilizar as funções de outros contratos inteligentes, os desenvolvedores podem simplificar seu próprio código, reduzir custos e criar aplicativos mais eficientes. Além disso, chamar outro Contrato Inteligente pode ajudar a garantir que o código seja seguro, pois o código do outro contrato pode ser verificado e testado antes de ser integrado ao seu próprio código.

Você também pode fornecer um endereço de destino diferente para o contrato proxy, se desejar alterar a lógica. Esta poderia ser uma versão recém implantada que inclui algumas melhorias. É possível dividir a lógica e os dados em dois contratos inteligentes diferentes. O contrato lógico pode ser alterado ou substituído através do proxy, mantendo todos os dados no contrato de dados.

Esta funcionalidade tem imenso poder na medida em que permite que o código seja reutilizado e os contratos que já foram implantados sejam usados como bibliotecas. Além disso, pode reduzir os custos de implantação, já que o contrato que faz uso da biblioteca não precisa incorporar todo o código em si.

Chamadas entre Contratos com a Solidity e Laika

Para começar a utilizar a Laika na criação de suas chamadas entre contratos, dirija-se ao seu espaço de trabalho e defina sua coleção de pedidos de contrato.

Se você ainda não montou seu espaço de trabalho Laika, consulte nossos documentos aqui.

https://docs.getlaika.app/fundamentals/create-a-new-request

Nesta parte desta série de artigos, como uma demonstração, estaremos explorando chamar nossas próprias funções personalizadas escritas em Solidity. Portanto, prepare seu IDE (Ambiente de Desenvolvimento Integrado) Remix (ou qualquer outro IDE preferido) e vamos lá!

PASSO 1 — Criar o Contrato Counter.sol

O primeiro requisito aqui é a criação do contrato inteligente Counter.sol. Como o nome sugere, é apenas um simples script que incrementa a contagem de um número.

Abra seu IDE e cole o seguinte código como exemplo.

// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.17;

contract CounterContract {
 uint256 public count;

 constructor() {
   count = 0;
 }

 function increment() public {
   count++;
 }

 function decrement() public {
   count--;
 }
}
Enter fullscreen mode Exit fullscreen mode

Compile e implante o contrato inteligente em qualquer rede EVM que você preferir. É evidente que você deve ter esta rede em mente quando passarmos a utilizar a Laika.

Em nosso caso, estaremos implantando na Testnet (rede de testes) Polygon zkEVM.

Se você estiver usando o IDE Remix, você pode simplesmente compilar o contrato no painel do lado esquerdo, na aba Compiler (Compilador).

Image description

Clique em “Compile Counter.sol” para compilar o contrato

Então, vá até a aba Deploy & Run Transactions e selecione “Injected Provide — Metamask” no campo Environment.
Como você pode ver, estamos usando a rede Custom (1442), que é a rede de teste -zkEVM-mango.

Uma vez que seu provedor injetado esteja conectado, clique em Deploy.

Você precisará aprovar a transação em sua carteira, depois aguarde alguns momentos enquanto o contrato é implantado na chain de sua escolha.

Image description

Selecione “Injected Provider” e Clique em Deploy para implantar o contrato

Uma vez concluído, o terminal mostrará uma mensagem de sucesso. Agora, o contrato está on chain e pode interagir com os usuários e outros contratos!

PASSO 2 — Interagir com o Contrato Counter.sol

Para testar se nosso contrato está funcionando como desejado, role para baixo a aba Run, e encontre a seção Deployed Contracts (Contratos Implantados).

Image description

Você deve ver três botões, "Decrement", "Increment" e " Number” (Count, conforme a imagem).

O botão increment (incremento) chama a função de increment que criamos no contrato. O botão number é uma simples chamada de leitura que nos dá o valor do "número" público uint que definimos no contrato inteligente.

Um clique em “number” enviará a chamada de leitura, e no início, você deverá receber 0 (zero) na saída do terminal. Clicando em "increment", você enviará a transação para aumentar o contador em um, para o qual você verá um popup na sua carteira. Quando essa transação passar, clique novamente em "number" e agora deverá aparecer 1 como a saída. Ao contrário, o "decrement" diminuirá o valor de um.
Nós compilamos e implantamos com sucesso um contrato!

PASSO 3 — Criar o Contrato CounterCaller.sol

Agora vamos criar um outro contrato chamado AnotherContract, que vai criar uma chamada entre contratos no contrato original Counter.sol (muitos Cs 😅)

// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.17;

import "./CounterContract.sol";

contract AnotherContract {
 CounterContract counterContract;

 constructor(address counterAddress) {
   counterContract = CounterContract(counterAddress);
 }

 function incrementCounter() public {
   counterContract.increment();
 }
}
Enter fullscreen mode Exit fullscreen mode

O contrato CounterCaller inclui uma variável pública chamada "myCounter" que é do tipo "Counter" (Contador). Isto nos permite acessar as funções e variáveis públicas do contrato do Counter.

O contrato também tem uma função constructor que só é chamada quando o contrato é implantado e é usada para definir o valor do "myCounter" para o endereço do contrato Counter que foi anteriormente implantado.

Há também uma função chamada "counterIncrement" que chama a função "increment" no "myCounter", atuando efetivamente como uma referência ao contrato inteligente Counter.

Anexe o trecho de código acima, abaixo do código Counter.sol existente, pois necessitamos das identidades da função para instanciar a função dentro do contrato CounterCaller.sol

Image description

Ao implantar o novo contrato CounterCaller, você verá o campo do constructor solicitando o "counterAddress". Este tem que ser o endereço implantado do contrato Counter.sol que criamos anteriormente.

Cole o endereço do contrato implantado para o Counter.sol e clique em Deploy (Implantar).

Image description

Agora você deve estar vendo os dois contratos no painel Deploy Contracts.

Image description

PASSO 4— CHAMADA entre contratos!

Agora passamos para as coisas realmente divertidas, seu espaço de trabalho Laika!

Abra seu Espaço de Trabalho Laika e crie um Novo Pedido usando os endereços do contrato implantado (tanto para o Counter.sol quanto para o CounterCaller.sol).

Image description

Nota: Dependendo de sua rede de escolha e de suas configurações pessoais, você também precisará fornecer o contrato ABI (Interface Binária de Aplicação) enquanto cria Request Collections (Solicitar Coleções). Você pode encontrar a ABI na seção Compilation Details (Detalhes da Compilação) do Remix.

Image description

Você verá então duas novas coleções em seu espaço de trabalho. Algo como isto.

Image description

Agora começamos a chamar o contrato Counter.sol do contrato CounterCaller.sol!

Primeiro, verifique se as solicitações estão funcionando com o contrato Counter, chamando a solicitação da função Read (Ler).

Image description

Você deve receber uma resposta de valor "0", como mostrado acima.

Agora tente chamar a solicitação da função "increment". Como isso muda o estado, será uma transação que você terá que assinar na sua carteira conectada.

Assim que a transação passar, clique em Send (Enviar) na solicitação Read para obter novamente o valor count.

Image description

Como esperado, agora retorna um!

Então o contrato funciona internamente? Que tal aumentarmos o valor de contagem do Counter.sol usando o outro contrato?

Vá até a coleção do Counter Caller e envie a solicitação de "incrementCounter".

Image description

Agora é o momento da verdade, onde voltamos ao contrato do Counter.sol e lemos o valor da contagem (count).

Image description

E como podemos ver, ele retornou DOIS! O que significa que aumentamos com sucesso o valor de um contrato usando outro contrato!

Este é um exemplo básico para ajudá-lo a aprender como chamar um contrato inteligente a partir de outro contrato inteligente usando Solidity. É um exemplo básico de como os contratos inteligentes são capazes de interagir uns com os outros.

Compreender como chamar um contrato inteligente a partir de outro contrato inteligente usando Solidity desbloqueia uma gama completa de possibilidades para aplicações avançadas. Com este conhecimento, você pode criar aplicações descentralizadas mais complexas, dividir os contratos em várias partes, o que é especialmente importante uma vez que os contratos têm limites de tamanho de bytecode de 24KB na Ethereum (EIP170). Outra superpotência que você obtém é a capacidade de criar contratos que podem gerar outros contratos (contratos de fábrica)!

Nos próximos artigos desta série, exploraremos a chamada de contratos populares existentes a partir de seus contratos inteligentes.

E é isso! A Laika é sua própria primeira ABI "one-stop-shop" (empresa que oferece tudo em um mesmo lugar) para interação contratual em muitas, se não todas as redes EVM! Mais chains estão sendo adicionadas em breve, então fique de olho! Compartilhe conosco suas experiências de uso da Laika em nossas redes sociais.

Adios por enquanto e nos vemos em breve! 🐶❤💛

Conecte-se conosco:

Facebook: https://www.facebook.com/getlaikaapp/

Discord: https://discord.gg/4DzwHuxhcf

Website: https://getlaika.app

Mais Referências (em inglês):

  1. Introdução dos Desenvolvedores ao Contrato Inteligente pela Fundação Ethereum
  2. Introdução geral aos contratos inteligentes pela Fundação Ethereum
  3. Documentação Laika

Esse artigo foi escrito por Ishan Pandey e traduzido por Fátima Lima. O original pode ser lido aqui.

Latest comments (0)