Ir para o conteúdo

Interagindo com o Proxy Precompile

Introdução

A Proxy Precompile permite que as contas definam contas proxy por meio da API Ethereum. As contas proxy podem realizar ações limitadas em nome da conta com proxy, como governança, transferências de saldo, gerenciamento ou transações privilegiadas, entre outras.

Se um usuário quisesse fornecer a outro usuário acesso a um número limitado de ações em seu nome, tradicionalmente, o único método para fazê-lo seria compartilhar a chave privada dessa conta. No entanto, as redes EVM com tecnologia Tanssi incluem o módulo proxy, fornecendo uma camada adicional de segurança. Com proxies, muitas contas podem realizar ações para uma conta primária, e tais permissões podem ser revogadas a qualquer momento. Isto é melhor se, por exemplo, um usuário quiser manter sua carteira segura em armazenamento a frio, mas ainda quiser acessar partes da funcionalidade da carteira, como governança ou staking.

Nota

O Proxy Precompile só pode ser chamado de uma Externally Owned Account (EOA) ou pela Batch Precompile.

Para saber mais sobre contas proxy e como configurá-las para seus próprios propósitos sem o uso do Proxy Precompile, visite a página Proxy Accounts.

A Proxy Precompile está localizada no seguinte endereço:

0x0000000000000000000000000000000000000805

Note

O uso de precompiladas pode trazer consequências inesperadas. As precompiladas do Tanssi são derivadas das do Moonbeam; portanto, familiarize-se com as considerações de segurança das precompiladas do Moonbeam.

Pré-requisitos

Para acompanhar o conteúdo deste guia, você precisará:

  • Acesso a uma rede EVM com tecnologia Tanssi executando runtime 700 ou superior
  • Uma carteira compatível com EVM configurada para funcionar com sua rede. Você também pode conectar sua carteira à rede EVM de demonstração
  • Uma conta com fundos suficientes para pagar as taxas e depósitos necessários
  • Uma segunda conta que você controla para usar como proxy

A Interface Solidity do Proxy

Proxy.sol é uma interface que permite que desenvolvedores interajam com as funções da precompilação.

Proxy.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.3;

/// @author The Moonsong Labs Team
/// @title Pallet Proxy Interface
/// @title The interface through which solidity contracts will interact with the Proxy pallet
interface Proxy {
    /// @dev Defines the proxy permission types.
    /// The values start at `0` (most permissive) and are represented as `uint8`
    enum ProxyType {
        Any,
        NonTransfer,
        Governance,
        Staking,
        CancelProxy,
        Balances,
        AuthorMapping,
        IdentityJudgement
    }

    /// @dev Register a proxy account for the sender that is able to make calls on its behalf
    /// @custom:selector 74a34dd3
    /// @param delegate The account that the caller would like to make a proxy
    /// @param proxyType The permissions allowed for this proxy account
    /// @param delay The announcement period required of the initial proxy, will generally be zero
    function addProxy(
        address delegate,
        ProxyType proxyType,
        uint32 delay
    ) external;

    /// @dev Removes a proxy account from the sender
    /// @custom:selector fef3f708
    /// @param delegate The account that the caller would like to remove as a proxy
    /// @param proxyType The permissions currently enabled for the removed proxy account
    /// @param delay The announcement period required of the initial proxy, will generally be zero
    function removeProxy(
        address delegate,
        ProxyType proxyType,
        uint32 delay
    ) external;

    /// @dev Unregister all proxy accounts for the sender
    /// @custom:selector 14a5b5fa
    function removeProxies() external;

    /// @dev Dispatch the given subcall (`callTo`, `callData`) from an account that the sender
    /// is authorised for through `addProxy`
    /// @custom:selector 0d3cff86
    /// @param real The account that the proxy will make a call on behalf of
    /// @param callTo Recipient of the call to be made by the `real` account
    /// @param callData Data of the call to be made by the `real` account
    function proxy(
        address real,
        address callTo,
        bytes memory callData
    ) external payable;

    /// @dev Dispatch the given subcall (`callTo`, `callData`) from an account that the sender
    /// is authorised for through `addProxy`
    /// @custom:selector 685b9d2f
    /// @param real The account that the proxy will make a call on behalf of
    /// @param forceProxyType Specify the exact proxy type to be used and checked for this call
    /// @param callTo Recipient of the call to be made by the `real` account
    /// @param callData Data of the call to be made by the `real` account
    function proxyForceType(
        address real,
        ProxyType forceProxyType,
        address callTo,
        bytes memory callData
    ) external payable;

