8 minutos de lectura
Resumen
¿Alguna vez has necesitado recuperar todas las transacciones asociadas a una cartera? ¿Quieres ver todas las transacciones de acuñación asociadas a una «Candy Machine»? ¿O quizá consultar el historial de transacciones de un NFT? El método `getSignaturesForAddress` de Solana es una herramienta versátil que facilita enormemente la obtención del historial de transacciones.
¿Prefieres un tutorial en vídeo? Sigue los pasos de Noah y aprende a obtener los registros de transacciones de Solana utilizando Solana web3.js en 15 minutos.
Tus funciones
¡En esta guía te adentrarás en el apasionante mundo de las transacciones de Solana! Crearás un script sencillo capaz de consultar una dirección (monedero, ID de programa, acuñación de tokens, etc.) y obtener todo el historial de transacciones asociado a ella.
Lo que necesitarás
- Node.js (versión 16.15 o superior)
- Hilo instalado
- Solana web3
- Experiencia con transacciones básicas en Solana. Para repasar tus conocimientos, lee nuestra guía para principiantes sobre «Cómo enviar una transacción en Solana».
- Conocimientos de JavaScript
¡Empecemos!
Configura tu entorno
Crea un nuevo directorio para el proyecto y un archivo llamado «log.js» en tu terminal con el siguiente comando:
mkdir get_sol_tx
cd get_sol_tx
echo > log.js
Instalar las dependencias de Solana web3:
yarn init -y
yarn add @solana/web3.js@1
o
npm init -y
npm install --save @solana/web3.js@1
Abre log.js en el editor de código que prefieras y, en la línea 1, incluye @solana/web3.js y guárdalo en una constante, **solanaWeb3:
**
const solanaWeb3 = require('@solana/web3.js');
Indica la dirección que te gustaría buscar:
const searchAddress = 'TU_DIRECCIÓN_AQUÍ'; //ejemplo: «vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg»
Nota: puede ser cualquier dirección válida en Solana (por ejemplo, una dirección de monedero, una dirección de acuñación o una dirección de programa). Si aún no tienes una, puedes utilizar «vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg» como ejemplo.
¡Vale, ya estamos listos para ponernos a cocinar!
Establecer una conexión con tu RPC de Quicknode
Para desarrollar en Solana, necesitarás un punto final de API para conectarte a la red. Puedes utilizar nodos públicos o implementar y gestionar tu propia infraestructura; sin embargo, si quieres tiempos de respuesta 8 veces más rápidos, puedes dejarnos a nosotros el trabajo pesado.
Descubre por qué más del 50 % de los proyectos de Solana eligen Quicknode y regístrate gratis aquí.
Vamos a poner en marcha nuestro nodo en la red de desarrollo de Solana, pero puedes poner en marcha el nodo que mejor se adapte a tus necesidades. Copia el enlace del proveedor HTTP:

