本文介绍了Solana编程中的接口定义语言(IDL)的重要性和生成方法。IDL用于定义Solana程序的公共接口,便于dApps与程序交互,并通过Anchor框架自动生成,简化客户端代码的开发。
在 Solana 编程中,接口定义语言(IDL)用于指定程序的公共接口。它定义了 Solana 程序的账户结构、指令和错误代码。IDL 是 .json
文件,用于生成客户端代码,使用户能够轻松地与 Solana 程序进行交互。IDL 并不是 Solana 创造的新概念——事实上它们已经在许多应用和编程语言中被使用。自 Anchor 在 Solana 中引入 IDL 以来,它们已成为构建和与 Solana 程序交互的重要组成部分。尽管你可以在没有 IDL 的情况下与 Solana 程序交互,但它们使这一过程变得更加简单。
生成 Solana 程序 IDL 的最优方式是使用 Anchor。Anchor 是一个框架,可以加速在 Solana 上构建安全的 Rust 程序,并通过自动生成 IDL,使开发人员能够快速构建程序并通过前端与其通信。在本指南中,你将了解 IDL 的用途以及如何使用 Anchor 生成它们。
IDL 之所以重要,是因为它们为 dApp 提供了一种标准化的方式与 Solana 程序进行通信。通过定义程序的公共接口,IDL 确保其他程序和服务能够以一致的方式与程序交互。例如,Solana Explorer 能够使用 IDL 根据程序 ID 解析交易指令数据。以下是 Solana Explorer 上解析交易指令的示例:
以 Marinade Finance 为例,这是一种流行的流动质押代币,它的公共 IDL 使得 Solana Explorer 能够在加载时解析交易,向用户提供交易的相关信息。以下是 Solana Explorer 显示公共 IDL 的示例:
IDL 还简化了客户端代码的生成,使得为 Solana 程序部署前端变得更加容易。以下是两个 Hello World 前端的示例,它们创建了一个可用于说 "hello" 的问候账户——一个使用原生 Solana,另一个使用 Anchor:
const GREETING_SEED = 'hello'
const greetedPubkey = await PublicKey.createWithSeed(
payer.publicKey,
GREETING_SEED,
programId
)
// 检查问候账户是否已经创建
const greetedAccount = await connection.getAccountInfo(greetedPubkey)
if (greetedAccount === null) {
console.log('创建账户', greetedPubkey.toBase58(), '用于问候')
const lamports = await connection.getMinimumBalanceForRentExemption(
GREETING_SIZE
)
const transaction = new Transaction().add(
SystemProgram.createAccountWithSeed({
fromPubkey: payer.publicKey,
basePubkey: payer.publicKey,
seed: GREETING_SEED,
newAccountPubkey: greetedPubkey,
lamports,
space: GREETING_SIZE,
programId,
})
)
await sendAndConfirmTransaction(connection, transaction, [payer])
}
// ...
export async function sayHello(): Promise<void> {
console.log('向', greetedPubkey.toBase58(), '说 hello')
const instruction = new TransactionInstruction({
keys: [{ pubkey: greetedPubkey, isSigner: false, isWritable: true }],
programId,
data: Buffer.alloc(0), // 所有指令都是问候
})
await sendAndConfirmTransaction(
connection,
new Transaction().add(instruction),
[payer]
)
}
// 来源: https://github.com/solana-labs/example-helloworld/blob/master/src/client/hello_world.ts
const anchor = require('@project-serum/anchor')
async function greet(message: string) {
anchor.setProvider(anchor.Provider.local())
// 这里我们加载 HelloAnchor 示例的 IDL
const program = anchor.workspace.HelloAnchor
let greetKey = Keypair.generate()
await program.methods
.initialize(message)
.accounts({
newAccount: greetKey.publicKey,
signer: wallet.publicKey,
systemProgram: web3.SystemProgram.programId,
})
.signers([wallet, greetKey])
.rpc()
}
greet('Hello World')
是不是简洁多了?Anchor 使用 IDL 将这一过程抽象化为更易读且更易于部署的形式。此外,它还通过让你更容易与其他程序接口来提高可组合性。
由于 IDL 在 Anchor 编程中非常重要,因此在构建程序时会自动生成 IDL。在任何 Anchor 项目目录中,在终端中输入以下命令:
anchor build --idl <IDL_OUTPUT_DIRECTORY>
初次接触 Anchor?
默认情况下,idl.json
会保存到你的 ./target/idl
文件夹中:
Anchor 还使得在链上发布 IDL 变得容易。为此,你只需在终端中输入以下命令:
anchor idl init --filepath <FILEPATH> <PROGRAM_ID> --provider.cluster <CLUSTER> --provider.wallet <WALLET>
确保你使用的钱包是程序的授权者,并且有 SOL 用于链上交易!加载你的 IDL 后,你应该能够在 Solana Explorer 上看到你的 IDL:https://explorer.solana.com/address/YOUR_PROGRAM_ID/anchor-program。
anchor idl
命令还有其他一些有用的工具,允许你获取、更新或冻结 IDL。要了解这些命令的信息,你可以在终端中输入以下命令:
anchor idl -h
将生成的 TypeScript 模块导入到你的前端应用程序中,并使用它与你的程序进行交互。该模块提供了与 IDL 中定义的函数对应的函数。
import { Program, AnchorProvider, setProvider } from '@project-serum/anchor'
import { Connection, KeyPair } from '@solana/web3.js'
import { PROGRAM_ID, IDL } from './your-program-dir'
// 其中 IDL 是由 anchor build 创建的 .json 文件
// PROGRAM_ID 是你的链上程序 ID
export const yourFunction = async () => {
const wallet = KeyPair.generate()
const connection = new Connection(QN_ENDPOINT)
const provider = new AnchorProvider(connection, wallet, {})
setProvider(provider)
const program = new Program(IDL, PROGRAM_ID)
// ... 你的代码
// 例如: await program.methods.yourMethod(YOUR_PARAMETERS).accounts({YOUR_ACCOUNTS}).rpc();
}
由于你的程序指令和账户都嵌入在 IDL 中(现在存储在 program
变量中),你的代码编辑器应该能够通过 program.methods...
自动检测你可调用的程序方法。你的类型检查应该确保你将所有必要的账户传递到指令中。如果你想了解如何构建一个小型 anchor 应用和简单客户端代码的具体演示,请查看我们的指南:如何使用程序派生地址。
IDL 是将你的 dApp 连接到许多程序的绝佳方式,并可以帮助你的程序获得许多 dApp 的曝光。
如果你遇到问题、有疑问或只是想谈论你在构建的内容,请在 Discord 或 Twitter 上联系我们!
如果你对本指南有任何反馈,请告诉我们。我们非常乐意听取你的意见。
https://explorer.solana.com/address/<PROGRAM-ID>/anchor-program
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!