配置

资产签名者钱包

Last updated March 19, 2026

概述

资产签名者钱包允许您将MPL Core资产的签名者PDA用作活动CLI钱包。激活后,每个CLI命令都会自动将其指令包装在链上execute指令中——无需自定义脚本。

  • 使用mplx config wallets add <name> --asset <assetId>将任何Core资产注册为钱包
  • 当资产签名者钱包处于活动状态时,所有CLI命令透明地通过PDA操作
  • 资产所有者签署execute指令;可使用-p指定单独的费用支付者
  • 部分操作受Solana CPI约束限制(大型账户创建、原生SOL包装)

快速开始

Asset-signer wallet setup
# 1. 创建资产(或使用您拥有的现有资产)
mplx core asset create --name "My Vault" --uri "https://example.com/vault"
# 2. 注册为钱包(从链上数据自动检测所有者)
mplx config wallets add vault --asset <assetId>
# 3. 查看PDA信息
mplx core asset execute info <assetId>
# 4. 为PDA注资
mplx toolbox sol transfer 0.1 <signerPdaAddress>
# 5. 切换到资产签名者钱包
mplx config wallets set vault
# 6. 以PDA身份使用任何命令
mplx toolbox sol balance
mplx toolbox sol transfer 0.01 <destination>
mplx core asset create --name "PDA Created NFT" --uri "https://example.com/nft"

资产签名者钱包工作原理

CLI使用noop-signer模式使PDA操作透明化。当资产签名者钱包处于活动状态时:

  1. umi.identity 设置为具有PDA公钥的noop签名者——命令自然地使用PDA作为权限构建指令
  2. umi.payer 也设置为PDA noop签名者——因此派生地址(ATA、代币账户)正确解析
  3. 发送时,交易被包装在MPL Core的execute指令中,在链上代表PDA签名
  4. 真实钱包(资产所有者)签署外部交易并通过setFeePayer支付费用

注册资产签名者钱包

Add asset-signer wallet
mplx config wallets add <name> --asset <assetId>

--asset标志是与普通钱包的区别所在。CLI在链上获取资产、确定所有者,并与已保存的钱包进行匹配。如果所有者不在您的钱包列表中,您必须先添加所有者钱包。

注册后,使用标准钱包命令listsetremove)像管理其他钱包一样管理它。资产签名者钱包在钱包列表中显示为asset-signer类型。

-k标志可以在单个命令中绕过活动钱包,包括资产签名者钱包。

单独的费用支付者

链上execute指令支持单独的权限和费用支付者账户。使用-p让另一个钱包支付交易费用,同时资产所有者签署execute:

Separate fee payer
mplx toolbox sol transfer 0.01 <destination> -p /path/to/fee-payer.json

资产所有者仍然签署execute指令。-p钱包仅支付Solana交易费用。

支持的命令

所有CLI命令都可以与资产签名者钱包配合使用。交易包装在发送层透明进行。

类别命令
Coreasset create, asset transfer, asset burn, asset update, collection create
Toolbox SOLbalance, transfer, wrap, unwrap
Toolbox Tokentransfer, create, mint
Toolbox Rawraw --instruction <base64>
Token Metadatatransfer, create, update
Bubblegumnft create, nft transfer, nft burn, collection create
Genesiscreate, bucket add-*, deposit, withdraw, claim, finalize, revoke
Distributioncreate, deposit, withdraw
Candy Machineinsert, withdraw

CPI限制

由于Solana CPI约束,某些操作无法包装在execute()中:

  • 大型账户创建 — Merkle树和Candy Machine超过CPI账户分配限制
  • 原生SOL包装 — 向代币账户的transferSol在CPI上下文中失败

对于这些操作,请使用普通钱包或先创建基础设施,然后切换到资产签名者钱包进行后续操作。

使用Toolbox Raw执行原始指令

mplx toolbox raw命令执行任意base64编码的指令。当资产签名者钱包处于活动状态时,这些指令会自动包装在execute()中。