Vuelve al archivo log.js y crea una constante, un punto final, y asígnale tu URL de Quicknode. En la línea siguiente, pasa esta constante como parámetro a la función Connection y guárdala en otra constante llamada solanaConnection:
const punto final = 'https://example.solana-devnet.quiknode.pro/000000/';
const conexiónSolana = new solanaWeb3.Conexión(punto de conexión);
¡Genial! Ya estás listo para crear tu función de búsqueda.
Crear una consulta de transacciones
El método `getSignaturesForAddress ` se encargará de gran parte del trabajo pesado en este caso. Así es como funcionará:
Aceptará dos parámetros:
- Dirección de búsqueda (obligatorio): la clave pública que deseas consultar
- Opciones (opcional): un objeto que incluye tres entradas opcionales:
- antes: empezar a buscar hacia atrás en el tiempo, antes de la firma de una transacción concreta
- después: comenzar la búsqueda en sentido cronológico a partir de una firma de transacción concreta
- límite: número máximo de transacciones que se van a devolver (Ten en cuenta que el valor máximo y por defecto es 1.000)
Devolverá una Promise que contiene un array de objetos` ConfirmedSignatureInfo`, un tipo de objeto que incluye información clave sobre la transacción:
- firma (ID de transacción),
- slot y blockTime (para ver cuándo se procesó la transacción),
- err (si hay algún error), y
- nota (si hay alguna nota relacionada con la operación)
Define una nueva función asíncrona, `getTransactions`, que toma dos parámetros: `address ` y `numTx`.
Dentro de nuestra función, llamamos al método `getSignaturesForAddress ` en una nueva instancia de ` solanaConnection ` y guardamos el resultado en una variable, ` transactionList`:
const getTransactions = async(address, numTx) => {
const pubKey = new solanaWeb3.PublicKey(address);
let transactionList = await solanaConnection.getSignaturesForAddress(pubKey, {limit:numTx});
}
Esto debería proporcionarnos un array con todo el historial de transacciones que cumpla con nuestros criterios de búsqueda. Vamos a registrar los resultados de forma que sean fáciles de leer.
Dentro de `getTransactions`, crea un bucle `forEach` para registrar la información de cada transacción:
const getTransactions = async(address, numTx) => {
const pubKey = new solanaWeb3.PublicKey(address);
let transactionList = await solanaConnection.getSignaturesForAddress(pubKey, {limit:numTx});
transactionList.forEach((transaction, i) => {
const date = new Date(transaction.blockTime*1000);
console.log(`Transaction No: ${i+1}`);
console.log(`Signature: ${transaction.signature}`);
console.log(`Time: ${date}`);
console.log(`Status: ${transaction.confirmationStatus}`);
console.log(("-").repeat(20));
})
}
¡Ejecuta tu código!
Si todo está configurado correctamente, ¡deberías poder llamar a tu función y ver algunos resultados! Añade esto al final del archivo log.js:
getTransactions(searchAddress,3);
Y ahora, en tu terminal, escribe:
nodo log.js
Deberías ver algo como esto:

