WEB3DEV Español

Cover image for Optimizando Transacciones Ethereum con eth_createAccessList
Juan José Gouvêa
Juan José Gouvêa

Posted on

Optimizando Transacciones Ethereum con eth_createAccessList

img

Descubre cómo eth_createAccessList, un método JSON-RPC de Ethereum, puede ayudar a optimizar los costos de gas, reducir errores de falta de gas, verificar clientes para acceso a la infraestructura y mucho más.

En este artículo, presentaremos una visión general de la funcionalidad eth_createAccessList, un método JSON-RPC de Ethereum que genera una lista de acceso para una transacción de Tipo 1, y mostraremos cinco casos de uso donde este método puede ser aplicado:

  • Optimización de Costos de Gas y Reducción de Errores por Falta de Gas
  • Despliegue de Contratos Inteligentes
  • Interacción con Protocolos DeFi
  • Desarrollo de Contratos con la EIP-4337 (Abstracción de Cuenta)
  • Verificación de Clientes

La documentación para eth_createAccessList se puede encontrar aquí.

¿Qué es eth_createAccessList?

Las transacciones de Tipo 1 son parte de la EIP-2930, introducida por el hard fork (bifurcación dura) Berlin. Estas transacciones incluyen una "lista de acceso", una funcionalidad diseñada para mitigar los desafíos planteados por la EIP 2929, que aumentó los costos de gas para ciertas operaciones para prevenir posibles ataques de denegación de servicio (DoS). Una lista de acceso es un registro de direcciones y ciertas claves de almacenamiento que la transacción planea acceder. Al especificar estos elementos de antemano, la transacción se vuelve más predecible en términos de su consumo de gas.

Aquí es donde entra eth_createAccessList. La función es un método JSON-RPC de Ethereum diseñado para generar una lista de acceso para una transacción. Al usar este método, los desarrolladores pueden especificar una lista de direcciones y claves de almacenamiento que la transacción accederá, lo que básicamente les da a los desarrolladores una visión más detallada de cómo una transacción específica (o llamada) afectará al árbol de estado general. Esta funcionalidad ayuda a reducir los costos de gas para los desarrolladores al adjuntar una lista de acceso a una transacción cruda, simplifica el proceso de manejo de interacciones con contratos inteligentes y minimiza errores de falta de gas. Las listas de acceso tienen como objetivo mejorar la escalabilidad de la red al especificar una lista explícita de direcciones y claves de almacenamiento que una transacción intenta acceder.

Caso de Uso 1: Optimización de Costos de Gas y Reducción de Errores por Falta de Gas

Con eth_createAccessList, los desarrolladores pueden generar listas de acceso para sus transacciones con el fin de optimizar los costos de gas y reducir el riesgo de errores por falta de gas. Al indicar específicamente las direcciones y las claves de almacenamiento que una transacción accederá, los desarrolladores pueden evitar pagar tarifas de gas adicionales para acceder a slots de almacenamiento "fríos" y aprovechar el descuento de gas para direcciones "calientes".

Caso de Uso 2: Despliegue de Contratos Inteligentes

Al desplegar un contrato inteligente, los desarrolladores pueden usar eth_createAccessList para generar una lista de acceso, especificando las direcciones y las claves de almacenamiento con las cuales el contrato interactuará, ayudando a reducir los costos de gas asociados con el despliegue.

Ejemplo:

Considera un simple despliegue de contrato que interactúa con un contrato de token ERC20.

Código de Solicitud:

