NOUVEAU : Helius acquiert Light Protocol
développer des smart contracts Solana avec Gill
Blog/Développement

Comment créer des applications Solana avec Gill

Créateur de @useDecal, auparavant chez @SolanaFndnNick Frostbutter sur XNick Frostbutter sur LinkedIn
9 min de lecture

Gill est la toute dernière bibliothèque d’outils de développement Solana basée sur JavaScript/TypeScript. Initialement développée par Nick Frostbutter, cofondateur de Decal, lorsqu’il travaillait au sein de l’équipe des relations développeurs de la Solana Foundation, gill vise à améliorer considérablement l’expérience des développeurs d’applications JavaScript.

Gill comprend à la fois des abstractions légèrement orientées pour accélérer la productivité des développeurs et des primitives de plus bas niveau, ce qui leur permet de choisir librement leur approche.

Les abstractions légères réduisent une grande partie de la complexité et du code répétitif nécessaires aux interactions courantes avec Solana. Les primitives de plus bas niveau offrent quant à elles des « portes de sortie » lorsque les développeurs ont besoin, ou envie, de contrôler plus finement la logique de leur application.

Cet article présente les bases de la « bibliothèque gill », son contenu, la prise en main de gill et les différences avec @solana/kit (anciennement « web3.js v2 »).

Qu’est-ce que Gill ?

Gill est une bibliothèque TypeScript moderne permettant de développer des applications Solana dans tout environnement basé sur JavaScript, du navigateur au serveur en passant par les appareils mobiles.

La bibliothèque gill s’adresse aux développeurs Solana de tous niveaux, des débutants aux experts. Comme elle réunit dans un même package des abstractions de haut niveau et des primitives de bas niveau, les développeurs peuvent facilement utiliser les fonctionnalités avancées lorsque cela s’avère nécessaire ou lorsque les abstractions ne les prennent pas en charge. 

Le meilleur dans tout ça ? 

Gill est entièrement compatible avec le tree-shaking. Votre bundler supprimera donc automatiquement toutes les primitives ou abstractions qui ne sont pas utilisées dans votre codebase.

L’objectif principal de Gill est d’améliorer l’expérience développeur en simplifiant les tâches courantes de développement sur Solana et en éliminant le code répétitif, sans empêcher les développeurs de travailler à plus bas niveau s’ils le souhaitent ou en ont besoin. Ils ne devraient pas être limités aux abstractions de haut niveau ou aux primitives de bas niveau. Ils devraient pouvoir choisir facilement l’une ou l’autre selon leurs besoins.

Installer Gill

Gill peut être installé dans n’importe quel projet basé sur JavaScript ou TypeScript, notamment NodeJS/Bun, un navigateur, React Native ou presque tout autre environnement JavaScript.

Code
npm install gill

La bibliothèque gill offre une prise en charge robuste de TypeScript et devrait fonctionner immédiatement dans la plupart des applications. La configuration propre à votre projet peut toutefois nécessiter quelques ajustements pour mieux fonctionner avec gill. Consultez la documentation pour en savoir plus sur la prise en charge de TypeScript dans gill.

Gill ou @solana/kit

La bibliothèque gill repose directement sur @solana/kit, les nouvelles primitives JavaScript de bas niveau développées par Anza pour remplacer l’ancien @solana/web3.js avec de meilleures performances.

Comme Kit ne fournit que ces primitives de bas niveau, les développeurs doivent tout créer manuellement. Leurs applications deviennent alors volumineuses et remplies de code répétitif et verbeux.

C’est là que gill intervient.

Gill fournit à la fois les mêmes primitives de bas niveau que Kit et des abstractions légèrement orientées qui simplifient les tâches courantes, le tout au moyen d’une interface unique et compatible. En simplifiant l’ensemble du processus avec gill, les développeurs peuvent consacrer plus de temps à la logique métier de leur application et moins au code répétitif et verbeux.

