WEB3DEV

Cover image for Otimizando Transações Ethereum com eth_createAccessList
Paulo Gio
Paulo Gio

Posted on

Otimizando Transações Ethereum com eth_createAccessList

https://infura.ghost.io/content/images/size/w1000/2023/05/Optimizing-Ethereum-Transaction-with-eth_createAccessList_1200x628_text.png

Descubra como o eth_createAccessList, um método JSON-RPC da Ethereum, pode ajudar a otimizar os custos de gás, reduzir erros de falta de gás, verificar clientes para acesso à infraestrutura e muito mais.

Neste artigo, apresentaremos uma visão geral da funcionalidade eth_createAccessList, um método JSON-RPC da Ethereum que gera uma lista de acesso para uma transação de Tipo 1, e demonstraremos cinco casos de uso nos quais esse método pode ser aplicado:

  • Otimização de Custos de Gás e Redução de Erros de Falta de Gás
  • Implantação de Contratos Inteligentes
  • Interação com Protocolos DeFi
  • Desenvolvimento de Contratos com a EIP-4337 (Abstração de Conta)
  • Verificação de Clientes

A documentação para eth_createAccessList pode ser encontrada aqui.

O que é eth_createAccessList?

Transações de Tipo 1 fazem parte da EIP-2930, introduzida pelo hard fork (bifurcação drástica) Berlin. Essas transações incluem uma "lista de acesso", uma funcionalidade projetada para mitigar os desafios levantados pela EIP 2929, que aumentou os custos de gás para certas operações a fim de prevenir potenciais ataques de negação de serviço (DoS). Uma lista de acesso é um registro de endereços e determinadas chaves de armazenamento que a transação planeja acessar. Ao especificar esses elementos antecipadamente, a transação se torna mais previsível em termos de seu consumo de gás.

Aqui é onde o eth_createAccessList entra em cena. A função é um método JSON-RPC da Ethereum projetado para gerar uma lista de acesso para uma transação. Ao usar esse método, os desenvolvedores podem especificar uma lista de endereços e chaves de armazenamento que a transação irá acessar, o que essencialmente oferece aos desenvolvedores uma visão mais detalhada de como uma transação específica (ou chamada) afetará a árvore de estado geral. Essa funcionalidade ajuda a reduzir os custos de gás para os desenvolvedores ao anexar uma lista de acesso a uma transação bruta, simplifica o processo de gerenciamento de interações com contratos inteligentes e minimiza erros de falta de gás. As listas de acesso têm o objetivo de melhorar a escalabilidade da rede ao especificar uma lista explícita de endereços e chaves de armazenamento que uma transação pretende acessar.

Caso de Uso 1: Otimização de Custos de Gás e Redução de Erros de Falta de Gás

Com o eth_createAccessList, os desenvolvedores podem gerar listas de acesso para suas transações a fim de otimizar os custos de gás e reduzir o risco de erros de falta de gás. Ao especificamente indicar os endereços e as chaves de armazenamento que uma transação irá acessar, os desenvolvedores podem evitar o pagamento de taxas de gás adicionais para acessar slots de armazenamento "frios" e aproveitar o desconto de gás para endereços "quentes".

Caso de Uso 2: Implantação de Contratos Inteligentes

Ao implantar um contrato inteligente, os desenvolvedores podem usar o eth_createAccessList para gerar uma lista de acesso especificando os endereços e as chaves de armazenamento com os quais o contrato irá interagir, ajudando a reduzir os custos de gás associados à implantação.

Exemplo:

Considere uma implantação simples de contrato que interage com um contrato de token ERC20.

