NUEVO: Helius adquiere Light Protocol
desarrolla contratos inteligentes de Solana con Gill
Blog/Desarrollo

Cómo crear aplicaciones de Solana con Gill

Creando @useDecal, antes en @SolanaFndnNick Frostbutter en XNick Frostbutter en LinkedIn
9 min de lectura

Gill es la biblioteca más reciente de herramientas para desarrolladores de Solana basada en JavaScript/TypeScript. Fue desarrollada originalmente por Nick Frostbutter, cofundador de Decal, mientras formaba parte del equipo de Relaciones con Desarrolladores de Solana Foundation. gill busca mejorar significativamente la experiencia de desarrollo de aplicaciones basadas en JavaScript.

Gill incluye abstracciones ligeramente estructuradas para acelerar la productividad de los desarrolladores, así como primitivas de bajo nivel. Esto les da flexibilidad para elegir su propio enfoque.

Las abstracciones ligeras reducen muchas de las complejidades y el código repetitivo necesarios para realizar interacciones comunes con Solana. Las primitivas de bajo nivel proporcionan «vías de escape» cuando los desarrolladores necesitan (o quieren) un control más detallado sobre la lógica de su aplicación.

Este artículo explica los fundamentos de la «biblioteca gill», qué incluye, cómo comenzar a usar gill y las diferencias con @solana/kit (antes conocida como «web3.js v2»).

¿Qué es Gill?

Gill es una biblioteca moderna de TypeScript para desarrollar aplicaciones de Solana en cualquier entorno basado en JavaScript, desde navegadores y servidores hasta dispositivos móviles.

La biblioteca gill está diseñada para desarrolladores de Solana de todos los niveles, desde principiantes hasta expertos. Al incluir abstracciones de alto nivel y primitivas de bajo nivel en el mismo paquete, los desarrolladores pueden usar fácilmente las funciones más avanzadas cuando las necesiten o cuando las abstracciones no las admitan. 

¿Lo mejor? 

Gill es totalmente compatible con tree-shaking, por lo que tu empaquetador eliminará automáticamente cualquier primitiva o abstracción que no uses en tu código base.

El objetivo principal de Gill es mejorar la experiencia de desarrollo. Para ello, simplifica las tareas comunes de desarrollo en Solana y elimina el código repetitivo, sin sacrificar la posibilidad de trabajar a un nivel más bajo si el desarrollador lo quiere o necesita. Los desarrolladores no deberían estar limitados a elegir únicamente abstracciones de alto nivel o primitivas de bajo nivel. Deberían poder elegir cualquiera de las dos opciones con facilidad cuando les resulte conveniente.

Instalar Gill

Gill se puede instalar en cualquier proyecto basado en JavaScript o TypeScript, incluidos NodeJS/Bun, navegadores, React Native o prácticamente cualquier otro entorno JavaScript.

Código
npm install gill

La biblioteca gill ofrece una sólida compatibilidad con TypeScript y debería funcionar de inmediato en la mayoría de las aplicaciones. Sin embargo, quizá debas ajustar la configuración específica de tu proyecto para que funcione mejor con gill. Consulta la documentación para obtener más información sobre la compatibilidad de TypeScript con gill.

Gill frente a @solana/kit

La biblioteca gill se construyó directamente sobre @solana/kit, las nuevas primitivas JavaScript de bajo nivel desarrolladas por Anza como un reemplazo más eficiente para la antigua @solana/web3.js.

Como Kit solo incluye estas primitivas de bajo nivel, los desarrolladores deben crear todo manualmente. Esto genera aplicaciones sobredimensionadas con mucho código repetitivo.

Aquí entra gill.

Gill incluye las mismas primitivas de bajo nivel que Kit y abstracciones ligeramente estructuradas para simplificar tareas comunes, todo desde una interfaz única y compatible. Al simplificar todo con gill, los desarrolladores pueden dedicar más tiempo a la lógica de negocio de su aplicación y menos al código repetitivo.

Ejemplos de código de Gill frente a Kit

Los siguientes fragmentos de código muestran cómo puedes simplificar tu código sin perder funcionalidad (e incluso agregar más). Casi todas las aplicaciones necesitan realizar dos tareas: establecer una conexión con la blockchain y crear transacciones.

Una conexión con la blockchain se crea con @solana/kit de la siguiente manera:

Código
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,
});

Puedes implementar la misma lógica y simplificarla con la función createSolanaClient de gill:

Código
import { createSolanaClient } from "gill";

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

