外部插件

添加外部插件

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

  1. 准备您的 Oracle 账户或 AppData 配置
  2. 在创建时添加插件或通过 addPlugin() 添加
  3. 配置生命周期检查(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 账户必须已经存在。

创建时添加和之后添加有什么区别?

功能上没有区别。创建时添加更高效(一个交易)。之后添加需要单独的交易。

相关操作

Previous
概述