Exemples de code avec Gill et Kit

Les extraits de code suivants montrent comment simplifier votre code tout en conservant les mêmes fonctionnalités, voire en en ajoutant. Presque toutes les applications doivent effectuer deux tâches : établir une connexion à la blockchain et créer des transactions.

Voici comment créer une connexion à la blockchain avec @solana/kit :

Code
import {
  devnet,
  createSolanaRpc,
  createSolanaRpcSubscriptions,
  sendAndConfirmTransactionFactory,
} from "@solana/kit";

const rpc = createSolanaRpc(devnet("https://api.devnet.solana.com"));

const rpcSubscriptions = createSolanaRpcSubscriptions(
  devnet("wss://api.devnet.solana.com"),
);

const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({
  rpc,
  rpcSubscriptions,
});

La même logique peut être appliquée et simplifiée avec la fonction createSolanaClient de gill :

Code
import { createSolanaClient } from "gill";

const { rpc, rpcSubscriptions, sendAndConfirmTransaction } = createSolanaClient({
  urlOrMoniker: "devnet",
});

Vous pouvez maintenant effectuer de simples requêtes RPC à l’aide de l’objet rpc créé avec l’une ou l’autre des bibliothèques dans les exemples ci-dessus :

Code
// get the latest blockhash from your RPC provider
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();

Voici comment créer dans @solana/kit une transaction simple comprenant une instruction memo et des optimisations de base, à l’aide d’instructions de budget de calcul :