Ahora puedes hacer solicitudes RPC sencillas mediante el objeto rpc creado con cualquiera de las bibliotecas de los ejemplos anteriores:

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

Una transacción sencilla que incluye una instrucción de memo con optimizaciones básicas (mediante instrucciones de presupuesto de cómputo) se crea en @solana/kit de la siguiente manera:

Código
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 misma lógica se puede simplificar considerablemente con gill de la siguiente manera:

Código
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,
});

Para ver una comparación más completa entre estas dos bibliotecas, consulta la documentación de gill sobre gill frente a @solana/kit.

¿Qué implica el proceso de migración de Kit a Gill?

Para cualquier aplicación que use la biblioteca @solana/kit, el proceso de migración al paquete gill es muy sencillo:

  1. Instala gill
  2. Reemplaza todas las importaciones de @solana/kit por gill
  3. Desinstala @solana/kit

Como gill también incluye directamente los clientes más comunes de la Solana Program Library (SPL), puedes reemplazar las importaciones de esos paquetes con gill. Gill incluye los siguientes clientes SPL, accesibles directamente desde la ruta de importación gill/programs:

  • @solana-program/system
  • @solana-program/memo
  • @solana-program/compute-budget
  • @solana-program/address-lookup-table
  • @solana-program/token-2022 (consulta la nota siguiente sobre los clientes de programas de tokens)

