SystemProgram::CreateAccount 内部指令中的数据大小限制为 10240

SystemProgram::CreateAccount data size limited to 10240 in inner instructions

我正在将 Anchor 框架与 Solana 一起使用。

我有这个帐户策略(不知道怎么称呼它),用于创建 PDA。

#[derive(Accounts)]
#[instruction(bump: u8)]
pub struct CreateGameState<'info> {
    #[account(init, payer=user,
      space=GameState::space(),
      seeds=[],
      bump=bump)]
    pub game_account: Account<'info, GameState>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
}

impl GameState {
    fn space() -> usize {
        10240
    }
}

我注意到如果我将数字增加到 10240 以上,我会收到错误消息:“'SystemProgram::CreateAccount data size limited to 10240 in inner instructions',”

但是,我知道 Solana 中的最大帐户大小是 10MB,远远超过 10240 字节。

为什么我的帐户中不能有更多 space?

当通过 CPI 作为内部指令创建帐户时,确实存在“realloc”限制,在 https://docs.solana.com/developing/on-chain-programs/overview#input-parameter-serialization 中简要提及。这是因为运行时需要预先分配新的 space 以防创建帐户,分配太多会占用验证器的大量 RAM。

如果您想创建一个拥有全部 10MB 的帐户,您需要将其作为独立指令来执行,而不是作为程序中使用 invoke_signedinvoke 的内部指令。

在您的情况下,这意味着如果您需要大于 10240 字节的 GameState,您将无法使用 PDA。

我相信您正在尝试创建一个限制为 10KB 的 PDA,而不是一个限制为 10MB 的普通帐户