如何使用 Gill 构建 Solana 应用

  • Helius
  • 发布于 1天前
  • 阅读 96

Gill是一个基于JavaScript/TypeScript的Solana开发工具库,旨在提升JavaScript应用开发者的体验。它包含轻量级的抽象以加速开发,并提供底层原语以支持灵活的控制。Gill简化了与Solana的常见交互,减少了样板代码,同时允许开发者在需要时深入底层进行更细粒度的控制。

Gill 是最新的基于 JavaScript/TypeScript 的 Solana 开发者工具库。Gill 最初由 Decal 的联合创始人 Nick Frostbutter 在 Solana 基金会的开发者关系团队工作期间开发,旨在显著提升基于 JavaScript 的应用程序的开发者体验。

Gill 既包含轻量级的、有主张的抽象,以加速开发者生产力,也包含较低级别的原语,为开发者提供选择自己方法的灵活性。

登链社区翻译 gill 文档: https://learnblockchain.cn/docs/gill/docs/

轻量级的抽象减少了很多复杂度,以及执行与 Solana 的常见交互所需的样板代码。而较低级别的原语在开发者需要(或想要)更精细地控制其应用程序的逻辑时,提供了“逃生通道”。

本文将介绍“gill 库”的基础知识、库中包含的内容、如何开始使用 gill,以及 @solana/kit(以前称为“web3.js v2”)之间的区别。

什么是 Gill?

Gill 是一个现代 TypeScript 库,用于在任何基于 JavaScript 的环境中开发 Solana 应用程序,范围从浏览器到服务器再到移动设备。

gill 库 适用于所有经验水平的 Solana 开发者,从初学者到高级开发者。通过在同一个包中发布更高级别的抽象和低级别的原语,开发者可以根据需要轻松地利用更高级的功能,或者在抽象不支持这些功能时使用它们。

最好的部分是什么?

Gill 是完全可 tree-shaking 的,因此你的打包器将自动删除代码库中未使用的任何原语或抽象。

Gill 的主要目标是通过简化常见的 Solana 开发任务并删除样板代码来改善开发者体验,同时不牺牲在开发者想要或需要时获得更低级别的能力。开发者不应仅限于高级别的抽象或低级别的原语。开发者应该能够轻松地选择适合他们的任何一个。

安装 Gill

Gill 可以安装到任何基于 JavaScript 或 TypeScript 的项目中,包括 NodeJS/Bun、浏览器、React Native 或几乎任何其他 JavaScript 环境。

npm install gill

gill 库具有强大的 TypeScript 支持,并且应该可以在大多数应用程序中开箱即用。但是,你的特定项目配置可能需要进行调整才能更好地与 gill 一起使用。有关 gill 中的 TypeScript 支持 的更多信息,请参阅文档。

Gill vs. @solana/kit

gill 库直接构建在 @solana/kit 之上,后者是由 Anza 开发的新的低级别 JavaScript 原语,作为旧 @solana/web3.js 的更高性能替代品。

虽然 Kit 仅提供这些低级别的原语,但开发者被迫进入手动构建所有内容的单一体验,从而导致应用程序膨胀并包含冗长的样板代码。

Gill 来了。

Gill 提供与 Kit 相同的低级别原语和轻量级的、有主张的抽象,以简化常见任务,所有这些都来自一个兼容的接口。通过使用 gill 全面简化,开发者可以将更多时间集中在其应用程序的业务逻辑上,而将更少的时间集中在冗长的样板代码上。

注意:

@solana/kit 以前称为“web3.js v2”,因为它最初作为 @solana/web3.js 的版本 2.x 发布系列发布。Anza 工程师指出,这使得新技术的升级路径变得复杂和混乱,因此他们决定以 @solana/kit 的新包名称发布。

Gill vs. Kit 代码示例

以下代码片段演示了如何在保持相同功能(并且可能添加更多功能)的同时简化代码。几乎所有应用程序都需要执行两项任务:建立与区块链的连接和创建交易。