Para usar el paquete único gill con estos clientes de programas SPL:

  1. Reemplaza las importaciones de los paquetes @solana-program/* mencionados anteriormente por gill/programs
  2. Desinstala los paquetes @solana-program/* mencionados anteriormente.

Después de actualizar las importaciones, tu aplicación estará lista de inmediato para comenzar a usar la biblioteca «gill core». Ahora puedes refactorizar fácilmente el extenso código repetitivo de Kit, como la creación de conexiones con la blockchain y transacciones, mediante cualquiera de las abstracciones disponibles en gill.

¿Qué componentes incluye Gill?

La biblioteca gill se puede dividir en varios componentes clave:

  • Funcionalidad principal (también conocida como «gill core»)
  • Funciones auxiliares específicas para entornos de ejecución de servidores (como NodeJS y Bun)
  • Clientes de programas
  • Constructores de transacciones
  • Modo de depuración

Funciones auxiliares de Node.js

El paquete gill incluye varias utilidades específicas para entornos de ejecución de servidores JavaScript. Aunque forman parte del paquete gill, tienen una ruta de importación independiente para mejorar el tree-shaking. Estas utilidades permiten, entre otras cosas, cargar y guardar fácilmente pares de claves en archivos o variables ENV.

Código
import { ... } from "gill/node"

Para cargar fácilmente un archivo de par de claves desde tu sistema de archivos local, como el par de claves de Solana CLI:

Código
import { loadKeypairSignerFromFile } from "gill/node";

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

También puedes cargar un par de claves codificado en base58 desde una variable ENV:

Código
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);

Constructores de transacciones

Para simplificar la creación de transacciones comunes que suelen interactuar con varios programas a la vez, gill incluye varios «constructores de transacciones» que ayudan a ensamblar fácilmente transacciones listas para firmar.

Como cada constructor de transacciones se limita a una sola tarea, puede abstraer fácilmente diversas partes del código repetitivo y, al mismo tiempo, ayudar a crear una transacción optimizada.

Estos son algunos de los constructores de transacciones que ofrece gill:

  • buildCreateTokenTransaction - crea un token con metadatos
  • buildMintTokensTransaction - acuña tokens en una billetera de destino
  • buildTransferTokensTransaction - transfiere tokens a una billetera de destino

Cada constructor de transacciones incluye un «constructor de instrucciones» para aumentar la flexibilidad de los desarrolladores al usar estas abstracciones de gill.

Modo de depuración

En gill, puedes habilitar el «modo de depuración» para registrar automáticamente información adicional que te ayudará a solucionar problemas con tus transacciones.

El modo de depuración está deshabilitado de forma predeterminada para reducir los registros adicionales de tu aplicación. Gracias a su controlador flexible, puedes habilitarlo desde los lugares más comunes donde se ejecuta tu código, incluidos el propio código, los backends de NodeJS, las funciones sin servidor e incluso la consola del navegador web.

Para habilitar el modo de depuración, configura cualquiera de las siguientes opciones como true o 1:

  • process.env.GILL_DEBUG
  • global.__GILL_DEBUG__
  • window.__GILL_DEBUG__ (por ejemplo, en la consola de tu navegador web)
  • o configura manualmente cualquier nivel de registro de depuración (consulta la documentación)

Consulta la documentación del modo de depuración de gill para obtener más información.

Herramientas complementarias para desarrollar con Gill

@gillsdk/react

Dentro de la biblioteca gill hay otro paquete, @gillsdk/react, que reúne hooks de React diseñados para mejorar radicalmente la experiencia de desarrollo de aplicaciones frontend basadas en React. También está construido sobre TanStack Query, una popular biblioteca de reactividad, por lo que se puede usar con mayor facilidad en aplicaciones existentes.

El paquete @gillsdk/react aún se encuentra en una etapa inicial y está en desarrollo activo. Actualmente proporciona varios hooks útiles de React para aplicaciones de Solana:

  • useAccount - obtiene la información de la cuenta de una dirección
  • useBalance - obtiene el saldo de una cuenta (en lamports)
  • useLatestBlockhash - obtiene el blockhash más reciente
  • useSignatureStatuses - obtiene los estados de las firmas
  • useProgramAccounts - obtiene las cuentas de un programa (GPA)
  • useTokenMint - obtiene la cuenta Mint decodificada de un token
  • useTokenAccount - obtiene la cuenta de token para un Mint y propietario determinados (o ATA)

Codama

Codama es una herramienta que permite a los desarrolladores usar el IDL de un programa de Solana para generar bibliotecas cliente (por ejemplo, JavaScript o Rust) que otras aplicaciones pueden utilizar. Codama reduce toda la complejidad de crear instrucciones de Solana a un IDL, un archivo de configuración y la importación de una función.

Gill y Codama se integran fácilmente mediante la función createCodamaConfig de gill. El responsable de mantenimiento de gill también trabaja activamente para mejorar aún más la integración gill<>Codama, incluida la compatibilidad directa con Codama CLI.

De forma predeterminada, los clientes de programas TypeScript generados por Codama usarán @solana/kit, pero esto se puede cambiar fácilmente en el archivo de configuración de Codama de tu programa de Solana. La función createCodamaConfig facilita la actualización de tu configuración de Codama para usar gill.

El siguiente es un ejemplo de un archivo codama.js que generará un cliente TypeScript para un programa de Solana que usa gill:

Código
import { createCodamaConfig } from "gill";

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

Puedes encontrar una guía completa en la documentación de gill para generar clientes de programas de Solana con Codama.

El futuro de Gill

El futuro de la biblioteca gill es prometedor y todavía queda mucho por hacer. El sitio oficial de documentación de gill acaba de lanzarse y la biblioteca se acerca a las 20 000 descargas mensuales.

Puedes obtener más información sobre los elementos actuales de la hoja de ruta de gill en la página de GitHub Projects. Por ahora, la lista incluye:

  • Compatibilidad directa con la especificación de Solana Pay
  • Integración nativa de la especificación de la API Digital Assets Standard (DAS)
  • Compatibilidad mejorada con tokens basados en extensiones de tokens
  • Compatibilidad mejorada con tablas de búsqueda de direcciones
  • Documentación más completa

El paquete @gillsdk/react, incluido en la biblioteca gill, aún se encuentra en una etapa inicial y cuenta con nueve hooks diferentes de React. Continúa desarrollándose para que los desarrolladores puedan agregar reactividad fácilmente a sus aplicaciones basadas en React, incluida la compatibilidad con todos los métodos RPC de Solana comunes y una integración más estrecha con wallet-ui.

Dato curioso: hay planes para integrar gill directamente en el framework Anchor, lo que permitirá a los desarrolladores aprovechar con mayor facilidad las optimizaciones y mejoras en la experiencia de desarrollo de gill dentro de sus aplicaciones. Quién sabe, quizá gill se convierta en la opción predeterminada de Anchor v2. :shhh:

Cómo contribuir a Gill

La biblioteca gill es de código abierto (licencia MIT) y las contribuciones son bienvenidas. Si te interesa contribuir a la biblioteca, revisa las incidencias abiertas y considera resolver una.

Si quieres recomendar una nueva función o mejora para la biblioteca, abre primero una incidencia para iniciar una conversación con los responsables de mantenimiento antes de trabajar en el código de un PR.

Recursos adicionales

Encuentra más información y recursos sobre gill en los siguientes enlaces:

Suscríbete a Helius

Mantente al día con las novedades del desarrollo en Solana y recibe actualizaciones cuando publiquemos