Execute raw instructions
# 单个指令
mplx toolbox raw --instruction <base64>
# 多个指令
mplx toolbox raw --instruction <ix1> --instruction <ix2>
# 从stdin读取
echo "<base64>" | mplx toolbox raw --stdin

构建原始指令

CLI包含用于构建base64编码指令的序列化辅助工具:

build-raw-instruction.ts
import { publicKey } from '@metaplex-foundation/umi'
import { serializeInstruction } from '@metaplex-foundation/cli/lib/execute/deserializeInstruction'
const signerPda = '<PDA address from execute info>'
const destination = '<destination address>'
// System Program SOL transfer
const data = new Uint8Array(12)
const view = new DataView(data.buffer)
view.setUint32(0, 2, true) // Transfer discriminator
view.setBigUint64(4, 1_000_000n, true) // 0.001 SOL
const ix = {
programId: publicKey('11111111111111111111111111111111'),
keys: [
{ pubkey: publicKey(signerPda), isSigner: true, isWritable: true },
{ pubkey: publicKey(destination), isSigner: false, isWritable: true },
],
data,
}
console.log(serializeInstruction(ix))
// Pass the output to: mplx toolbox raw --instruction <base64>

指令二进制格式

字节字段
32程序ID
2账户数量(u16小端序)
每个账户3332字节公钥 + 1字节标志(位0 = isSigner,位1 = isWritable)
剩余指令数据

快速参考

项目
添加钱包mplx config wallets add <name> --asset <assetId>
切换钱包mplx config wallets set <name>
检查PDAmplx core asset execute info <assetId>
覆盖任何命令加-k /path/to/keypair.json
费用支付者任何命令加-p /path/to/payer.json
PDA派生findAssetSignerPda(umi, { asset: assetPubkey })
配置文件~/.config/mplx/config.json
源码GitHub — metaplex-foundation/cli

术语表

术语定义
签名者PDAMPL Core资产派生的程序派生地址,可以持有SOL、代币和拥有其他资产
Execute指令允许PDA代表资产签署指令的MPL Core链上指令
Noop签名者提供公钥但不产生签名的占位符签名者——用于使命令以PDA为目标构建指令
CPI跨程序调用——一个Solana程序调用另一个程序;在CPI上下文中存在大小限制

FAQ

每个操作都需要单独的execute命令吗?

不需要。当资产签名者钱包处于活动状态时,每个CLI命令在发送时都会自动包装在execute指令中。使用mplx toolbox sol transfermplx core asset create等标准命令——这些操作不存在单独的execute子命令。

如果资产所有者不在保存的钱包中会怎样?

CLI将返回错误,要求您先添加所有者钱包。在注册资产签名者钱包之前,使用资产所有者的密钥对运行mplx config wallets add <name> <keypair-path>

PDA签名时,其他钱包可以支付交易费用吗?

可以。在任何命令中传递-p /path/to/fee-payer.json。资产所有者仍然签署execute指令,但-p钱包支付Solana交易费用。

哪些操作不能用execute包装?

大型账户创建(Merkle树、Candy Machine)和原生SOL包装由于Solana CPI大小限制而失败。先用普通钱包创建此基础设施,然后切换到资产签名者钱包进行后续操作。

如何查看PDA解析到的地址?

运行mplx core asset execute info <assetId>。这将显示确定性签名者PDA地址及其当前SOL余额。

注意事项

  • 资产签名者钱包要求资产所有者的钱包已保存在您的钱包配置中——请先添加所有者钱包
  • 资产签名者钱包在配置文件中存储PDA地址、关联的资产ID和所有者钱包的引用
  • 从资产签名者钱包切换后,命令将恢复为普通密钥对签名
  • -k标志始终优先于活动钱包,包括资产签名者钱包
  • 通过mplx toolbox raw的原始指令在资产签名者钱包处于活动状态时与其他命令一样包装在execute()
Previous
钱包