使用 @solana/kit 创建与区块链的连接如下所示:

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

可以使用 gill 的 createSolanaClient 函数完成并简化相同的逻辑:

import { createSolanaClient } from "gill";

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

现在,你可以使用上面示例中使用任一库创建的 rpc 对象发出简单的 RPC 请求:

// 从你的 RPC 提供程序获取最新的 blockhash
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();

@solana/kit 中创建一个包含带有基本优化(使用计算预算指令)的备忘录指令的简单交易,如下所示:

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,
    ),
);
注意:

上面基于 Kit 的示例需要手动安装两个额外的包:@solana-program/compute-budget@solana-program/memo

使用 gill 可以大大简化相同的逻辑,如下所示:

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

有关这两个库之间更全面的比较,请查看 gill 文档中的 gill vs @solana/kit

Kit 到 Gill 的迁移过程涉及什么?

对于任何使用 @solana/kit 库的应用程序,迁移到使用 gill 包的过程非常简单:

  1. 安装 gill
  2. 将所有 @solana/kit 导入替换为 gill
  3. 卸载 @solana/kit

由于 gill 还直接包含最常见的 Solana Program Library (SPL) 客户端,因此你也可以将这些包导入替换为 gill。Gill 直接包含以下可从 gill/programs 导入路径访问的 SPL 客户端:

  • @solana-program/system
  • @solana-program/memo
  • @solana-program/compute-budget
  • @solana-program/address-lookup-table
  • @solana-program/token-2022(请参阅下面有关Token程序客户端的说明)

