createRevokeCollectionAuthorityInstruction报Derived key invalid错误
问题背景
构建Solana链上撤销NFT集合权限交易时,触发*Derived key invalid(派生密钥无效)*报错,初始实现代码如下:
const metadataPda = findMetadataPda(mintPk); // findMetadataPda() 从'@metaplex-foundation/js'库导入 const revokeAccount = { collectionAuthorityRecord: collectionPk, // 从solana浏览器查询metadata对象中`collection.key`字段获取 delegateAuthority: authorityKey, // 创建NFT的钱包公钥 metadata: metadataPda, // 上方声明的metadata PDA变量 revokeAuthority: authorityKey, // 创建NFT的钱包公钥 mint: mintPk, // NFT对应的Mint公钥 } transaction.add( createRevokeCollectionAuthorityInstruction(revokeAccount) );
错误原因
当前参数配置存在核心错误,直接导致派生密钥校验失败:
collectionAuthorityRecord字段传值完全错误:你传入的是集合NFT的Mint地址,但该字段要求传入集合授权记录PDA,这是Metaplex元数据程序通过固定规则派生的程序派生地址,不是链上存储的普通公钥。链上程序在处理指令时会校验该地址的派生种子,传入普通Mint地址必然触发地址不匹配的派生无效报错。- 其余字段传值逻辑符合要求:
metadata、mint、delegateAuthority(当授权对象确实为创建NFT的钱包时)、revokeAuthority(当撤销发起方为授权对象本身或集合更新权限持有者时)的传值规则没有问题。
修复方案
- 导入集合授权记录PDA的派生方法,通过正确种子计算目标地址,不要直接传入集合Mint地址
- 把计算得到的PDA传入
collectionAuthorityRecord字段即可,修正后代码如下:
import { findMetadataPda, findCollectionAuthorityRecordPda } from '@metaplex-foundation/js'; const metadataPda = findMetadataPda(mintPk); // 按照Metaplex规则派生集合授权记录PDA:种子为元数据程序ID、集合Mint地址、被授权方公钥 const collectionAuthRecordPda = findCollectionAuthorityRecordPda(collectionPk, authorityKey); const revokeAccount = { collectionAuthorityRecord: collectionAuthRecordPda, delegateAuthority: authorityKey, metadata: metadataPda, revokeAuthority: authorityKey, mint: mintPk, } transaction.add( createRevokeCollectionAuthorityInstruction(revokeAccount) );
注意事项
- 发送交易前需要确保
revokeAuthority对应的钱包对交易完成签名,否则会触发签名缺失错误 - 如果当初授予集合权限的对象不是当前传入的
authorityKey,需要替换为实际的被授权公钥重新派生PDA,否则依然会出现地址校验不通过的问题
内容的提问来源于stack exchange,提问作者Lorem Ipsum
相关产品推荐
相关产品推荐