Código de Requisição:

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "eth_createAccessList",
  "params": [
    {
      "from": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
      "to": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
      "gas": "0x76c0",
      "data": "0x606060...",
      "value": "0x9184e72a"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Código de Resposta:

{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "accessList": [
      {
        "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
        "storageKeys": []
      }
    ],
    "gasUsed": "0x30d40",
    "gasRefund": "0x0"
  }
}
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, criamos uma lista de acesso para uma implantação simples de contrato que interage com um contrato de token ERC20. Ao especificar o endereço do contrato ERC20 na lista de acesso, reduzimos o custo de gás da implantação.

https://infura.ghost.io/content/images/2023/05/data-src-image-8e1a7056-1b4a-4172-9600-2f7119488d2f.png

Caso de Uso 3: Interação com Protocolos DeFi

Os desenvolvedores podem usar o eth_createAccessList ao interagir com protocolos DeFi para otimizar o uso de gás, especificando os endereços e as chaves de armazenamento envolvidos na transação, permitindo custos de gás mais previsíveis e reduzindo o risco de crescimento inesperado do estado.

Exemplo:

Considere um usuário interagindo com uma exchange descentralizada (DEX) para trocar tokens.

Código de Requisição:

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "eth_createAccessList",
  "params": [
    {
      "from": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
      "to": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", // Roteador Uniswap V2
      "gas": "0x76c0",
      "data": "0x7ff36ab5...", // Chamada da função swapExactTokensForTokens
      "value": "0x0"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Código de Resposta:

{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "accessList": [
      {
        "address": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D",
        "storageKeys": []
      },
      {
        "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
        "storageKeys": []
      },
      {
        "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
        "storageKeys": []
      }
    ],
    "gasUsed": "0x61a80",
    "gasRefund": "0x0"
  }
}
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, criamos uma lista de acesso para uma transação de troca de tokens em uma exchange descentralizada (DEX) como a Uniswap. Ao especificar o roteador DEX e os endereços de contrato de token na lista de acesso, reduzimos o custo de gás da transação.

https://infura.ghost.io/content/images/2023/05/data-src-image-41788da3-4dc9-45d0-8977-314e69f9e2de.png

Caso de Uso 4: Desenvolvimento de Contratos Inteligentes com a EIP-4337 (Abstração de Conta)

O eth_createAccessList pode ser usado para otimizar o uso de gás ao interagir com contratos inteligentes que utilizam a abstração de conta conforme especificado na EIP-4337.

Exemplo:

Considere um desenvolvedor interagindo com um contrato habilitado para abstração de conta para implantar uma nova instância do contrato.

Código de Requisição:

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "eth_createAccessList",
  "params": [
    {
      "from": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
      "to": "0xABCD...", // Contrato de Abstração de Conta
      "gas": "0x76c0",
      "data": "0x606060...", // Implantar nova instância
      "value": "0x0"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Código de Resposta:

{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "accessList": [
      {
        "address": "0xABCD...",
        "storageKeys": []
      }
    ],
    "gasUsed": "0x50d40",
    "gasRefund": "0x0"
  }
}
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, criamos uma lista de acesso para uma transação que implanta uma nova instância de um contrato habilitado para abstração de conta. Ao especificar o endereço do contrato de abstração de conta na lista de acesso, reduzimos o custo de gás da transação.

https://infura.ghost.io/content/images/2023/05/data-src-image-2859a4e7-9160-4f2b-8794-f2477663cb74.png

Caso de Uso 5: Verificação de Clientes

A verificação de clientes é um caso de uso mais específico explorado em uma postagem de blog de fevereiro de 2023: "How to use Ethereum Proofs" (Como usar Provas Ethereum). O método eth_createAccessList é utilizado para encontrar o slot de armazenamento nas variáveis do mapa de contrato ENS.

Com a implantação deste recurso, também poderemos adicionar o cliente Helios da a16z à nossa infraestrutura, que é o componente que faltava para utilizar o getProofs.

Exemplo usando web3.js incorporando eth_createAccessList:

Aqui está um exemplo simples de como usar o método eth_createAccessList com web3.js:

const Web3 = require("web3");

const web3 = new Web3("<ENDPOINT_API_INFURA>");
const sender = "<ENDEREÇO_REMETENTE>";
const contractAddress = "<ENDEREÇO_CONTRATO>";
const inputData = "<DADOS_DE_ENTRADA>";

(async () => {
  try {
    const accessList = await web3.eth.createAccessList({
      from: sender,
      to: contractAddress,
      data: inputData,
    });
    console.log("Lista de Acesso:", accessList);
  } catch (error) {
    console.error("Erro ao gerar lista de acesso:", error);
  }
})();
Enter fullscreen mode Exit fullscreen mode

Para usar a lista de acesso gerada em uma transação, simplesmente inclua-a no objeto da transação:

const privateKey = "<CHAVE_PRIVADA_REMETENTE>";
const gasPrice = "<PREÇO_GAS>";
const nonce = await web3.eth.getTransactionCount(sender);

const tx = {
  from: sender,
  to: contractAddress,
  data: inputData,
  gasPrice: gasPrice,
  nonce: nonce,
  accessList: accessList,
};

const signedTx = await web3.eth.accounts.signTransaction(tx, privateKey);
const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);

console.log("Recibo da Transação:", receipt);
Enter fullscreen mode Exit fullscreen mode

Exemplo usando ethers.js incorporando eth_createAccessList:

Aqui está um exemplo de como usar o método eth_createAccessList com ethers.js:

const ethers = require("ethers");

const provider = new ethers.providers.JsonRpcProvider("<PONTO_DE_EXTREMIDADE_API_INFURA>");
const wallet = new ethers.Wallet("<CHAVE_PRIVADA_REMETENTE>", provider);
const contractAddress = "<ENDEREÇO_CONTRATO>";
const inputData = "<DADOS_DE_ENTRADA>";

const transaction = {
  from: wallet.address,
  to: contractAddress,
  data: inputData,
};

async function generateAccessList() {
  try {
    const accessList = await provider.send("eth_createAccessList", [
      transaction,
    ]);
    console.log("Lista de Acesso:", accessList);
  } catch (error) {
    console.error("Erro ao gerar lista de acesso:", error);
  }
}

generateAccessList();
Enter fullscreen mode Exit fullscreen mode

O processo de usar a lista de acesso gerada em uma transação seria parecido com o seguinte:

const gasPrice = ethers.utils.parseUnits("<PRECO_GAS_EM_GWEI>", "gwei");
const nonce = await wallet.getTransactionCount();

const tx = {
  from: wallet.address,
  to: contractAddress,
  data: inputData,
  gasPrice: gasPrice,
  nonce: nonce,
  accessList: accessList,
};

const signedTx = await wallet.signTransaction(tx);
const txResponse = await provider.sendTransaction(signedTx);
const receipt = await txResponse.wait();

console.log("Recibo da Transação:", receipt);
Enter fullscreen mode Exit fullscreen mode

Otimizando o Uso de Gás e Mais com eth_createAccessList

Com a adição do eth_createAccessList, o Infura continua a aprimorar a experiência do desenvolvedor na Ethereum. Este novo recurso simplifica as interações com contratos inteligentes, ajuda a reduzir os custos de gás e minimiza erros de falta de gás.

À medida que a Ethereum continua a evoluir e aplicativos mais complexos surgem, o uso de listas de acesso se tornará cada vez mais importante na otimização do uso de gás e na garantia da robustez da rede.

Note que o Infura está fornecendo acesso ao eth_createAccessList para todos os clientes inscritos, gratuitos e pagos.

Experimente hoje mesmo aqui e compartilhe seu feedback conosco.

Artigo original publicado por Infura. Traduzido por Paulinho Giovannini.

Top comments (0)