    /// @dev Checks if the caller has an account proxied with a given proxy type
    /// @custom:selector e26d38ed
    /// @param real The real account that maybe has a proxy
    /// @param delegate The account that the caller has maybe proxied
    /// @param proxyType The permissions allowed for the proxy
    /// @param delay The announcement period required of the initial proxy, will generally be zero
    /// @return exists True if a proxy exists, False otherwise
    function isProxy(
        address real,
        address delegate,
        ProxyType proxyType,
        uint32 delay
    ) external view returns (bool exists);
}

A interface inclui as estruturas de dados necessárias, juntamente com as seguintes funções:

addProxy(delegate, proxyType, delay) — registra uma conta proxy para o remetente após um número especificado de blocos delay (geralmente zero). Falhará se um proxy para o chamador já existir
  • delegate address - o endereço do proxy
  • proxyType ProxyType - o tipo de delegação que define as funções específicas que o proxy terá permissão para executar
  • delay uint32 - número de blocos a esperar até que o proxy seja habilitado
  • delegate - 0x3f0Aef9Bd799F1291b80376aD57530D353ab0217
  • proxyType - "Any"
  • delay - 0
removeProxy(delegate, proxyType, delay) — remove um proxy registrado para o remetente
  • delegate address - o endereço do proxy a ser removido
  • proxyType ProxyType - o tipo de delegação a ser removido
  • delay uint32 - número de blocos a esperar até que a remoção entre em vigor
  • delegate - 0x3f0Aef9Bd799F1291b80376aD57530D353ab0217
  • proxyType - "Any"
  • delay - 0
removeProxies() — remove todas as contas proxy delegadas ao remetente
isProxy(real, delegate, proxyType, delay) — retorna true se o endereço delegado for um proxy do tipo proxyType, para o endereço real, com o delay especificado
  • real address - a conta que concede permissões ao proxy
  • delegate address - o endereço do proxy
  • proxyType ProxyType - o tipo de delegação
  • delay uint32 - número de blocos a aguardar
  • delegate - 0xbB8919d5DDfc85F4D15820a9e58018f1cfB39a2F
  • proxyType - "Any"
  • delay - 0

O parâmetro proxyType é definido pela seguinte enumeração ProxyType, onde os valores começam em 0 com o tipo de proxy mais permissivo e são representados como valores uint8:

enum ProxyType {
    Any,
    NonTransfer,
    Governance,
    Staking,
    CancelProxy,
    Balances,
    AuthorMapping,
    IdentityJudgement
}

Tipos de Proxy

Há vários tipos de funções de proxy que podem ser delegadas a contas, representadas em Proxy.sol através da enumeração ProxyType. A lista a seguir inclui todos os proxies possíveis e o tipo de transações que eles podem fazer em nome da conta principal:

  • Any — o proxy any permitirá que a conta proxy faça qualquer tipo de transação. Observe que as transferências de saldo só são permitidas para EOAs, não para contratos ou Precompiles
  • NonTransfer — o proxy de não transferência permite que a conta proxy faça qualquer tipo de transação em que o msg.value seja verificado como zero
  • Governance - o proxy de governança permitirá que a conta proxy faça qualquer tipo de transação relacionada à governança
  • CancelProxy - o proxy de cancelamento permitirá que a conta proxy rejeite e remova anúncios de proxy atrasados ​​(da conta principal). Atualmente, esta não é uma ação suportada pelo Proxy Precompile
  • Balances - o proxy de saldos permitirá que a conta proxy faça apenas transferências de saldo para EOAs

Nota

A interface Solidity contém mais tipos de proxy do que os listados acima. A lista anterior inclui apenas os tipos de proxy implementados no baseline EVM Template.

Interaja com a interface Solidity via Remix

Esta seção irá guiá-lo pelas etapas para criar um proxy, verificar sua criação e revogar os privilégios do proxy. Estes exemplos são baseados na Tanssi demo EVM Network e usam Metamask. Este guia pode ser adaptado para sua própria rede EVM com tecnologia Tanssi adicionando a URL RPC da sua rede para a carteira EVM de sua escolha.

Configuração do Remix

Você pode interagir com a precompilação do Proxy usando Remix. Para adicionar a precompilação ao Remix, você precisará:

  1. Obter uma cópia de Proxy.sol
  2. Cole o conteúdo do arquivo em um arquivo Remix chamado Proxy.sol

Compile o Contrato

Em seguida, você precisará compilar a interface no Remix:

  1. Clique na guia Compilar, a segunda de cima
  2. Em seguida, para compilar a interface, clique em Compilar Proxy.sol

Compilando Proxy.sol

Quando a compilação estiver concluída, você verá uma marca de seleção verde ao lado da guia Compilar.

Acessar o Contrato

