当我尝试更改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
);
型
谢谢你帮忙
3条答案
按热度按时间x759pob21#
你的种子实际上是:
字符串
代替签名人?
我想知道它们是否被错误地传递了,所以
escrow_signer
实际上是escrow_account
,这不是对这条指令进行签名,这可以解释错误。knsnq2tg2#
1.确保种子正确
1.确保相关帐户被标记为可变(这一点经常被忽略)
de90aj5v3#
我在这里补充另一个可能的原因,这个问题:
想象一下,您正在使用PDA帐户通过CPI从您的帐户内部调用另一个程序,并且您使用签名者种子来实现这一点。
如果你调用
solana_program::program::invoke
而不是solana_program::program::invoke_signed
,你可能也会在这种情况下结束。