面向 Solana 开发者的全新 JavaScript 客户端。
还在为复杂的 Solana RPC 调用或交易签名焦头烂额?gill中文文档现已上线!在一个月前我们翻译了 Solana 基金会的 DevRel Nick Frostbutter 制作的Solana JavaScript gill 教程系列视频。这周我们又上新了 gill 中文文档,想要看文档进行学习的朋友们可以点击链接开始使用,当然你也可以在登链社区的文档板块找到这份文档。
gill 是一款专为 Solana 开发者设计的 JavaScript/TypeScript 客户端库,完美兼容 @solana/kit(原 web3.js v2),带来更简洁的 API 和 生活质量改进(如 createTransaction
)。其核心亮点在于支持跨平台开发,完美适配 Node.js、Web 浏览器和 React Native,随处可用。同时,Gill 提供 TypeScript 加持的类型安全还简化了 RPC 调用和交易创建。无论是 DApp 开发、智能合约测试还是链上查询,Gill 都能轻松应对。
<!--StartFragment-->
在你的项目中安装核心 gill
库:
npmpnpmyarnbun
npm install gill
来自 Kit?
来自 @solana/kit
库的所有导入都可以直接替换为 gill
,以实现完全相同的功能。此外,还可以解锁仅包含在 gill 中的其他功能,例如 createTransaction
。
在安装 gill之后,按照以下简单步骤安装并开始使用 gill
库:
从任何 RPC URL 或标准 Solana 网络别名(即 devnet
、localnet
、mainnet
等)创建 Solana rpc
和 rpcSubscriptions
客户端连接。
import { createSolanaClient } from "gill"; const { rpc, rpcSubscriptions, sendAndConfirmTransaction } = createSolanaClient({ urlOrMoniker: "mainnet",});
上面的代码片段演示了如何使用公共 Solana RPC 端点。这些非常适合快速本地测试,但它们(理所当然地)受到严格的速率限制。
当你准备好将你的应用程序发布到生产环境时,你需要使用生产就绪的 RPC 提供商。
import { createSolanaClient } from "gill"; const { rpc, rpcSubscriptions, sendAndConfirmTransaction } = createSolanaClient({ urlOrMoniker: "https://private-solana-rpc-provider.com",});
在你拥有 Solana rpc
连接之后,你可以直接通过它发出所有 JSON RPC 方法 调用。
import { createSolanaClient } from "gill"; const { rpc } = createSolanaClient({ urlOrMoniker: "devnet" }); // 获取插槽const slot = await rpc.getSlot().send(); // 获取最新的区块哈希const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
rpc
客户端要求你调用 RPC 方法上的 .send()
,以便实际将请求发送到你的 RPC 提供程序并获得响应。
你可以使用 createTransaction()
函数轻松创建交易。它接受一个对象参数,该参数已针对 Solana 交易的所有必需(和可选)部分进行了完全类型化。
创建 Solana 交易时,你需要以下几条信息:
legacy
适用于所有任务,除非你需要地址查找表(然后使用 0
)rpc
请求它即可。为了简单起见,以下示例利用 loadKeypairSignerFromFile()
从本地文件系统加载 Solana 密钥对文件。具体来说是 Solana CLI 的默认文件路径: ~/.config/solana/id.json
。这对于运行本地脚本非常有效,但不适用于用户需要使用其钱包进行签名的前端 应用。创建没有密钥的签名者 获取详细信息。
import { createTransaction, createSolanaClient } from "gill";
import { loadKeypairSignerFromFile } from "gill/node";
import { getAddMemoInstruction } from "gill/programs";
/**
* 将 Solana CLI 的默认密钥对文件 (`~/.config/solana/id.json`)
* 作为签名者加载到你的脚本中
*/
const signer = await loadKeypairSignerFromFile();
const { rpc } = createSolanaClient({ urlOrMoniker: "devnet" });
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
const transaction = createTransaction({
version: "legacy", // 如果使用地址查找表,则为 `0`
feePayer: signer,
instructions: [
getAddMemoInstruction({
memo: "gm world!",
}),
],
latestBlockhash,
// computeUnitLimit, // 可选,但强烈建议设置
// computeUnitPrice, // 可选,但强烈建议设置
});
在上面的示例中,我们从本地文件系统加载一个签名者作为我们的费用支付者和唯一签名者。该交易本身包含一条“备忘录指令”,用于在链上记录一条简单的消息。
你现在可以签署交易并将其发送到区块链以进行确认。
优化交易
你可以(并且应该)通过在交易中包含计算单元限制和计算单元价格指令来优化你的 Solana 交易。createTransaction()
函数 支持通过 computeUnitLimit
和 computeUnitPrice
参数轻松添加这些指令。
一旦你有一个准备好被签署的交易,你可以调用 signTransactionMessageWithSigners()
,以便使用所有可用的签名者执行签名操作。此函数还将断言交易已完全签署。
如果你的交易此时无法完全签署(因为你只有一些可用的和已连接的签名者),你可以调用 partiallySignTransactionMessageWithSigners()
来部分地签署交易。然后可以在以后添加剩余的签名。
import {
createTransaction,
createSolanaClient,
signTransactionMessageWithSigners,
} from "gill";
const { rpc, sendAndConfirmTransaction } = createSolanaClient({
urlOrMoniker: "devnet",
});
// ... [此处为其他业务逻辑]
const transaction = createTransaction({...});
const signedTransaction = await signTransactionMessageWithSigners(transaction);
const signature = getSignatureFromTransaction(signedTransaction);
在交易被 feePayer
签署之后,你可以使用 getSignatureFromTransaction()
函数获取其交易签名(是的,甚至在将其发送到网络之前)。
一旦你拥有一个完全签署的交易(在上面的示例中为 signedTransaction
),你现在就可以将其发送到区块链网络以进行确认。
当你的交易准备就绪并已签名后,你可以使用通过 gill 的 createSolanaClient()
初始化的 sendAndConfirmTransaction()
函数,通过你的 RPC 提供程序将其发送到网络:
import {
createTransaction,
createSolanaClient,
signTransactionMessageWithSigners,
} from "gill";
const { rpc, sendAndConfirmTransaction } = createSolanaClient({
urlOrMoniker: "devnet",
});
// ... [此处为其他业务逻辑]
const transaction = createTransaction({...});
const signedTransaction = await signTransactionMessageWithSigners(transaction);
const signature = getSignatureFromTransaction(signedTransaction);
try {
console.log("Sending transaction:", signature);
await sendAndConfirmTransaction(signedTransaction);
console.log("Transaction confirmed!");
} catch (err) {
console.error("Unable to send and confirm the transaction");
console.error(err);
}
sendAndConfirmTransaction()
函数会执行检查以确保所有必需的签名都存在(即交易已“完全签名”),然后才尝试将其发送到网络。如果 缺少任何签名,它将抛出一个错误。
恭喜!你现在了解了使用 gill
库执行创建和发送 Solana 交易的基础知识。
<!--EndFragment-->
点击链接开始阅读 gill 中文文档!
除了 gill 中文文档外,我们还翻译了许多优质的国外学习资源。登链社区翻译只为分享优质内容。欢迎大家在登链社区官网查找使用。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!