Em vez de implantar o contrato inteligente, você acessará a interface através de seu endereço:

  1. Clique na guia Deploy and Run diretamente abaixo da guia Compile no Remix
  2. Certifique-se de que Injected Provider - Metamask esteja selecionado no menu suspenso ENVIRONMENT. Você pode ser solicitado pelo MetaMask para conectar sua conta ao Remix, caso ainda não esteja conectado
  3. Certifique-se de que a conta primária seja exibida em ACCOUNT
  4. Certifique-se de que Proxy - Proxy.sol esteja selecionado no menu suspenso CONTRACT. Dado que é um contrato pré-compilado, não há etapa de implantação. Em vez disso, você fornecerá o endereço da precompilação no campo At Address
  5. Forneça o endereço da precompilação do Proxy (que é 0x0000000000000000000000000000000000000805 neste exemplo) e clique em At Address
  6. A precompilação do Proxy aparecerá na lista de Deployed Contracts Acessar o endereço

Adicionar um Proxy

Você pode adicionar proxies para sua conta chamando as funções de precompilação. No exemplo a seguir, você adicionará um proxy autorizado a executar qualquer transação em seu nome:

  1. Expanda o contrato Proxy Precompile para ver as funções disponíveis
  2. Encontre a função addProxy e pressione o botão para expandir a seção
  3. Insira o endereço de sua segunda conta como delegate, 0 como proxyType, o que significa any, e 0 como delay
  4. Clique em transact
  5. O MetaMask aparecerá e você será solicitado a revisar os detalhes da transação. Clique em Confirmar para executar a transação

Nota

Ao construir a transação no Remix, o proxyType é representado como um uint8, em vez do enum ProxyType esperado. Em Solidity, os enums são compilados como uint8, então, quando você passa 0 para proxyType, você indica o primeiro elemento no enum ProxyType, que é o proxy any.

Chamar a função addProxy

Verifique uma existência de Proxy

A função isProxy verifica se uma conta proxy existe. Após criar um proxy na etapa anterior, use os mesmos parâmetros para verificar se o proxy foi adicionado com sucesso:

  1. Expanda a função isProxy
  2. Insira sua conta principal como real, sua segunda conta (proxy) como delegate, 0 como proxyType e 0 como delay
  3. Clique em call
  4. As funções retornam se existe um proxy ou não. Neste exemplo, o proxy existe, portanto, a função retorna true

Chamar a função isProxy

Remover um Proxy

Você pode revogar uma permissão de proxy quando não for mais necessária. Após criar um proxy na Adicionar Proxy, etapa, ele pode ser removido seguindo estas etapas:

  1. Expanda a função removeProxy
  2. Insira a conta proxy como delegate, 0 como proxyType e 0 como delay
  3. Clique em transact
  4. O MetaMask aparecerá e você será solicitado a revisar os detalhes da transação. Clique em Confirmar para executar a transação

Depois que a transação for confirmada, se você repetir as etapas para verificar a existência de um proxy, o resultado deverá ser false.

Chamar a função removeProxy

E é isso! Você interagiu com sucesso com a precompilação do Proxy usando MetaMask e Remix!

As informações apresentadas aqui foram fornecidas por terceiros e estão disponíveis apenas para fins informativos gerais. A Tanssi não endossa nenhum projeto listado e descrito no Site de Documentação da Tanssi (https://docs.tanssi.network/). A Tanssi Foundation não garante a precisão, integridade ou utilidade dessas informações. Qualquer confiança depositada nelas é de sua exclusiva responsabilidade. A Tanssi Foundation se exime de toda responsabilidade decorrente de qualquer confiança que você ou qualquer outra pessoa possa ter em qualquer parte deste conteúdo. Todas as declarações e/ou opiniões expressas nesses materiais são de responsabilidade exclusiva da pessoa ou entidade que as fornece e não representam necessariamente a opinião da Tanssi Foundation. As informações aqui não devem ser interpretadas como aconselhamento profissional ou financeiro de qualquer tipo. Sempre busque orientação de um profissional devidamente qualificado em relação a qualquer assunto ou circunstância em particular. As informações aqui podem conter links ou integração com outros sites operados ou conteúdo fornecido por terceiros, e tais sites podem apontar para este site. A Tanssi Foundation não tem controle sobre esses sites ou seu conteúdo e não terá responsabilidade decorrente ou relacionada a eles. A existência de qualquer link não constitui endosso desses sites, de seu conteúdo ou de seus operadores. Esses links são fornecidos apenas para sua conveniência, e você isenta e exonera a Tanssi Foundation de qualquer responsabilidade decorrente do uso dessas informações ou das informações fornecidas por qualquer site ou serviço de terceiros.
Última atualização: 9 de dezembro de 2025
| Criada: 9 de dezembro de 2025