{
  "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 Respuesta:

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

En este ejemplo, creamos una lista de acceso para un simple despliegue de contrato que interactúa con un contrato de token ERC20. Al especificar la dirección del contrato ERC20 en la lista de acceso, reducimos el costo de gas del despliegue.

img2

Caso de Uso 3: Interacción con Protocolos DeFi

Los desarrolladores pueden usar eth_createAccessList al interactuar con protocolos DeFi para optimizar el uso de gas, especificando las direcciones y las claves de almacenamiento involucrados en la transacción, permitiendo costos de gas más predecibles y reduciendo el riesgo de crecimiento inesperado del estado.

Ejemplo:

Considera un usuario interactuando con un intercambio descentralizado (DEX) para intercambiar tokens.

Código de Solicitud:

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "eth_createAccessList",
  "params": [
    {
      "from": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
      "to": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D", // Roteador Uniswap V2
      "gas": "0x76c0",
      "data": "0x7ff36ab5...", // Llamada de la función swapExactTokensForTokens
      "value": "0x0"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Código de Respuesta:

{
  "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

En este ejemplo, creamos una lista de acceso para una transacción de intercambio de tokens en un intercambio descentralizado (DEX) como Uniswap. Al especificar el enrutador DEX y las direcciones de contrato de token en la lista de acceso, reducimos el costo de gas de la transacción.

img3

Caso de Uso 4: Desarrollo de Contratos Inteligentes con EIP-4337 (Abstracción de Cuenta)

El eth_createAccessList se puede usar para optimizar el uso de gas al interactuar con contratos inteligentes que usan la abstracción de cuenta según lo especificado en el EIP-4337.

Ejemplo:

Considera a un desarrollador interactuando con un contrato habilitado para abstracción de cuenta para desplegar una nueva instancia del contrato.

Código de Solicitud:

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "eth_createAccessList",
  "params": [
    {
      "from": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
      "to": "0xABCD...", // Contrato de Abstracción de la Cuenta
      "gas": "0x76c0",
      "data": "0x606060...", // Implantar nueva instancia
      "value": "0x0"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Código de Respuesta:

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

En este ejemplo, creamos una lista de acceso para una transacción que despliega una nueva instancia de un contrato con abstracción de cuenta habilitada. Al especificar la dirección del contrato de abstracción de cuenta en la lista de acceso, reducimos el costo de gas de la transacción.

img4

Caso de Uso 5: Verificación de Clientes

La verificación de clientes es un caso de uso más específico, explorado en una publicación de blog de febrero de 2023: "Cómo usar Pruebas Ethereum". El método eth_createAccessList se utiliza para encontrar el slot de almacenamiento en las variables del mapa de contrato ENS.

Con la implementación de esta característica, también podremos agregar al cliente Helios de a16z a nuestra infraestructura, que es el componente que faltaba para usar getProofs.

Ejemplo usando web3.js integrando eth_createAccessList

Aquí hay un ejemplo sencillo de cómo usar el método eth_createAccessList con web3.js:

const Web3 = require("web3");

const web3 = new Web3("<PUNTO_API_INFURA>");
const sender = "<DIRECCIÓN_REMITENTE>";
const contractAddress = "<DIRECCIÓN_CONTRATO>";
const inputData = "<DATOS_DE_ENTRADA>";

(async () => {
  try {
    const accessList = await web3.eth.createAccessList({
      from: sender,
      to: contractAddress,
      data: inputData,
    });
    console.log("Lista de Acceso:", accessList);
  } catch (error) {
    console.error("Error al generar lista de acceso:", error);
  }
})();
Enter fullscreen mode Exit fullscreen mode

Para usar la lista de acceso generada en una transacción, simplemente inclúyela en el objeto de la transacción:

const privateKey = "<CLAVE_PRIVADA_REMITENTE>";
const gasPrice = "<PRECIO_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 de la Transacción:", receipt);
Enter fullscreen mode Exit fullscreen mode

Ejemplo usando ethers.js, incorporando eth_createAccessList:

Aquí está un ejemplo de cómo usar el método eth_createAccessList con ethers.js:

const ethers = require("ethers");

const provider = new ethers.providers.JsonRpcProvider("<PUNTO_DE_TERMINACIÓN_API_INFURA>");
const wallet = new ethers.Wallet("<CLAVE_PRIVADA_REMITENTE>", provider);
const contractAddress = "<DIRECCIÓN_CONTRATO>";
const inputData = "<DATOS_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 Acceso:", accessList);
  } catch (error) {
    console.error("Error al generar lista de acceso:", error);
  }
}

generateAccessList();
Enter fullscreen mode Exit fullscreen mode

El proceso para usar la lista de acceso generada en una transacción sería algo así:

const gasPrice = ethers.utils.parseUnits("<PRECIO_GAS_EN_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 de la Transacción:", receipt);
Enter fullscreen mode Exit fullscreen mode

Optimizando el Uso de Gas y Más con eth_createAccessList

Con la adición de eth_createAccessList, Infura sigue mejorando la experiencia del desarrollador en Ethereum. Esta nueva función simplifica las interacciones con contratos inteligentes, ayuda a reducir los costos de gas y minimiza errores por falta de gas.

A medida que Ethereum continúa evolucionando y surgen aplicaciones más complejas, el uso de listas de acceso se volverá cada vez más importante en la optimización del uso de gas y en garantizar la robustez de la red.

Toma en cuenta que Infura está proporcionando acceso a eth_createAccessList para todos los clientes registrados, gratuitos y pagados.

Pruébalo hoy mismo, aquí, y comparte tus comentarios con nosotros.

Artículo original publicado por Infura. Traducido por Juan José Gouvêa.

Discussion (0)