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 是一个现代 TypeScript 库,用于在任何基于 JavaScript 的环境中开发 Solana 应用程序,范围从浏览器到服务器再到移动设备。
gill 库 适用于所有经验水平的 Solana 开发者,从初学者到高级开发者。通过在同一个包中发布更高级别的抽象和低级别的原语,开发者可以根据需要轻松地利用更高级的功能,或者在抽象不支持这些功能时使用它们。
最好的部分是什么?
Gill 是完全可 tree-shaking 的,因此你的打包器将自动删除代码库中未使用的任何原语或抽象。
Gill 的主要目标是通过简化常见的 Solana 开发任务并删除样板代码来改善开发者体验,同时不牺牲在开发者想要或需要时获得更低级别的能力。开发者不应仅限于高级别的抽象或低级别的原语。开发者应该能够轻松地选择适合他们的任何一个。
Gill 可以安装到任何基于 JavaScript 或 TypeScript 的项目中,包括 NodeJS/Bun、浏览器、React Native 或几乎任何其他 JavaScript 环境。
npm install gill
gill 库具有强大的 TypeScript 支持,并且应该可以在大多数应用程序中开箱即用。但是,你的特定项目配置可能需要进行调整才能更好地与 gill 一起使用。有关 gill 中的 TypeScript 支持 的更多信息,请参阅文档。
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
的新包名称发布。
以下代码片段演示了如何在保持相同功能(并且可能添加更多功能)的同时简化代码。几乎所有应用程序都需要执行两项任务:建立与区块链的连接和创建交易。
使用 @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。
对于任何使用 @solana/kit
库的应用程序,迁移到使用 gill
包的过程非常简单:
gill
@solana/kit
导入替换为 gill
@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 程序客户端,请执行以下操作:
@solana-program/*
包导入替换为 gill/programs
@solana-program/*
包。虽然不包含 @solana-program/token
客户端(旧版Token程序),但包含 @solana-program/token-2022
客户端(Token扩展程序,也称为 Token22),它与旧版Token程序客户端完全向后兼容。要利用旧版Token指令和其他功能,你必须显式使用 TOKEN_PROGRAM_ADDRESS
作为指令和程序派生地址的程序 ID。
更新导入后,你的应用程序即可立即开始使用“gill 核心”库。你现在可以使用任何可用的 gill
抽象来轻松地重构冗长的 Kit 样板代码(例如创建区块链连接和交易)。
gill 库可以分解为几个关键组件:
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 提供的一些交易构建器包括:
buildCreateTokenTransaction
- 使用元数据创建TokenbuildMintTokensTransaction
- 将Token铸造到目标钱包buildTransferTokensTransaction
- 将Token转移到目标钱包每个交易构建器都附带一个“指令构建器”,以提高开发者对这些 gill 抽象的灵活性。
在 gill 中,你可以启用“调试模式”以自动记录其他信息,这些信息将有助于排除交易故障。
默认情况下禁用调试模式,以最大限度地减少来自应用程序的其他日志。凭借其灵活的控制器,你可以从代码运行的最常见位置启用调试模式,包括代码本身、NodeJS 后端、无服务器函数,甚至在 Web 浏览器控制台中。
要启用调试模式,请将以下任何一项设置为 true
或 1
:
process.env.GILL_DEBUG
global.__GILL_DEBUG__
window.__GILL_DEBUG__
(即在你的 Web 浏览器控制台中)查看 gill 调试模式 文档以获取更多信息。
直接在 gill 库中还有另一个包,gill-react
,它是 React hooks 的集合,旨在从根本上改善基于 React 的前端应用程序的开发者体验。它也建立在 TanStack Query(一个流行的响应式库)之上,因此可以更轻松地被现有应用程序利用。
gill-react
包仍处于起步阶段,并且正在积极开发中。它目前为 Solana 应用程序提供了一些有用的 React hooks:
useAccount
- 获取地址的帐户信息useBalance
- 获取帐户余额(以 lamports 为单位)useLatestBlockhash
- 获取最新的 blockhashuseSignatureStatuses
- 获取签名状态useProgramAccounts
- 获取程序帐户 (GPA)useTokenMint
- 获取解码Token的 Mint 帐户useTokenAccount
- 获取给定 Mint 和所有者(或 ATA)的Token帐户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 文档 站点刚刚启动,该库的月下载量接近 20,000 次。
你可以在 GitHub Projects 页面 上找到有关当前在 gill 路线图上的内容的更多信息。目前,候选名单包括:
包含在 gill 库中的 gill-react
包仍处于起步阶段(具有九个不同的 React hooks)。它将继续构建,以使开发者能够轻松地将响应式添加到基于 React 的应用程序中,包括支持所有常见的 Solana RPC 方法 以及与 wallet-ui
更紧密的集成。
有趣的事实:计划将 gill 直接集成到 Anchor 框架 中,以允许开发者在其应用程序中更轻松地利用 gill 的优化和开发者体验改进。谁知道呢,也许 gill 会成为 Anchor v2 中的默认设置。:shhh:
gill 库是开源的(MIT 许可证),欢迎贡献者!如果你有兴趣为该库做出贡献,请查看任何未解决的问题,并考虑自己解决其中一个问题。
如果你想推荐该库的新功能或增强功能,请先打开一个问题,以便在处理 PR 的代码之前与维护者开始讨论。
在以下链接中查找有关 gill 的更多信息和资源:
gill
包
- 原文链接: helius.dev/blog/gill...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!