LogoAnchor 中文文档

账户约束

Anchor 账户约束示例

Anchor 账户的极简参考示例 约束.

查看账户约束的 源代码 以获取实现细节。

常规约束

#[account(signer)]

描述:检查给定账户是否签署了交易。如果只需要对账户使用此约束,请考虑使用 Signer 类型。
示例:Github | Solpg

attribute
#[account(signer)]
#[account(signer @ <custom_error>)]

#[account(mut)]

描述:检查给定账户是否可变。使 Anchor 持久化任何状态更改。
示例:Github | Solpg

attribute
#[account(mut)]
#[account(mut @ <custom_error>)]

#[account(init)]

描述:通过向系统程序进行 CPI 创建账户并初始化它(设置其账户判别器)。
示例:Github | Solpg

attribute
#[account(
    init,
    payer = <target_account>,
    space = <num_bytes>
)]

#[account(init_if_needed)]

描述:与 init 相同,但仅在账户尚不存在时运行。需要 init-if-needed cargo 特性。
示例:Github | Solpg

attribute
#[account(
    init_if_needed,
    payer = <target_account>
)]
 
#[account(
    init_if_needed,
    payer = <target_account>,
    space = <num_bytes>
)]

#[account(seeds, bump)]

描述:检查给定账户是否是从当前执行程序、种子和(如果提供)bump 派生的 PDA。
示例:Github | Solpg

attribute
#[account(
    seeds = <seeds>,
    bump
)]
 
#[account(
    seeds = <seeds>,
    bump,
    seeds::program = <expr>
)]
 
#[account(
    seeds = <seeds>,
    bump = <expr>
)]
 
#[account(
    seeds = <seeds>,
    bump = <expr>,
    seeds::program = <expr>
)]

#[account(has_one = target)]

描述:检查账户上的目标字段是否与 Accounts 结构体中目标字段的键匹配。
示例:Github | Solpg

attribute
#[account(
    has_one = <target_account>
)]
 
#[account(
    has_one = <target_account> @ <custom_error>
)]

#[account(address = expr)]

描述:检查账户密钥是否与公钥匹配。
示例:[Github](https://github.com/solana-developers/anchor-examples/t极简参考示例[极简参考示例](https://github.com/solana-developers/anchor-examples/tree/main/account-constraints/address) | Solpg

attribute
#[account(address = <expr>)]
#[account(address = <expr> @ <custom_error>)]

#[account(owner = expr)]

描述:检查账户所有者是否匹配 expr。
示例:Github | Solpg

attribute
#[account(owner = <expr>)]
#[account(owner =极简参考示例极简参考示例极简参考示例<expr> @ <custom_error>)]

#[account(executable)]

描述:检查账户是否可执行(即账户是一个程序)。
示例:Github | Solpg

attribute
#[account(executable)]

#[account(zero)]

描述:检查账户判别器是否为零。用于大于 10 Kibibyte 的账户。
示例:Github | Solpg

attribute
#[account(zero)]

#[account(close = target)]

描述:通过将 lamports 发送到目标并重置数据来关闭账户。
示例:Github | Solpg

attribute
#[account(close = <target_account>)]

#[account(constraint = expr)]

描述:自定义约束,检查给定表达式是否评估为 true。
示例:Github | Solpg

attribute
#[account(constraint = <expr>)]
#[account(
    constraint = <expr> @ <custom_error>
)]

#[account(realloc)]

描述:用于在指令开始时重新分配程序账户空间。
示例:Github | Solpg

attribute
#[account(
    realloc = <space>,
    realloc::payer = <target>,
    realloc::zero = <bool>
)]

SPL 约束

#[account(token::*)]

描述:使用指定的 mint 和 authority 创建或验证 token 账户。
示例:Github | Solpg

attribute
#[account(
    token::mint = <target_account>,
    token::authority = <target_account>
)]
 
#[account(
    token::mint = <target_account>,
    token::authority = <target_account>,
    token::token_program = <target_account>
)]

#[account(mint::*)]

描述:使用指定参数创建或验证 mint 账户。
示例:Github | Solpg

attribute
#[account(
    mint::authority = <target_account>,
    mint::decimals = <expr>
)]
 
#[account(
    mint::authority = <target_account>,
    mint::decimals = <expr>,
    mint::freeze_authority = <target_account>
)]

#[account(associated_token::*)]

描述:创建或验证关联的 token 账户。
示例:Github | Solpg

attribute
#[account(
    associated_token::mint = <target_account>,
    associated_token::authority = <target_account>
)]
 
#[account(
    associated_token::mint = <target_account>,
    associated_token::authority = <target_account>,
    associated_token::token_program = <target_account>
)]

#[account(*::token_program = expr)]

描述:可以可选地覆盖 token_program。
示例:Github | Solpg

attribute
#[account(*::token_program = <target_account>)]

指令属性

#[instruction(...)]

描述:你可以使用 #[instruction(..)] 属性访问指令的参数。你极简参考示例极简参考示例极简参考示例必须按照与指令处理程序相同的顺序列出它们,但可以省略你需要的最后一个参数之后的所有参数。跳过参数将导致错误。

示例: Github | Solpg

snippet

#[program]
pub mod example {
    use super::*;
 
    pub fn initialize(ctx: Context<Initialize>, input: String) -> Result<()> {
        // --snip--
    }
}
 
#[derive(Accounts)]

#[instruction(input: String)]
pub struct Initialize<'info> {
    #[account(
        init,
        payer = signer,
        space = 8 + 4 + input.len(),
    )]
    pub new_account: Account<'info, DataAccount>,
    // --snip--
}

有效用法:

snippet


#[program]
pub mod example {
    use super极简参考示例极简参考示例极简参考示例::*;
 
    pub fn initialize(ctx: Context<Initialize>, input_one: String, input_two: String) -> Result<()> {
        // --snip--
    }
}
 
#[derive(Accounts)]

#[instruction(input_one: String, input_two: String)]
pub struct Initialize<'info> {
    // --snip--
}
snippet

#[program]
pub mod example {
    use super::*;
 
    pub fn initialize(ctx: Context<Initialize>, input_one: String, input_two: String) -> Result<()> {
        // --snip--
    }
}
 
#[derive(Accounts)]

#[instruction(input_one: String)]
pub struct Initialize<'info> {
    // --snip--
}

无效用法,将导致错误:

snippet

#[program]
pub mod example {
    use super::*;
 
    pub fn initialize(ctx: Context<Initialize>, input_one: String,输入input_two: String) -> Result<()> {
        // --snip--
    }
}
 
#[derive(Accounts)]

#[instruction(input_two: String)]
pub struct Initialize<'info> {
    // --snip--
}