3 minutos de lectura
Resumen
El 10 de octubre de 2022 (Época 358), Solana incorporó la compatibilidad con nuevos tipos de versiones de transacciones a través de un concepto conocido como«transacciones versionadas». Tras este cambio, el entorno de ejecución de Solana admite ahora dos tipos de transacciones: «legacy» (transacciones antiguas) y «0» (transacciones que incluyen tablas de búsqueda de direcciones). Aunque los programas en cadena no tienen por qué adoptar el cambio, muchas aplicaciones del lado del cliente deben actualizarse para evitar errores debidos a los diferentes tipos de transacciones.
En esta guía, descubrirás los cambios técnicos derivados del lanzamiento de las transacciones versionadas de Solana y cómo actualizar tu código del lado del cliente para adaptarte a dichos cambios.
Lo que necesitarás
- Node.js (versión 16.15 o superior) instalado
- Experiencia con la API JSON-RPC de Solana Web3
Cambios en el código del lado del cliente: versión máxima de transacción admitida
Las solicitudes JSON RPC de Solana que devuelven una transacción incluyen ahora un parámetro opcional: ` maxSupportedTransactionVersion`. Este parámetro indica al entorno de ejecución cuál es la versión más alta de las transacciones que la aplicación debe esperar. En el momento de redactar este documento (11/10/2022), se pueden pasar dos valores:
- heredado: formato de transacción antiguo sin ventajas adicionales
- 0: se ha añadido compatibilidad con las tablas de búsqueda de direcciones
Si la solicitud devuelve una transacción con una versión superior a la establecida en `maxSupportedTransactionVersion` (es decir, si se devuelve una transacción de versión 0 cuando se selecciona «legacy» ), el entorno de ejecución devolverá un error.
Cómo evitar errores en las aplicaciones existentes
En la actualidad, hay dos métodos JSON-RPC nativos de Solana que se ven afectados por este cambio y que deben incluir el parámetro «maxSupportedTransactionVersion »:
- getBlock
- getTransaction
(Nota: los métodos no nativos, getParsedTransaction y getParsedBlock, también aceptan este parámetro)
Aunque el parámetro «maxSupportedTransactionVersion» es opcional en ambos métodos, se recomienda establecerlo en 0 para incluir todos los tipos de transacciones y evitar errores.
getBlock()
getBlock Las llamadas a métodos deberían añadir { maxSupportedTransactionVersion: 0 } después del deseado ranura para buscar:
const web3 = require("@solana/web3.js");
(async () => {
const solana = new web3.Connection("https://example.solana-mainnet.quiknode.pro/0123456/");
console.log(
await solana.getBlock(
94101948,
//ADD THIS 👇
{ maxSupportedTransactionVersion: 0 })
);
})();
La clase devuelta, `VersionedBlockResponse`, es muy similar a `BlockResponse`, pero presenta una diferencia clave. La matriz `Transactions` incluirá una clase `MessageV0` en lugar de `Message`, lo que te permitirá acceder a `addressTableLookups`. Para obtener más detalles sobre la clase `MessageV0`, consulta solana-labs.github.io/.
getTransaction()
getTransaction Las llamadas a métodos deberían añadir { maxSupportedTransactionVersion: 0 } después del deseado ID de transacción para buscar:
const web3 = require("@solana/web3.js");
(async () => {
const solana = new web3.Connection("https://example.solana-mainnet.quiknode.pro/0123456/");
console.log(
await solana.getTransaction(
"D13jTJYXoQBcRY9AfT5xRtsew7ENgCkNs6mwwwAcUCp4ZZCEM7YwZ7en4tVsoDa7Gu75Jjj2FgLXNUz8Zmgedff",
//ADD THIS 👇
{ maxSupportedTransactionVersion: 0 }
)
);
})();
Referencia: edge.docs.solana.com/.../transacciones-versionadas
Resultados del análisis de JSON
La Fundación Solana recomienda ahora utilizar la codificación «JSON Parsed», ya que incluye todas las claves de las cuentas de transacción (incluidas las de las tablas de consulta) en la lista «accountKeys» del mensaje. Esto facilita la resolución de los cambios de saldo detallados en preBalances / postBalances y preTokenBalances / postTokenBalances. Si, en cambio, se utiliza la codificación «json», las entradas de preBalances / postBalances y preTokenBalances / postTokenBalances pueden hacer referencia a claves de cuenta que NO figuran en la lista «accountKeys» y que deben resolverse utilizando las entradas «loadedAddresses» de los metadatos de la transacción. (Fuente: Fundación Solana).
En el caso de tus aplicaciones de JavaScript, esto significa simplemente cambiar
- de `getTransaction() ` a ` getParsedTransaction() ` y
- de getBlock() a getParsedBlock()
Para las solicitudes cURL/CURL, configura la codificación en «jsonParsed»:
{"encoding": "Parsed"}
Referencia: docs.solana.com/...migración-de-transacciones-versionadas
Resumen
Si estás ejecutando código existente del lado del cliente y utilizas getBlock o getTransaction, ¡eso es todo lo que tienes que hacer! Si utilizas Python o cURL/CURL requests, consulta nuestra documentación para ver ejemplos de código aquí.
Las transacciones versionadas han llegado para quedarse y, a medida que se implementen nuevas versiones, tendrás que mantenerte al día con las actualizaciones de la red para garantizar que tu dApp sea compatible con las últimas versiones. Para estar al día de las últimas noticias e información sobre Solana, suscríbete a nuestro boletín o síguenos en Twitter.
Si tienes alguna duda o quieres hablar sobre tu proyecto, escríbenos en Discord.
¡Nos encanta recibir comentarios!
Si tienes algún comentario o pregunta sobre esta guía, háznoslo saber. ¡Nos encantaría saber tu opinión!
