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上编辑