¡Guau! Es bastante fácil, ¿verdad? No dudes en probar con varias carteras diferentes, una dirección de acuñación de NFT y un ID de Candy Machine. Verás que el método debería dar resultados similares, lo que lo hace muy útil para muchas aplicaciones diferentes.
¡Enhorabuena! Has conseguido realizar transacciones con éxito... Puedes dejarlo aquí, pero si quieres ver qué más podemos hacer con esa firma de transacción, ¡sigue leyendo! 👇
Análisis de la transacción
Así pues, ya tenemos información básica útil sobre nuestro historial de transacciones, pero ¿en qué consistió cada una de ellas? Podemos utilizar el método `getParsedTransaction` de Solana para obtener un montón de detalles adicionales.
El método `getParsedTransaction ` toma una firma de transacción confirmada o finalizada y devuelve un objeto `ParsedTransactionWithMeta`:
export type ParsedTransactionWithMeta = {
/** The slot during which the transaction was processed */
slot: number;
/** The details of the transaction */
transaction: ParsedTransaction;
/** Metadata produced from the transaction */
meta: ParsedTransactionMeta | null;
/** The unix timestamp of when the transaction was processed */
blockTime?: number | null;
/** The version of the transaction message */
version?: TransactionVersion;
};
Aquí hay mucha información que no vamos a tratar en esta guía introductoria, pero sí queremos dar un ejemplo de cómo puedes interactuar con estos objetos.
Dentro de la función `getTransactions`, declaremos dos nuevas variables: `signatureList` y `transactionDetails`. Generaremos una lista de firmas mediante el mapeo de nuestra `transactionList`, y obtendremos los detalles de cada transacción llamando a esas firmas en `getParsedTransactions`:
const getTransactions = async(address, numTx) => {
const pubKey = new solanaWeb3.PublicKey(address);
let transactionList = await solanaConnection.getSignaturesForAddress(pubKey, {limit:numTx});
//Add this code
let signatureList = transactionList.map(transaction=>transaction.signature);
let transactionDetails = await solanaConnection.getParsedTransactions(signatureList, {maxSupportedTransactionVersion:0});
//--END of new code
transactionList.forEach((transaction, i) => {
const date = new Date(transaction.blockTime*1000);
console.log(`Transaction No: ${i+1}`);
console.log(`Signature: ${transaction.signature}`);
console.log(`Time: ${date}`);
console.log(`Status: ${transaction.confirmationStatus}`);
console.log(("-").repeat(20));
})
}
Cuando se devuelvan nuestras promesas, ` transactionDetails ` devolverá una matriz de objetos `ParsedTransactionWithMeta`. Intentemos encontrar alguna información útil en ella.
Supongamos que nos interesa encontrar todos los programas o contratos inteligentes con los que hemos interactuado en una transacción determinada. Dentro de nuestro bucle «forEach» original, tras la declaración de la variable «date», creemos una nueva variable, «transactionInstructions»:
const instruccionesDeTransacción = detallesDeLaTransacción[i].transacción.mensaje.instrucciones;
Esto utilizará nuestro índice, i, para buscar la información detallada de la misma transacción que se está consultando en el bucle. Dado que cada transacción puede tener varias instrucciones o iteraciones del programa, necesitaremos otro bucle para obtener cada interacción del programa dentro de nuestra transacción. Dentro de nuestro bucle, después del registro de confirmationStatus, añade lo siguiente:
transactionInstructions.forEach((instruction, n)=>{
console.log(`---Instructions ${n+1}: ${instruction.programId.toString()}`);
})
Lo que hacemos aquí es, para cada transacción, examinar cada instrucción de la transacción y registrar el nombre del programa (si existe) y el identificador del programa.
La función final debería tener este aspecto:
const getTransactions = async(address, numTx) => {
const pubKey = new solanaWeb3.PublicKey(address);
let transactionList = await solanaConnection.getSignaturesForAddress(pubKey, {limit:numTx});
let signatureList = transactionList.map(transaction=>transaction.signature);
let transactionDetails = await solanaConnection.getParsedTransactions(signatureList, {maxSupportedTransactionVersion:0});
transactionList.forEach((transaction, i) => {
const date = new Date(transaction.blockTime*1000);
const transactionInstructions = transactionDetails[i].transaction.message.instructions;
console.log(`Transaction No: ${i+1}`);
console.log(`Signature: ${transaction.signature}`);
console.log(`Time: ${date}`);
console.log(`Status: ${transaction.confirmationStatus}`);
transactionInstructions.forEach((instruction, n)=>{
console.log(`---Instructions ${n+1}: ${instruction.programId.toString()}`);
})
console.log(("-").repeat(20));
})
}
Ahora, vuelve a ejecutar el script. En la terminal, escribe:
nodo log.js
Deberías ver algo como esto:

¡Buen trabajo! ¡Los resultados de nuestras transacciones ahora incluyen detalles sobre los diferentes programas con los que hemos interactuado!
Si lo deseas, puedes comparar tus resultados con los del explorador de Solana buscando tu dirección aquí (asegúrate de que estás buscando en la misma red cambiando la selección en la esquina superior derecha de la página).
Conclusión
¡Enhorabuena! ¡Ya conoces de primera mano el apasionante mundo de las transacciones de Solana!
Hablaremos más sobre esto en una guía futura; pero si tienes ganas de seguir explorando, prueba a experimentar con tu matriz `transactionDetails` ejecutando algunas consultas similares que, en su lugar, analicen:
- transactionDetails[i].meta
- transactionDetails[i].transaction.message.accountKeys
Para poner en práctica estos conceptos, echa un vistazo a algunos de nuestros otros tutoriales sobre Solana aquí.
Suscríbete a nuestro boletín para recibir más artículos y guías sobre Solana. No dudes en ponerte en contacto con nosotros a través de Twitter si tienes algún comentario. Siempre puedes charlar con nosotros en nuestro servidor de Discord, donde encontrarás a algunos de los desarrolladores más geniales que jamás hayas conocido :)
¡Nos encanta recibir comentarios!
Si tienes algún comentario o sugerencia sobre nuevos temas, no dudes en hacérnoslo saber. Nos encantaría saber tu opinión.