要将单个 gill 包用于这些 SPL 程序客户端,请执行以下操作:

  1. 将上面列出的 @solana-program/* 包导入替换为 gill/programs
  2. 卸载上面列出的 @solana-program/* 包。
注意:

虽然不包含 @solana-program/token 客户端(旧版Token程序),但包含 @solana-program/token-2022 客户端(Token扩展程序,也称为 Token22),它与旧版Token程序客户端完全向后兼容。要利用旧版Token指令和其他功能,你必须显式使用 TOKEN_PROGRAM_ADDRESS 作为指令和程序派生地址的程序 ID。

更新导入后,你的应用程序即可立即开始使用“gill 核心”库。你现在可以使用任何可用的 gill 抽象来轻松地重构冗长的 Kit 样板代码(例如创建区块链连接和交易)。

Gill 包含哪些组件?

gill 库可以分解为几个关键组件:

  • 核心功能(又名“gill 核心”)
  • 服务器运行时特定的帮助程序(即 NodeJS 和 Bun)
  • 程序客户端
  • 交易构建器
  • 调试模式

Node.js 辅助函数

gill 包包含多个 JavaScript 服务器运行时特定的实用程序。虽然它们包含在 gill 包中,但它们具有单独的导入路径以改善 tree-shaking。这些实用程序包括轻松将密钥对加载和保存到文件或 ENV 变量的功能。

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

要轻松地从本地文件系统加载密钥对文件(例如 Solana CLI 密钥对):

import { loadKeypairSignerFromFile } from "gill/node";

// 默认文件路径:~/.config/solana/id.json
const signer = await loadKeypairSignerFromFile();
console.log("address:", signer.address);

你还可以从 ENV 变量加载 base58 编码的密钥对:

import { loadKeypairSignerFromEnvironmentBase58 } from "gill/node";

// 从存储在 `process.env[variableName]` 的 base58 密钥对加载签名者
const signer = await loadKeypairSignerFromEnvironmentBase58(variableName);
console.log("address:", signer.address);

交易构建器

为了简化通常一次与多个程序交互的常见交易的创建,gill 包含各种“交易构建器”来帮助轻松组装可签名交易以完成这些任务。

由于每个交易构建器都限定于单个任务,因此它可以轻松地抽象出各种样板代码,同时还有助于创建优化的交易。

gill 提供的一些交易构建器包括:

每个交易构建器都附带一个“指令构建器”,以提高开发者对这些 gill 抽象的灵活性。

调试模式

在 gill 中,你可以启用“调试模式”以自动记录其他信息,这些信息将有助于排除交易故障。

默认情况下禁用调试模式,以最大限度地减少来自应用程序的其他日志。凭借其灵活的控制器,你可以从代码运行的最常见位置启用调试模式,包括代码本身、NodeJS 后端、无服务器函数,甚至在 Web 浏览器控制台中。

要启用调试模式,请将以下任何一项设置为 true1

  • process.env.GILL_DEBUG
  • global.__GILL_DEBUG__
  • window.__GILL_DEBUG__(即在你的 Web 浏览器控制台中)
  • 或手动设置任何调试日志级别(请参阅文档)

查看 gill 调试模式 文档以获取更多信息。

使用 Gill 构建的补充开发者工具

gill-react

直接在 gill 库中还有另一个包,gill-react,它是 React hooks 的集合,旨在从根本上改善基于 React 的前端应用程序的开发者体验。它也建立在 TanStack Query(一个流行的响应式库)之上,因此可以更轻松地被现有应用程序利用。

gill-react 包仍处于起步阶段,并且正在积极开发中。它目前为 Solana 应用程序提供了一些有用的 React hooks:

Codama

Codama 是一种工具,允许开发者获取 Solana 程序的 IDL 并生成客户端库(例如,JavaScript、Rust),供其他应用程序使用。Codama 处理将 Solana 指令转换为 IDL、配置文件和导入函数的所有复杂性。

Gill 和 Codama 使用 gill 的 createCodamaConfig 函数轻松集成在一起。gill 维护者也在积极努力进一步改进 gill<>Codama 集成,包括在 Codama CLI 中直接支持!

默认情况下,Codama 生成的 TypeScript 程序客户端将使用 @solana/kit,但这可以在 Solana 程序的 Codama 配置文件中轻松更新。使用 createCodamaConfig 函数可以轻松升级到在 Codama 配置中使用 gill

以下是一个示例 codama.js 文件,它将生成一个使用 gill 的 Solana 程序 TypeScript 客户端:

import { createCodamaConfig } from "gill";

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

你可以在 gill 文档中找到使用 Codama 生成 Solana 程序客户端 的完整指南。

Gill 的未来

gill 库的未来是光明的,并且有很多事情要做。官方的 gill 文档 站点刚刚启动,该库的月下载量接近 20,000 次。

你可以在 GitHub Projects 页面 上找到有关当前在 gill 路线图上的内容的更多信息。目前,候选名单包括:

  • 直接支持 Solana Pay 规范
  • 本机集成数字资产标准 (DAS) API 规范
  • 改进对基于Token扩展的Token的支持
  • 改进对地址查找表的支
  • 更全面的文档

包含在 gill 库中的 gill-react 包仍处于起步阶段(具有九个不同的 React hooks)。它将继续构建,以使开发者能够轻松地将响应式添加到基于 React 的应用程序中,包括支持所有常见的 Solana RPC 方法 以及与 wallet-ui 更紧密的集成。

有趣的事实:计划将 gill 直接集成到 Anchor 框架 中,以允许开发者在其应用程序中更轻松地利用 gill 的优化和开发者体验改进。谁知道呢,也许 gill 会成为 Anchor v2 中的默认设置。:shhh:

如何为 Gill 做出贡献

gill 库是开源的(MIT 许可证),欢迎贡献者!如果你有兴趣为该库做出贡献,请查看任何未解决的问题,并考虑自己解决其中一个问题。

如果你想推荐该库的新功能或增强功能,请先打开一个问题,以便在处理 PR 的代码之前与维护者开始讨论。

附加资源

在以下链接中查找有关 gill 的更多信息和资源:

  • 原文链接: helius.dev/blog/gill...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Helius
Helius
https://www.helius.dev/