LogoAnchor 中文文档

程序 IDL 文件

了解 Anchor 中的接口描述语言 (IDL) 文件,它的 目的、优点,以及如何简化程序与客户端的交互。

Anchor 程序的接口描述语言 (IDL) 文件提供了一个 标准化的 JSON 文件,用于描述程序的指令和账户。此 文件简化了将您的链上程序与客户端应用程序集成的过程。

IDL 的主要优点:

  • 标准化:提供了一致的格式来描述程序的 指令和账户
  • 客户端生成:用于生成与程序交互的客户端代码

anchor build 命令生成位于 /target/idl/<program-name>.json 的 IDL 文件。

以下部分的代码片段突出了程序、IDL 和客户端之间的关系。

程序指令

IDL 中的 instructions 数组直接对应于您程序中定义的指令。它指定了每个指令所需的账户和参数。

下面的程序包含一个 initialize 指令,指定了其所需的账户 和参数。

lib.rs
use anchor_lang::prelude::*;   declare_id!("BYFW1vhC1ohxwRbYoLbAWs86STa25i9sD5uEusVjTYNd");   #[program] mod hello_anchor {  use super::*;     pub fn initialize(ctx: Context<Initialize>, data: u64) -> Result<()> {  ctx.accounts.new_account.data = data;  msg!("Changed data to: {}!", data);  Ok(())  } }    #[derive(Accounts)] pub struct Initialize<'info> {  #[account(init, payer = signer, space = 8 + 8)]  pub new_account: Account<'info, NewAccount>,  #[account(mut)]  pub signer: Signer<'info>,  pub system_program: Program<'info, System>, }   #[account] pub struct NewAccount {  data: u64, }

程序账户

IDL 中的 accounts 数组对应于程序中用 #[account] 属性标注的结构体。这些结构体定义了程序创建的账户中存储的数据。

下面的程序定义了一个 NewAccount 结构体,其中包含一个类型为 u64data 字段。

lib.rs
use anchor_lang::prelude::*;   declare_id!("BYFW1vhC1ohxwRbYoLbAWs86STa25i9sD5uEusVjTYNd");   #[program] mod hello_anchor {  use super::*;  pub fn initialize(ctx: Context<Initialize>, data: u64) -> Result<()> {  ctx.accounts.new_account.data = data;  msg!("Changed data to: {}!", data);  Ok(())  } }   #[derive(Accounts)] pub struct Initialize<'info> {  #[account(init, payer = signer, space = 8 + 8)]  pub new_account: Account<'info, NewAccount>,  #[account(mut)]  pub signer: Signer<'info>,  pub system_program: Program<'info, System>, }     #[account] pub struct NewAccount {  data: u64, }

标识符

Anchor 为程序中的每个指令和账户类型分配一个唯一的 8 字节标识符。这些标识符作为标识符,帮助区分不同的指令或账户类型。

标识符是通过将指令或账户名称与前缀结合后,计算其 Sha256 哈希的前 8 个字节生成的。从 Anchor v0.30 开始,这些标识符被包含在 IDL 文件中。

请注意,在使用 Anchor 时,您通常不需要直接处理 这些标识符。本节主要提供关于标识符如何生成和使用的背景信息。

指令标识符由程序用于确定调用时要执行的特定 指令。

当调用一个 Anchor 程序指令时,标识符作为指令数据的前 8 个字节包括在内。 这是通过 Anchor 客户端自动完成的。

IDL
 "instructions": [  {  "name": "initialize",    "discriminator": [175, 175, 109, 31, 13, 152, 155, 237],  ...  }  ]

指令的标识符是对前缀 global 和指令名称的 Sha256 哈希的前 8 个字节。

例如:

sha256("global:initialize")

十六进制输出:

af af 6d 1f 0d 98 9b ed d4 6a 95 07 32 81 ad c2 1b b5 e0 e1 d7 73 b2 fb bd 7a b5 04 cd d4 aa 30

前 8 个字节用于作为指令的标识符。

af = 175 af = 175 6d = 109 1f = 31 0d = 13 98 = 152 9b = 155 ed = 237

您可以在 Anchor 代码库中找到标识符生成的实现 在这里, 该实现被 在这里使用

On this page

在GitHub上编辑