外部プラグイン

外部プラグインの追加

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の作成

  1. OracleアカウントまたはAppData設定を準備
  2. 作成時またはaddPlugin()でプラグインを追加
  3. ライフサイクルチェック(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つのトランザクション)。後から追加する場合は、別のトランザクションが必要です。

関連操作

Previous
概要