
Solana Dev 101 - Désérialiser les données de compte sur Solana
Introduction
Interagir avec les données sur Solana peut être complexe. Les données de compte et de transaction sont souvent encodées, ce qui améliore l’efficacité, mais complique la tâche des développeurs.
Solana utilise Borsh (Binary Object Representation Serializer for Hashing) pour sérialiser ses données, ce qui comprend les processus de sérialisation et de désérialisation. L’un des principaux avantages de Borsh est son déterminisme, qui garantit une sortie sérialisée identique pour une même entrée.
Dans ce tutoriel, nous verrons comment désérialiser les données d’un compte de token et obtenir des données lisibles que vous pourrez utiliser. À l’aide de la bibliothèque Token Program, vous suivrez un exemple simple qui consiste à décomposer les informations brutes du compte d’un NFT à partir de son adresse de mint.
Voici comment nous allons transformer les données brutes du compte en données plus lisibles :
Vous pouvez suivre l’intégralité du code de ce tutoriel en clonant notre dépôt deserialize-account, ici.
Prérequis
Voici les prérequis pour ce tutoriel :
- Connaissances de base en TypeScript
- ts-node installé
- Un RPC
- Dépôt d’exemple
Configuration de l’environnement
Clonez le dépôt d’exemple :
git clone https://github.com/helius-labs/deserialize-base.gitAccédez au répertoire du projet :
cd deserialize-baseInstallez npm :
npm installVotre projet est maintenant configuré !
Vous pouvez maintenant commencer à construire la logique qui désérialisera les données du compte pour une adresse de mint donnée.
Étapes de création
Suivez ces étapes :
1. Récupérer les données du compte
Dans notre fichier /src/deserialize.ts, importons les modules nécessaires :
import { Connection, PublicKey } from "@solana/web3.js";Vous les utiliserez ensuite pour définir notre connexion à Solana ainsi que la valeur PublicKey du mint dont vous souhaitez désérialiser les données.
En dessous, vous allez configurer la fonction principale.
Vous allez également configurer notre connexion à Solana à l’aide de notre URL RPC Helius et définir le mint que vous désérialiserez dans ce tutoriel.
async function deserializeMint() {
// CONNECTION TO SOLANA USING HELIUS
const rpc = 'https://rpc.helius.xyz/?api-key=';
const connection = new Connection(rpc);
// MINT THAT WE ARE DESERIALIZING
const mint = new PublicKey('6MWfAt3S9Xu4ybxxgPm6e4LSwuXfyAwGXd5yfUqpox9K');
}
deserializeMint()Dans le code ci-dessus, veillez à remplacer api-key par votre propre clé API Helius. Pour ce tutoriel, vous pouvez également remplacer le mint utilisé par l’un de vos exemples.
Ensuite, vous allez configurer un bloc try/catch pour récupérer les données brutes du compte de ce mint :
try {
let { data } = (await connection.getAccountInfo(mint)) || {};
if (!data) {
return;
}
console.log(data);
} catch {
return null;
}À l’étape ci-dessus, vous utilisez notre connexion pour effectuer un appel RPC sur Solana pour getAccountInfo. Vous obtenez ainsi les données initiales qu’il faudra ensuite décomposer.
Si aucune donnée n’est trouvée, la valeur null sera renvoyée. Sinon, les résultats de la recherche s’afficheront dans votre terminal.
Vous pouvez maintenant exécuter ts-node deserialize pour afficher les résultats.
Vous devriez obtenir un résultat semblable au suivant :
L’objectif de la désérialisation est ici de convertir ces données dans un format lisible.
Pour cela, vous devez consulter le code source afin d’identifier la structure attendue par le programme qui a créé ces données.
2. Configurer les types de compte
Dans cet exemple, vous souhaitez obtenir l’AccountInfo 6MWfAt3S9Xu4ybxxgPm6e4LSwuXfyAwGXd5yfUqpox9K d’un mint SPL.
Pour cela, vous devez décomposer les types des données brutes du mint et la structure du buffer fournie dans la Solana Program Library. Comprendre la structure des données fournies est une étape essentielle pour désérialiser des données sur Solana.
L’image ci-dessus présente la struct RawMint et la valeur MintLayout définies par le programme. Vous pouvez simplement les copier dans notre fichier de types afin de les utiliser.
Accédez maintenant à notre répertoire ./src/types.
Dans le fichier /src/types.ts, configurez l’importation de nos types :
import { PublicKey } from "@solana/web3.js";
import { u32, u8, struct } from "@solana/buffer-layout";
import { publicKey, u64, bool } from "@solana/buffer-layout-utils";Cela définit le format et la structure des données brutes du mint nécessaires pour désérialiser les données de compte du NFT dans cet exemple.
Vous pouvez maintenant configurer notre interface et notre structure comme ci-dessus.
Vous utilisez les éléments importés PublicKey, u32, u8, publicKey, u64 et bool.
// Defining RawMint from https://github.com/solana-labs/solana-program-library/blob/48fbb5b7c49ea35848442bba470b89331dea2b2b/token/js/src/state/mint.ts#L31 //
export interface RawMint {
mintAuthorityOption: 1 | 0;
mintAuthority: PublicKey;
supply: bigint;
decimals: number;
isInitialized: boolean;
freezeAuthorityOption: 1 | 0;
freezeAuthority: PublicKey;
}
// Defining Buffer Layout from https://github.com/solana-labs/solana-program-library/blob/48fbb5b7c49ea35848442bba470b89331dea2b2b/token/js/src/state/mint.ts#L31 //
/** Buffer layout for de/serializing a mint */
export const MintLayout = struct([
u32('mintAuthorityOption'),
publicKey('mintAuthority'),
u64('supply'),
u8('decimals'),
bool('isInitialized'),
u32('freezeAuthorityOption'),
publicKey('freezeAuthority'),
]);Vous avez maintenant configuré nos types pour les informations brutes du compte ! Vous pouvez les importer dans notre fichier principal deserialize.ts et les utiliser pour désérialiser les données renvoyées précédemment.
Dans MintLayout, RawMint est défini comme struct. Cela revient essentiellement à appliquer à l’interface que vous avez configurée le type de cette structure définie dans la source GitHub.
3. Désérialiser les données renvoyées
Maintenant que vous comprenez la structure des données attendues, vous pouvez configurer notre fonction de décodage, qui ne comporte qu’une seule ligne de code. Revenez au fichier src/deserialize.ts pour la configurer.
Tout d’abord, dans notre fichier principal deserialize.ts, importez MintLayout depuis notre fichier types.ts :
import { MintLayout } from "./types";Vous pouvez maintenant ajouter une seule ligne à notre fonction de désérialisation, juste après la récupération des données du compte :
const deserialize = MintLayout.decode(data)
console.log(deserialize)Cette ligne utilise MintLayout pour décoder les données renvoyées par notre fonction deserializeMint.
Vous pouvez exécuter ts-node deserialize depuis votre dossier ./src. Vous obtiendrez un résultat semblable au suivant :
{
mintAuthorityOption: 1,
mintAuthority: PublicKey [PublicKey(5WQAPQ8i8wqHcSWSEkBQ9kqfwRJxxgyZqAtKiwJSW5zT)] {
_bn:
},
supply: 1n,
decimals: 0,
isInitialized: true,
freezeAuthorityOption: 1,
freezeAuthority: PublicKey [PublicKey(5WQAPQ8i8wqHcSWSEkBQ9kqfwRJxxgyZqAtKiwJSW5zT)] {
_bn:
}
}C’est nettement plus lisible ! À l’étape suivante, vous pouvez rendre le résultat encore plus clair en décomposant la réponse selon les types qu’elle contient.
Enfin, vous pouvez encore nettoyer ces données en adaptant la réponse au format présenté ci-dessus. Pour cela, procédez comme suit :
// Breaking down the response //
console.log(deserialize.mintAuthorityOption)
console.log(deserialize.mintAuthority.toString())
console.log(deserialize.decimals)
console.log(deserialize.isInitialized)
console.log(deserialize.freezeAuthorityOption)
console.log(deserialize.freezeAuthority.toString())Dans le code ci-dessus, il suffit de convertir la valeur PublicKeys renvoyée au format toString. Les autres données peuvent être renvoyées dans leur format d’origine. Puisque le format des données est connu, nous pouvons également le configurer à l’avance, ce qui produira le résultat suivant :
1
5WQAPQ8i8wqHcSWSEkBQ9kqfwRJxxgyZqAtKiwJSW5zT
0
true
1Vous pouvez adapter ces données comme vous le souhaitez.
Cette opération les décompose simplement dans un format qui facilite la lecture des résultats.
Code complet :
Consultez ici le code complet de deserialize.ts :
import { Connection, PublicKey } from "@solana/web3.js";
import { RawMint, MintLayout } from "./types";
async function deserializeMint() {
const rpc =
"https://rpc.helius.xyz/?api-key=";
const connection = new Connection(rpc);
const mint = new PublicKey("6MWfAt3S9Xu4ybxxgPm6e4LSwuXfyAwGXd5yfUqpox9K");
try {
let { data } = (await connection.getAccountInfo(mint)) || {};
if (!data) {
return;
}
// Data returned.
console.log(data);
// Deserialize Data.
const deserialize = MintLayout.decode(data)
// Breaking down the response //
console.log(deserialize.mintAuthorityOption)
console.log(deserialize.mintAuthority.toString())
console.log(deserialize.decimals)
console.log(deserialize.isInitialized)
console.log(deserialize.freezeAuthorityOption)
console.log(deserialize.freezeAuthority.toString)
} catch {
return null;
}
}
deserializeMint();Conclusion
Vous avez maintenant désérialisé les données du compte d’un NFT sur Solana ! Vous pouvez appliquer les mêmes méthodes à d’autres cas d’usage et suivre une démarche de recherche similaire pour déterminer la structure du programme correspondant aux données fournies.
Veillez à consulter la source du programme dont vous souhaitez désérialiser les données, puis essayez d’appliquer ces méthodes par vous-même.
Ressources
Articles associés
Abonnez-vous à Helius
Suivez les dernières actualités du développement sur Solana et recevez une notification à chaque publication


