Chamada entre contratos

Chamar um contrato a partir de outro contrato em Solidity é uma prática comum que permite a interação entre diferentes contratos inteligentes na blockchain do Ethereum. Esse processo pode ser realizado de várias maneiras, dependendo de se você conhece a interface do contrato que deseja chamar com antecedência. Abaixo, são descritos dois métodos comuns para realizar essas chamadas: através de Interfaces e através de chamadas de baixo nível.

Método 1: Uso de Interfaces Se você conhece a interface do contrato que deseja chamar, pode definir uma interface em Solidity que declare os métodos do contrato externo. Em seguida, você pode usar essa interface para interagir com o contrato externo como se estivesse chamando métodos locais.

Definir a Interface do Contrato Externo Primeiro, defina uma interface com as assinaturas das funções do contrato externo que deseja chamar.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ContratoExterno {
    function funcionExterna(string calldata mensaje) external returns (bool);
}
  1. Interagir com o Contrato Externo Depois, em seu contrato, você pode utilizar essa interface para criar uma instância do contrato externo e chamar suas funções.

    solidityCopy codecontract MiContrato {
        function llamarFuncionExterna(address direccionExterna, string memory mensaje) public returns (bool) {
            ContratoExterno contrato = ContratoExterno(direccionExterna);
            return contrato.funcionExterna(mensaje);
        }
    }

Método 2: Chamadas de Baixo Nível As chamadas de baixo nível (call, delegatecall e staticcall) oferecem mais flexibilidade, mas são menos seguras, pois não fornecem verificação de tipos e podem falhar silenciosamente se a chamada não for bem-sucedida. Você deve usá-las apenas se entender bem as implicações.

solidityCopy codecontract MiContrato {
    function llamarFuncionExternaBajoNivel(address direccionExterna, string memory mensaje) public returns (bool, bytes memory) {
        (bool exito, bytes memory respuesta) = direccionExterna.call(
            abi.encodeWithSignature("funcionExterna(string)", mensaje)
        );
        return (exito, respuesta);
    }
}

Neste exemplo, call é utilizado para chamar funcionExterna do contrato no endereço direccionExterna. A função abi.encodeWithSignature é usada para codificar a chamada da função, incluindo o nome da função e os parâmetros que são passados. A função retorna dois valores: um booleano que indica se a chamada foi bem-sucedida e os dados de resposta.

Ao chamar outro contrato, é crucial considerar as implicações de segurança, especialmente ao aceitar endereços de contratos como entrada de usuários não confiáveis. Chamadas a contratos não confiáveis podem expor seu contrato a riscos de reentrancy ou outros vetores de ataque. Utilize padrões de segurança, como checks-effects-interactions, e considere o uso de reentrancy guards se o seu contrato atualiza estados ou transfere fundos em resposta a chamadas externas.

Last updated