Solana程序初始化双PDA Token Account触发0x0自定义程序错误求助
我在Solana程序中尝试初始化PDA Token Account,用于存储指定Mint的代币,代码如下:
#[derive(Accounts)] pub struct StartAuction<'info> { #[account(init, seeds=[&state.positions_count.to_ne_bytes()], bump, payer = authority, space = 5000)] pub position: Account<'info, Position>, #[account(mut, seeds=[b"state"], bump)] pub state: Account<'info, State>, pub token: Account<'info, Mint>, pub token2: Account<'info, Mint>, #[account(init, payer = authority, token::mint = token, token::authority = position)] pub vault: Account<'info, TokenAccount>, // #[account(init, payer = authority, token::mint = token2, token::authority = position)] // pub token2_vault: Account<'info, TokenAccount>, #[account(mut)] pub authority: Signer<'info>, pub token_program: Program<'info, Token>, pub rent: Sysvar<'info, Rent>, pub system_program: Program<'info, System> }
当token2_vault处于注释状态时,程序运行正常;但取消注释以创建两个不同Mint的Token Account时,出现错误:Transaction simulation failed: Error processing Instruction 0: custom program error: 0x0。
我推测这是SPL的NotRentExempt错误(即“Lamport余额低于免租金阈值”),且确认authority账户拥有足够lamports,但无法理解为何单账户正常、双账户触发该错误,恳请协助排查。
排查与解决方案
检查
state账户的免租状态
错误码0x0对应SPL Token的NotRentExempt,但触发对象不一定是authority或新创建的TokenAccount。你的state账户标记为mut,如果指令逻辑中误操作减少了它的lamports,可能导致其自身不再满足免租条件。单账户交易时总开销低,未影响state余额;双账户时交易整体消耗变化,间接触发了state的余额问题。精确核算总lamports需求
SPL TokenAccount固定占用165字节,免租所需lamports可通过rent.minimum_balance(165)计算。创建两个TokenAccount的总费用为2倍该值,加上position账户5000字节的免租费用,再加上交易基础优先级费用。即便你认为authority余额足够,也建议精确计算总需求——有时前端估算的余额会忽略隐性开销,导致双账户时总支出超出预期。定位具体触发错误的账户
启动本地测试节点时添加--log参数,执行交易后查看完整日志,日志会明确指出是哪个账户因lamports不足触发NotRentExempt,这是最直接的排查方式。比如可能是token2_vault的初始化逻辑中,payer的lamports转移出现异常,或是position账户空间设置过大导致总费用超标。检查指令逻辑中的隐性lamport转移
查看StartAuction的处理函数,确认是否有代码在初始化账户之外,额外转移了authority的lamports到其他账户。单账户时总支出在余额范围内,双账户时叠加额外转移费用后,刚好超出余额上限。
内容的提问来源于stack exchange,提问作者zdev

