rust 由于权限提升,更改PDA拥有的令牌帐户权限失败

xmq68pz9  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(150)

当我尝试更改SPL的授权时,我得到了一个特权升级错误(Hw5dRzdcUNHahscRYr1AtsS3t6KXoxyHiGaeShjF7Wq3's signer privilege escalated)。Hw5dRzdcUNHahscRYr1AtsS3t6KXoxyHiGaeShjF7Wq3是下面代码中的escape_signer的地址。
我可以确认SPL令牌帐户由PDA拥有,因为我在另一笔交易中更改了其权限。

token::set_authority(
            ctx.accounts.into(),
            AuthorityType::AccountOwner,
            Some(ctx.accounts.escrow_signer.key()),
        )?;

个字符
以下是我创建PDA地址的方法:

const [_escrowSigner, _nonce] = await anchor.web3.PublicKey.findProgramAddress(
            [escrowAccount.publicKey.toBuffer()],
            program.programId
        );


谢谢你帮忙

x759pob2

x759pob21#

你的种子实际上是:

let seeds = &[
    ctx.accounts.escrow_account.key.as_ref(),
    &[ctx.accounts.escrow_account.nonce],
];

字符串
代替签名人?
我想知道它们是否被错误地传递了,所以escrow_signer实际上是escrow_account,这不是对这条指令进行签名,这可以解释错误。

knsnq2tg

knsnq2tg2#

1.确保种子正确
1.确保相关帐户被标记为可变(这一点经常被忽略)

de90aj5v

de90aj5v3#

我在这里补充另一个可能的原因,这个问题:
想象一下,您正在使用PDA帐户通过CPI从您的帐户内部调用另一个程序,并且您使用签名者种子来实现这一点。
如果你调用solana_program::program::invoke而不是solana_program::program::invoke_signed,你可能也会在这种情况下结束。

相关问题