Code
import {
  pipe,
  createTransactionMessage,
  setTransactionMessageFeePayerSigner,
  appendTransactionMessageInstructions,
  setTransactionMessageLifetimeUsingBlockhash,
} from "@solana/kit";
import { getAddMemoInstruction } from "@solana-program/memo";
import {
  getSetComputeUnitLimitInstruction,
  getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";

const transaction = pipe(
  createTransactionMessage({ version: "legacy" }),
  (tx) => setTransactionMessageFeePayerSigner(signer, tx),
  (tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
  (tx) =>
    appendTransactionMessageInstructions(
      [
        getAddMemoInstruction({
          memo: "gm world!",
        }),
        getSetComputeUnitLimitInstruction({ units: 5000 }),
        getSetComputeUnitPriceInstruction({ microLamports: 1000 }),
      ],
      tx,
    ),
);

La même logique peut être considérablement simplifiée avec gill comme suit :

Code
import { createTransaction } from "gill";
import { getAddMemoInstruction } from "gill/programs";

const transaction = createTransaction({
  version: "legacy",
  feePayer: signer,
  instructions: [
    getAddMemoInstruction({
      memo: "gm world!",
    }),
  ],
  latestBlockhash,
  computeUnitLimit: 5000,
  computeUnitPrice: 1000,
});

Pour une comparaison plus complète entre ces deux bibliothèques, consultez la documentation de gill sur gill et @solana/kit.

En quoi consiste la migration de Kit vers Gill ?

Pour toute application utilisant la bibliothèque @solana/kit, la migration vers le package gill est très simple :

  1. Installez gill
  2. Remplacez tous les imports de @solana/kit par gill
  3. Désinstallez @solana/kit

Comme gill intègre aussi directement les clients les plus courants de la Solana Program Library (SPL), vous pouvez également remplacer les imports de ces packages par gill. Gill inclut les clients SPL suivants, directement accessibles depuis le chemin d’import gill/programs :

  • @solana-program/system
  • @solana-program/memo
  • @solana-program/compute-budget
  • @solana-program/address-lookup-table
  • @solana-program/token-2022 (voir la remarque ci-dessous concernant les clients de programmes de tokens)

Pour utiliser le seul package gill avec ces clients de programmes SPL :

  1. Remplacez les imports des packages @solana-program/* répertoriés ci-dessus par gill/programs
  2. Désinstallez les packages @solana-program/* répertoriés ci-dessus.

Une fois vos imports mis à jour, votre application est immédiatement prête à utiliser la bibliothèque « gill core ». Vous pouvez désormais remplacer très facilement le code répétitif et verbeux de Kit, notamment pour créer des connexions à la blockchain et des transactions, par les abstractions gill disponibles.

Quels composants Gill inclut-il ?

La bibliothèque gill se compose de quelques éléments clés :

  • Fonctionnalités de base (aussi appelées « gill core »)
  • Utilitaires propres aux environnements d’exécution serveur (comme NodeJS et Bun)
  • Clients de programmes
  • Générateurs de transactions
  • Mode débogage

Fonctions utilitaires Node.js

Le package gill comprend plusieurs utilitaires propres aux environnements d’exécution de serveurs JavaScript. Bien qu’ils soient inclus dans le package gill, ils disposent d’un chemin d’import distinct afin d’améliorer le tree-shaking. Ces utilitaires permettent notamment de charger et d’enregistrer facilement des paires de clés dans des fichiers ou des variables ENV.

Code
import { ... } from "gill/node"

Pour charger facilement un fichier de paire de clés depuis votre système de fichiers local, comme la paire de clés de Solana CLI :

Code
import { loadKeypairSignerFromFile } from "gill/node";

// default file path: ~/.config/solana/id.json
const signer = await loadKeypairSignerFromFile();
console.log("address:", signer.address);

Vous pouvez également charger une paire de clés encodée en base58 depuis une variable ENV :

Code
import { loadKeypairSignerFromEnvironmentBase58 } from "gill/node";

// loads signer from base58 keypair stored at `process.env[variableName]`
const signer = await loadKeypairSignerFromEnvironmentBase58(variableName);
console.log("address:", signer.address);

Générateurs de transactions

Pour simplifier la création de transactions courantes qui interagissent souvent avec plusieurs programmes à la fois, gill inclut différents « générateurs de transactions » permettant d’assembler facilement des transactions prêtes à signer pour ces tâches.

Comme chaque générateur de transactions est limité à une seule tâche, il peut facilement masquer diverses parties du code répétitif tout en contribuant à créer une transaction optimisée.

Voici quelques-uns des générateurs de transactions proposés par gill :

  • buildCreateTokenTransaction - créer un token avec des métadonnées
  • buildMintTokensTransaction - créer des tokens dans un portefeuille de destination
  • buildTransferTokensTransaction - transférer des tokens vers un portefeuille de destination

Chaque générateur de transactions est accompagné d’un « générateur d’instructions » qui rend ces abstractions gill plus flexibles pour les développeurs.

Mode débogage

Dans gill, vous pouvez activer le « mode débogage » afin de journaliser automatiquement des informations supplémentaires qui vous aideront à résoudre les problèmes liés à vos transactions.

Le mode débogage est désactivé par défaut afin de limiter les journaux supplémentaires générés par votre application. Grâce à son contrôleur flexible, vous pouvez l’activer depuis les environnements les plus courants dans lesquels votre code s’exécute, notamment le code lui-même, les backends NodeJS, les fonctions serverless et même la console du navigateur web.

Pour activer le mode débogage, définissez l’une des options suivantes sur true ou 1 :

  • process.env.GILL_DEBUG
  • global.__GILL_DEBUG__
  • window.__GILL_DEBUG__ (par exemple, dans la console de votre navigateur web)
  • ou définissez manuellement n’importe quel niveau de journalisation du débogage (voir la documentation)

Consultez la documentation de gill sur le mode débogage pour en savoir plus.

Outils complémentaires pour développer avec Gill

@gillsdk/react

La bibliothèque gill contient directement un autre package, @gillsdk/react, qui regroupe des hooks React conçus pour améliorer radicalement l’expérience des développeurs d’applications frontend basées sur React. Il repose également sur TanStack Query, une bibliothèque de réactivité populaire, ce qui facilite son utilisation dans les applications existantes.

Le package @gillsdk/react en est encore à ses débuts et fait l’objet d’un développement actif. Il fournit actuellement plusieurs hooks React utiles pour les applications Solana :

  • useAccount - obtenir les informations du compte pour une adresse
  • useBalance - obtenir le solde du compte (en lamports)
  • useLatestBlockhash - obtenir le dernier blockhash
  • useSignatureStatuses - obtenir les statuts des signatures
  • useProgramAccounts - obtenir les comptes du programme (GPA)
  • useTokenMint - obtenir le compte Mint décodé d’un token
  • useTokenAccount - obtenir le compte de token pour un Mint et un propriétaire donnés (ou ATA)

Codama

Codama est un outil qui permet aux développeurs de partir de l’IDL d’un programme Solana et de générer des bibliothèques clientes, par exemple en JavaScript ou en Rust, destinées à d’autres applications. Codama ramène toute la complexité de la création d’instructions Solana à un IDL, un fichier de configuration et l’import d’une fonction.

Gill et Codama s’intègrent facilement grâce à la fonction createCodamaConfig de gill. Le mainteneur de gill travaille aussi activement à renforcer encore davantage l’intégration gill<>Codama, notamment avec une prise en charge directe dans Codama CLI !

Par défaut, les clients TypeScript de programmes générés par Codama utilisent @solana/kit, mais cela peut être facilement modifié dans le fichier de configuration Codama de votre programme Solana. La fonction createCodamaConfig simplifie considérablement la migration vers gill dans votre configuration Codama.

Voici un exemple de fichier codama.js qui générera un client TypeScript de programme Solana utilisant gill :

Code
import { createCodamaConfig } from "gill";

export default createCodamaConfig({
  idl: "program/idl.json",
  clientJs: "clients/js/src/generated",
});

Vous trouverez dans la documentation de gill un guide complet pour générer des clients de programmes Solana avec Codama.

L’avenir de Gill

L’avenir de la bibliothèque gill est prometteur et il reste beaucoup à faire. Le site officiel de la documentation de gill vient d’être lancé et la bibliothèque approche les 20 000 téléchargements mensuels.

Pour en savoir plus sur la feuille de route actuelle de gill, consultez la page GitHub Projects. Pour le moment, la liste restreinte comprend :

  • Prise en charge directe de la spécification Solana Pay
  • Intégration native de la spécification de l’API Digital Assets Standard (DAS)
  • Meilleure prise en charge des tokens basés sur Token Extension
  • Meilleure prise en charge des Address Lookup Tables
  • Documentation plus complète

Inclus dans la bibliothèque gill, le package @gillsdk/react en est encore à ses débuts, avec neuf hooks React différents. Son développement se poursuit afin de permettre aux développeurs d’ajouter facilement de la réactivité à leurs applications basées sur React, notamment grâce à la prise en charge de toutes les méthodes RPC Solana courantes et à une intégration plus étroite avec wallet-ui.

Le saviez-vous ? Il est prévu d’intégrer directement gill au framework Anchor afin que les développeurs puissent profiter plus facilement des optimisations de gill et de ses améliorations de l’expérience développeur dans leurs applications. Qui sait, gill deviendra peut-être la solution par défaut dans Anchor v2. :shhh:

Comment contribuer à Gill

La bibliothèque gill est open source sous licence MIT, et les contributions sont les bienvenues ! Si vous souhaitez contribuer à la bibliothèque, consultez les issues ouvertes et envisagez d’en traiter une vous-même.

Si vous souhaitez proposer une nouvelle fonctionnalité ou une amélioration de la bibliothèque, commencez par ouvrir une issue afin d’en discuter avec les mainteneurs avant de travailler sur le code d’une PR.

Ressources supplémentaires

Vous trouverez davantage d’informations et de ressources sur gill aux liens suivants :

Abonnez-vous à Helius

Suivez les dernières actualités du développement sur Solana et recevez une notification à chaque publication