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.
indexed
1. Filtrado eficiente:
2. Limitación:
3. Estructura de los logs:
4. Costo adicional:
indexed
event Transfer(address indexed from, address indexed to, uint256 value);
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.
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);
}
}
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:
from
coincide con una dirección específica.
indexed
1. Máximo de tres parámetros indexados:
indexed
. Si necesitas más, deberás filtrar manualmente desde los datos de los logs.
2. No accesible dentro del contrato:
3. Costo de gas:
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);
}
}
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.
indexed
1. Eficiencia:
2. Compatibilidad con herramientas externas:
3. Escalabilidad:
indexed
1. Prioriza parámetros críticos:
indexed
solo los parámetros que probablemente serán utilizados para filtrar eventos.
2. Documenta el uso:
3. Optimiza el costo de gas:
Para más información sobre indexed
y eventos en Solidity, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer