外部插件
添加外部插件
Last updated January 31, 2026
本指南展示如何向 Core Asset 和 Collection 添加外部插件(Oracle、AppData)。可以在创建时添加,也可以添加到现有的 Asset/Collection。
您将学到
- 在 Asset/Collection 创建期间添加外部插件
- 向现有 Asset/Collection 添加外部插件
- 配置 Oracle 生命周期检查
- 使用数据权限设置 AppData
概要
使用带有 plugins 数组的 create() 添加外部插件,或使用 addPlugin() 添加到现有 Asset。Collection 使用 createCollection() 和 addCollectionPlugin()。
- 创建时添加:包含在
plugins数组中 - 添加到现有:使用
addPlugin()/addCollectionPlugin() - 需要更新权限签名
- 为 Oracle 插件配置生命周期检查
超出范围
移除外部插件(参见移除外部插件)、更新插件数据和内置插件(参见添加插件)。
快速开始
跳转至: 创建带插件的 Asset · 添加到现有 Asset · 创建带插件的 Collection
- 准备您的 Oracle 账户或 AppData 配置
- 在创建时添加插件或通过
addPlugin()添加 - 配置生命周期检查(Oracle)或数据权限(AppData)
Asset
创建带外部插件的 Core Asset
创建带外部插件的 Core Asset
import { generateSigner } from '@metaplex-foundation/umi'
import { create, CheckResult } from '@metaplex-foundation/mpl-core'
const assetSigner = publicKey('11111111111111111111111111111111')
const oracleAccount = publicKey('22222222222222222222222222222222')
await create(umi, {
asset: assetSigner,
name: 'My Asset',
uri: 'https://example.com/my-asset.json',
plugins: [
{
type: 'Oracle',
resultsOffset: {
type: 'Anchor',
},
lifecycleChecks: {
update: [CheckResult.CAN_REJECT],
},
baseAddress: oracleAccount,
},
],
}).sendAndConfirm(umi)
向 Core Asset 添加外部插件
添加带有指定权限的插件
use mpl_core::{
instructions::AddExternalPluginAdapterV1Builder,
types::{
ExternalCheckResult, ExternalPluginAdapterInitInfo, HookableLifecycleEvent,
OracleInitInfo, ValidationResultsOffset,
},
};
use solana_client::nonblocking::rpc_client;
use solana_sdk::{pubkey::Pubkey, signature::Keypair, signer::Signer, transaction::Transaction};
use std::str::FromStr;
pub async fn add_oracle_plugin_to_asset() {
let rpc_client = rpc_client::RpcClient::new("https://api.devnet.solana.com".to_string());
let authority = Keypair::new();
let asset = Pubkey::from_str("11111111111111111111111111111111").unwrap();
let oracle_plugin = Pubkey::from_str("22222222222222222222222222222222").unwrap();
let add_oracle_plugin_to_asset_ix = AddExternalPluginAdapterV1Builder::new()
.asset(asset)
.payer(authority.pubkey())
.init_info(ExternalPluginAdapterInitInfo::Oracle(OracleInitInfo {
base_address: oracle_plugin,
results_offset: Some(ValidationResultsOffset::Anchor),
lifecycle_checks: vec![(
HookableLifecycleEvent::Transfer,
ExternalCheckResult { flags: 4 },
)],
base_address_config: None,
init_plugin_authority: None,
}))
.instruction();
let signers = vec![&authority];
let last_blockhash = rpc_client.get_latest_blockhash().await.unwrap();
let add_oracle_plugin_to_asset_tx = Transaction::new_signed_with_payer(
&[add_oracle_plugin_to_asset_ix],
Some(&authority.pubkey()),
&signers,
last_blockhash,
);
let res = rpc_client
.send_and_confirm_transaction(&add_oracle_plugin_to_asset_tx)
.await
.unwrap();
println!("Signature: {:?}", res)
}
Collection
创建带外部插件的 Core Collection
向 Core Collection 添加外部插件
import { generateSigner, publicKey } from '@metaplex-foundation/umi'
import { createCollection, CheckResult } from '@metaplex-foundation/mpl-core'
const collectionSigner = generateSigner(umi)
const oracleAccount = publicKey('22222222222222222222222222222222')
await createCollection(umi, {
collection: collectionSigner,
name: 'My Collection',
uri: 'https://example.com/my-collection.json',
plugins: [
{
type: 'Oracle',
resultsOffset: {
type: 'Anchor',
},
lifecycleChecks: {
update: [CheckResult.CAN_REJECT],
},
baseAddress: oracleAccount,
},
,
],
}).sendAndConfirm(umi)
向 Collection 添加外部插件
销毁 Asset
import { publicKey } from '@metaplex-foundation/umi'
import { addCollectionPlugin, CheckResult } from '@metaplex-foundation/mpl-core'
const collection = publicKey('11111111111111111111111111111111')
const oracleAccount = publicKey('22222222222222222222222222222222')
await addCollectionPlugin(umi, {
collection: collection,
plugin: {
type: 'Oracle',
resultsOffset: {
type: 'Anchor',
},
lifecycleChecks: {
update: [CheckResult.CAN_REJECT],
},
baseAddress: oracleAccount,
},
}).sendAndConfirm(umi)
常见错误
Authority mismatch
只有更新权限可以添加外部插件。请验证您使用的是正确的密钥对进行签名。
Plugin already exists
具有相同键的外部插件已存在。请先移除它或改为更新它。
Invalid Oracle account
Oracle 基础地址无效或账户不存在。
注意事项
- 外部插件是权限管理的(由更新权限控制)
- Oracle 插件需要现有的 Oracle 账户
- AppData 插件需要数据权限才能写入
- Collection 插件不会自动应用于现有 Asset
常见问题
我可以向一个 Asset 添加多个外部插件吗?
可以。您可以向单个 Asset 添加多个 Oracle 和/或 AppData 插件。
我需要先创建 Oracle 账户吗?
是的。在添加 Oracle 插件适配器之前,Oracle 账户必须已经存在。
创建时添加和之后添加有什么区别?
功能上没有区别。创建时添加更高效(一个交易)。之后添加需要单独的交易。
相关操作
- 移除外部插件 - 移除外部插件
- 外部插件概述 - 了解外部插件
- Oracle 插件 - Oracle 配置详情
- AppData 插件 - AppData 配置详情
