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_signed
或 invoke
的内部指令。
在您的情况下,这意味着如果您需要大于 10240 字节的 GameState
,您将无法使用 PDA。
我相信您正在尝试创建一个限制为 10KB 的 PDA,而不是一个限制为 10MB 的普通帐户
我正在将 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_signed
或 invoke
的内部指令。
在您的情况下,这意味着如果您需要大于 10240 字节的 GameState
,您将无法使用 PDA。
我相信您正在尝试创建一个限制为 10KB 的 PDA,而不是一个限制为 10MB 的普通帐户