Aula 208: Contratos Proxy Mínimos EIP-1167
No mundo do desenvolvimento em Ethereum, os contratos inteligentes podem ser bastante intensivos em recursos, tanto em termos de custos de gás quanto nas complexidades de implantação. Uma das estratégias para mitigar alguns desses problemas é o uso de Contratos Proxy Mínimos, também conhecidos como Contratos Clone. O EIP-1167 descreve um padrão para esses contratos, facilitando a implantação de várias instâncias de um contrato enquanto compartilham a mesma base de código.
O que são Contratos Proxy Mínimos?
Contratos Proxy Mínimos são contratos extremamente leves criados para delegar chamadas a um contrato mestre. O principal objetivo de um proxy mínimo é implantar várias cópias de um contrato sem duplicar a lógica, economizando assim taxas de gás e simplificando upgrades.
Principais Características do EIP-1167:
-
Baixo Custo de Implantação: Os Contratos Proxy Mínimos são baratos de implantar. Eles reduzem significativamente o custo de gás em comparação com a implantação de contratos completos individualmente.
-
Reutilização de Código: Esses contratos delegam todas as chamadas a um único contrato, promovendo a reutilização e reduzindo o tamanho da implantação.
-
Atualizabilidade: Se a lógica no contrato mestre precisar ser atualizada, ela pode ser substituída sem mudar os proxies, que referenciam a nova versão.
Como Funciona?
O EIP-1167 alcança seu minimalismo usando o método delegatecall
, que permite que o contrato proxy execute o código no contexto de outro contrato. Quando uma função é chamada no proxy, este delega essa chamada ao contrato mestre.
O Padrão Proxy
No padrão proxy, normalmente existem dois tipos de contratos envolvidos:
- Contrato Mestre: Este contrato contém a lógica à qual os proxies irão delegar.
- Contrato Proxy: Um contrato leve que encaminha chamadas para o Contrato Mestre.
Exemplo de Implementação
Vamos ver como implementar um Contrato Proxy Mínimo de acordo com o EIP-1167.
Passo 1: Criar o Contrato Mestre
Este é o contrato que contém a lógica. Para fins de demonstração, terá uma funcionalidade simples de armazenamento.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Master {
uint256 public value;
function setValue(uint256 _value) external {
value = _value;
}
function getValue() external view returns (uint256) {
return value;
}
}
Passo 2: Criar o Contrato Proxy Mínimo
Este é o contrato proxy mínimo que irá delegar chamadas ao contrato Mestre.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract MinimalProxy {
address immutable masterContract;
constructor(address _masterContract) {
masterContract = _masterContract;
}
fallback() external {
// Chamada delegada ao contrato mestre
assembly {
let result := delegatecall(gas(), sload(masterContract.slot), add(calldata(), 0x20), calldatasize(), 0, 0)
let size := returndatasize()
returndatacopy(0, 0, size)
switch result
case 0 { revert(0, size) }
default { return(0, size) }
}
}
}
Passo 3: Implantando e Usando os Contratos
Você pode implantar o contrato Master
e, em seguida, implantar várias instâncias do contrato MinimalProxy
. Cada proxy apontará para o mesmo contrato mestre.
// Implantando o Contrato Mestre
Master master = new Master();
// Implantando o Contrato Proxy Mínimo
MinimalProxy proxy1 = new MinimalProxy(address(master));
MinimalProxy proxy2 = new MinimalProxy(address(master));
// Definindo o valor via o proxy
proxy1.setValue(100);
// Obtendo o valor via o proxy
uint256 valueFromProxy = proxy2.getValue(); // Isso retornará 100
Eficiência em Gás
Implantar o contrato Master
geralmente custa mais gás inicialmente, mas criar várias instâncias do MinimalProxy
custará apenas o gás mínimo associado à implantação do proxy, tornando tudo muito mais eficiente.
Conclusão
Os Contratos Proxy Mínimos EIP-1167 oferecem uma solução inteligente para desenvolvedores que buscam implementar lógica de contrato reutilizável enquanto minimizam os custos de implantação. Essa técnica simplifica a funcionalidade dos contratos inteligentes e garante que as aplicações permaneçam eficientes, escaláveis e atualizáveis.
Ao compreender e implementar o EIP-1167, você pode otimizar significativamente seu fluxo de trabalho no desenvolvimento em Ethereum!