Volver a la página principal
miércoles 11 diciembre 2024
9

¿Qué es indexed en Solidity?

En Solidity, el modificador indexed se utiliza en la declaración de eventos para marcar hasta tres parámetros que pueden ser indexados. Los parámetros indexados permiten que las aplicaciones externas (como DApps) busquen y filtren eventos de manera eficiente en los registros (logs) de la blockchain.

Características principales de indexed

1. Filtrado eficiente:

  • Los parámetros indexados permiten buscar eventos específicos basándose en valores concretos, como direcciones o identificadores.

2. Limitación:

  • Un evento puede tener un máximo de tres parámetros indexados.

3. Estructura de los logs:

  • Los valores indexados se almacenan como _topics_ en los registros de la blockchain, lo que facilita la búsqueda a través de herramientas como web3.js o ethers.js.

4. Costo adicional:

  • Los parámetros indexados aumentan el costo de gas de la transacción, ya que se almacenan en un formato más accesible.

Sintaxis de indexed

Declaración de un evento con parámetros indexados

event Transfer(address indexed from, address indexed to, uint256 value);

Emisión de un evento

emit Transfer(msg.sender, destinatario, monto);

En este caso:

  • from y to son parámetros indexados, lo que permite buscar eventos filtrando por esas direcciones.
  • value no está indexado, por lo que no se puede filtrar directamente por su valor.

Ejemplo práctico

Contrato con un evento indexed

pragma solidity ^0.8.0;

contract EjemploIndexed {
    event Transfer(address indexed from, address indexed to, uint256 value);

    function transferir(address to, uint256 amount) public {
        // Emitir el evento con parámetros indexados
        emit Transfer(msg.sender, to, amount);
    }
}

Filtrar eventos desde una aplicación externa

Con ethers.js, puedes buscar eventos que coincidan con ciertos parámetros indexados:

const abi = [
  "event Transfer(address indexed from, address indexed to, uint256 value)"
];

const contract = new ethers.Contract(contractAddress, abi, provider);

// Filtrar eventos donde `from` es una dirección específica
const filtro = contract.filters.Transfer("0x1234567890123456789012345678901234567890");

const eventos = await contract.queryFilter(filtro);
console.log(eventos);

En este ejemplo:

  • El filtro busca eventos donde el parámetro from coincide con una dirección específica.

Limitaciones de indexed

1. Máximo de tres parámetros indexados:

  • Solo tres parámetros de un evento pueden ser marcados como indexed. Si necesitas más, deberás filtrar manualmente desde los datos de los logs.

2. No accesible dentro del contrato:

  • Los eventos, incluidos los valores indexados, no pueden ser leídos o consultados directamente desde Solidity; solo están disponibles para aplicaciones externas.

3. Costo de gas:

  • Los parámetros indexados aumentan el costo de gas de la transacción, ya que se almacenan de manera más accesible.

Ejemplo avanzado: Uso combinado de indexed y parámetros no indexados

contract Marketplace {
    event ProductoVendido(
        uint indexed idProducto,
        address indexed comprador,
        uint256 precio,
        string nombreProducto
    );

    function venderProducto(
        uint idProducto,
        address comprador,
        uint256 precio,
        string memory nombreProducto
    ) public {
        emit ProductoVendido(idProducto, comprador, precio, nombreProducto);
    }
}

Consideraciones del ejemplo:

1. idProducto y comprador son parámetros indexados, por lo que pueden ser filtrados en los logs.

2. precio y nombreProducto no son indexados y no pueden ser usados directamente para filtrar eventos.

Ventajas de indexed

1. Eficiencia:

  • Facilita búsquedas específicas en los eventos emitidos por un contrato inteligente.

2. Compatibilidad con herramientas externas:

  • Es compatible con bibliotecas como web3.js, ethers.js, y exploradores de blockchain.

3. Escalabilidad:

  • Reduce la necesidad de procesar manualmente todos los eventos en los logs.

Buenas prácticas al usar indexed

1. Prioriza parámetros críticos:

  • Marca como indexed solo los parámetros que probablemente serán utilizados para filtrar eventos.

2. Documenta el uso:

  • Explica en la documentación del contrato cuáles son los valores indexados y su propósito.

3. Optimiza el costo de gas:

  • Evita indexar demasiados parámetros innecesarios para minimizar el costo de gas.

Referencias oficiales

Para más información sobre indexed y eventos en Solidity, consulta la documentación oficial de Solidity.

Etiquetas:
solidity
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer