Contexto del modelo de cuentas
Omite esta sección si ya conoces las cuentas de Solana y su estructura.
- Datos: Los bytes reales que almacenan el estado del programa, los saldos de tokens u otra información
- Propietario: El programa que controla esta cuenta y puede modificar sus datos
- Lamports: El saldo de SOL de la cuenta para la exención de renta
- Ejecutable: Indica si esta cuenta contiene código de programa
Suscripción básica de cuentas
Comencemos con un ejemplo sencillo que se suscribe a los cambios en las cuentas de tokens. Este script te notificará cada vez que cambien los saldos de tokens:BKMHWYLAX4un3HUbR7a3u9jPmzCiLNa4mSj1RiX11eWF.
Esta cuenta tiene:
- 2,039,280 lamports (saldo de ~0.002 SOL; esta es la cantidad exenta de renta para esta cuenta de token)
- Programa propietario
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA(este es el programa SPL Token) - Firma de la transacción
5C9Hr5nG2j8eQz6inxPmfyjbYdmXddzUDyR1iQgEnjYQ3RNvuP4Zzc8t1enLNy7Rk8KNCtQPEQztENYWxkt9GaVDque muestra qué transacción específica provocó el cambio en esta cuenta - Slot 352366983 que indica cuándo ocurrió esta actualización en la blockchain
- Campo de datos que contiene 165 bytes de datos de la cuenta codificados en base58
Cómo filtrar cuentas con datasize
El campo de datos es fundamental: contiene la estructura real de la cuenta de token. Usemos este conocimiento para aplicar un filtrado inteligente de cuentas.¿Por qué usar el filtrado por datasize?
Para entender por qué necesitamos filtrar, primero debemos comprender qué son realmente las cuentas de tokens. Por cada token que contiene una billetera, existe una cuenta separada en cadena. Si tu billetera contiene 3 tokens diferentes (USDC, BONK y SOL), en realidad tienes 1 cuenta de billetera (tu cuenta principal de SOL) más 3 cuentas de tokens (una por cada tipo de token). Cada cuenta de token tiene exactamente 165 bytes y almacena qué token contiene (dirección de mint), quién es su propietario (la dirección de tu billetera) y qué cantidad de ese token contiene. El programa Token posee millones de cuentas en Solana, pero no todas son lo que consideramos «cuentas de tokens» que contienen saldos de usuarios. Esto es lo que ocurre con y sin filtrado: Sin filtrado: la avalancha:- Cuentas de tokens (165 bytes): saldos de usuarios; millones de cuentas
- Cuentas de mint (82 bytes): definiciones de tokens; cientos de miles de cuentas
- Cuentas multifirma (355 bytes): controles de billeteras compartidas; decenas de miles de cuentas
- Cuentas del programa Associated Token (varios tamaños): millones de cuentas
- Sin filtrado: Millones de actualizaciones de cuentas (creaciones de mint, cambios en multifirmas, etc.)
- Con filtrado por datasize: Solo cambios en los saldos de tokens
¿De dónde provienen los 165 bytes?
No es magia: provienen de la estructura de cuentas del programa SPL Token. Al revisar el código fuente, podemos ver que la estructuraAccount define exactamente 165 bytes:
- Cuentas de mint (82 bytes)
- Cuentas multifirma (355 bytes)
- Cuentas del programa de cuentas de tokens asociadas
- Otras cuentas relacionadas con tokens que tienen tamaños diferentes
Decodificación de la estructura de la cuenta
Ahora que entendemos por qué filtramos por 165 bytes, decodifiquemos el contenido de nuestra cuenta de ejemplo:- Bytes 0-31: Dirección de mint (qué token contiene esta cuenta)
- Bytes 32-63: Dirección del propietario (quién posee esta cuenta de token)
- Bytes 64-71: Cantidad de tokens (cuántos tokens hay en la cuenta)
- Bytes 72-164: Metadatos adicionales (delegado, estado, autoridad de cierre, etc.)
Combinación de filtros: datasize + memcmp para una precisión extrema
Ahora que sabemos que la dirección de mint se encuentra en los bytes 0-31, podemos ser aún más específicos. Supongamos que solo queremos monitorear cuentas de tokens USDC. Podemos combinar nuestro filtrodatasize con un filtro memcmp para apuntar a la dirección de mint exacta:
- Filtro por propietario: «Dame las cuentas que pertenecen al programa Token» (millones de cuentas)
- Filtro por datasize: «Pero solo las cuentas de tokens estándar de 165 bytes» (cientos de miles)
- Filtro memcmp: «Y solo las que contienen USDC» (miles)
Lectura de actualizaciones de cuentas de USDC: ¿quién, cuánto y dónde?
Ahora veamos qué contienen realmente estas actualizaciones filtradas. Creemos un monitor específico para USDC que responda las preguntas clave cuando cambia una cuenta de token:- ¿Quién posee esta cuenta de token?
- ¿Cuánto USDC contiene ahora?
- ¿Dónde ocurrió el cambio (en qué cuenta específica)?
- ¿Cuándo ocurrió este cambio?
- ¿Qué transacción provocó el cambio?
bs58.encode() para convertir los objetos Buffer binarios en cadenas legibles.
Referencia completa de filtrado
Además de los filtros básicosowner, datasize e memcmp que usamos, las suscripciones de cuentas admiten opciones de filtrado adicionales para limitar aún más los resultados:
Filtrado de cuentas específicas
Monitorea cuentas exactas mediante sus claves públicas:Estrategias de filtrado combinado
La potencia proviene de combinar varios tipos de filtros. Este es el modelo mental:- Abarca un conjunto amplio con
owner: «Dame todas las cuentas administradas por este programa» - Filtra por estructura con
datasize: «Pero solo las cuentas de este tipo específico» - Apunta a datos específicos con
memcmp: «Y solo las que contienen esta información específica» - Monitorea cuentas conocidas con
account: «O simplemente observa estas cuentas exactas que me interesan»
Comprensión del panorama general
Piensa en las suscripciones de cuentas como si observaras un feed en vivo de cambios en una base de datos. El estado de Solana es, en esencia, un enorme almacén de clave-valor donde cada cuenta es una entrada. Cuando los programas se ejecutan, modifican estas cuentas. Tu suscripción te permite observar en tiempo real cómo cambian entradas específicas. El sistema de filtrado funciona como los índices de una base de datos: no solo observas «todos los cambios», sino «los cambios en las cuentas que cumplen estos criterios». Esto permite crear aplicaciones con gran capacidad de respuesta que reaccionan de inmediato a eventos relevantes en cadena sin saturar tu sistema con datos irrelevantes.Aplicación de este patrón a otros programas
El enfoque que aprendimos funciona para cualquier programa de Solana. Este es el patrón general:- Investiga la estructura de las cuentas: consulta el código fuente o la documentación del programa
- Comienza con el filtrado por propietario: apunta al programa que administra las cuentas
- Aplica filtros estructurales: usa el tamaño de la cuenta, patrones de datos u otras características para limitar los resultados a tipos de cuentas específicos
- Agrega filtros dirigidos: céntrate en cuentas, estados o valores de datos específicos que sean importantes para tu aplicación