外部プラグイン
外部プラグインの追加
Last updated January 31, 2026
このガイドでは、Core AssetsとCollectionsに外部プラグイン(Oracle、AppData)を追加する方法を説明します。作成時または既存のAssets/Collectionsに追加します。
学べること
- Asset/Collection作成時に外部プラグインを追加
- 既存のAssets/Collectionsに外部プラグインを追加
- Oracleライフサイクルチェックの設定
- data authorityを使用したAppDataの設定
概要
plugins配列を持つcreate()を使用するか、既存のAssetsにはaddPlugin()を使用して外部プラグインを追加します。CollectionsはcreateCollection()とaddCollectionPlugin()を使用します。
- 作成時に追加:
plugins配列に含める - 既存に追加:
addPlugin()/addCollectionPlugin()を使用 - update authorityの署名が必要
- Oracleプラグインのライフサイクルチェックを設定
対象外
外部プラグインの削除(外部プラグインの削除を参照)、プラグインデータの更新、および組み込みプラグイン(プラグインの追加を参照)。
クイックスタート
ジャンプ先: プラグイン付きAssetの作成 · 既存Assetへの追加 · プラグイン付きCollectionの作成
- OracleアカウントまたはAppData設定を準備
- 作成時または
addPlugin()でプラグインを追加 - ライフサイクルチェック(Oracle)またはdata authority(AppData)を設定
Assets
外部プラグイン付き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への外部プラグインの追加
割り当てられたauthorityを持つプラグインの追加
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)
}
Collections
外部プラグイン付き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への外部プラグインの追加
Assetsのバーン
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
update authorityのみが外部プラグインを追加できます。正しいキーペアで署名していることを確認してください。
Plugin already exists
同じキーを持つ外部プラグインが既に存在します。最初に削除するか、代わりに更新してください。
Invalid Oracle account
Oracleベースアドレスが無効であるか、アカウントが存在しません。
注意事項
- 外部プラグインはAuthority Managed(update authorityが制御)
- Oracleプラグインには既存のOracleアカウントが必要
- AppDataプラグインには書き込み権限のためのData Authorityが必要
- Collectionプラグインは既存のAssetsには自動的に適用されない
FAQ
1つのAssetに複数の外部プラグインを追加できますか?
はい。1つのAssetに複数のOracleおよび/またはAppDataプラグインを追加できます。
最初にOracleアカウントを作成する必要がありますか?
はい。Oracleプラグインアダプターを追加する前に、Oracleアカウントが存在している必要があります。
作成時に追加する場合と後から追加する場合の違いは何ですか?
機能的な違いはありません。作成時に追加する方が効率的です(1つのトランザクション)。後から追加する場合は、別のトランザクションが必要です。
関連操作
- 外部プラグインの削除 - 外部プラグインの削除
- 外部プラグイン概要 - 外部プラグインの理解
- Oracleプラグイン - Oracle設定の詳細
- AppDataプラグイン - AppData設定の詳細
