V0からV1トランザクションへの移行

Last updated September 21, 2026

UmiアプリケーションをV0からV1トランザクションへ移行すると、より大きなトランザクションを使用し、トランザクションメッセージ上でコンピュートバジェットを直接設定できます。

移行する内容

このガイドでは、UmiのV0トランザクションビルダーをV1へ移行し、Compute Budget命令をTransactionV1Configに置き換え、V1をグローバルに設定し、V0のままにする必要があるトランザクションを特定します。

まとめ

Umi 1.6.0では、useV1()、defaultTransactionVersion: 1、およびトランザクションを直接作成する際のversion: 1を通じて、オプトインでV1トランザクションをサポートします。

  • V1では、シリアライズ後のトランザクション上限が1,232バイトから4,096バイトに増えます。
  • V1では、コンピュート制限と優先料金の合計をTransactionV1Configに格納します。
  • V1はAddress Lookup TablesとCompute Budget命令をサポートしません。
  • Umiのデフォルトは引き続きV0であり、接続されるウォレットがV1に対応している必要があります。

クイックスタート

トランザクションビルダーでV1を選択し、Compute Budget命令をsetTransactionConfigに置き換えます。

  1. Umiを1.6.0以降、@solana/web3.jsを1.99.0以降にアップグレードします。
  2. トランザクションビルダーに.useV1()を追加します。
  3. setComputeUnitLimit命令とsetComputeUnitPrice命令を削除します。
  4. .setTransactionConfig({ computeUnitLimit, priorityFee })を追加します。
  5. アプリケーションがサポートするすべてのウォレットでV1の署名をテストします。

ジャンプ: 前提条件 · V0とV1の違い · ビルダーの移行 · アプリケーションのデフォルト · 直接作成 · Address Lookup Tables · 一般的なエラー · FAQ

前提条件

V1への移行には、互換性のあるUmi、Web3.js、RPC、ウォレットの各バージョンが必要です。

コンポーネント要件
Umi packages1.6.0以降
@solana/web3.js1.99.0以降
Solana clustersmainnet-beta、devnet、testnetでV1が有効
Walletトランザクションバージョン1を受け入れて署名できること

接続されるすべてのウォレット経路がトランザクションバージョン1に対応するまで、V1をグローバルに有効化しないでください。Umiはウォレットアダプター向けにトランザクションをシリアライズしますが、互換性のないウォレットに署名させることはできません。

V0とV1トランザクションの違い

V1ではトランザクションのサイズ上限が増えますが、V0のAddress Lookup TablesやCompute Budget命令はサポートされません。

機能V0V1
シリアライズ後のサイズ上限1,232バイト4,096バイト
Address lookup tablesサポートありサポートなし
コンピュートユニット制限Compute Budget命令transactionConfig.computeUnitLimit
優先料金コンピュートユニットあたりのマイクロラムポートtransactionConfig.priorityFee内の合計SolAmount
Umi 1.6.0でのデフォルトはいいいえ、オプトインが必要
ビルダーのセレクターuseV0()useV1()

V1は、Address Lookup Tableに依存せず、トランザクションがV0のサイズ上限を超える場合に最も有用です。

トランザクションビルダーをV1へ移行する

V0トランザクションビルダーは、Compute Budget命令をuseV1()とsetTransactionConfig()に置き換えることでV1へ移行できます。

移行前のV0トランザクションビルダー

V0トランザクションビルダーでは、コンピュートユニット制限と価格を命令として指定します。

transaction-v0.ts
import { transactionBuilder } from '@metaplex-foundation/umi'
import {
setComputeUnitLimit,
setComputeUnitPrice,
transferSol,
} from '@metaplex-foundation/mpl-toolbox'
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 600_000 }))
.add(setComputeUnitPrice(umi, { microLamports: 1_000 }))
.add(transferSol(umi, transferArgs))
.sendAndConfirm(umi)

移行後のV1トランザクションビルダー

V1トランザクションビルダーでは、コンピュートユニット制限と優先料金の合計をトランザクションメッセージ内に指定します。

transaction-v1.ts
import { lamports, transactionBuilder } from '@metaplex-foundation/umi'
import { transferSol } from '@metaplex-foundation/mpl-toolbox'
await transactionBuilder()
.add(transferSol(umi, transferArgs))
.useV1()
.setTransactionConfig({
computeUnitLimit: 600_000,
priorityFee: lamports(600),
})
.sendAndConfirm(umi)

合計料金の600ラムポートは、600,000 × 1,000 ÷ 1,000,000に相当します。変換結果が整数のラムポートにならない場合は切り上げてください。

setTransactionConfig()は設定全体を置き換えます。個々のフィールドを指定して繰り返し呼び出すのではなく、カスタムV1設定をすべて同じ呼び出しに含めてください。

V1をアプリケーションのデフォルトに設定する

defaultTransactionVersion: 1を設定すると、ビルダーが別のバージョンを明示的に選択しない限り、すべてのトランザクションビルダーがV1を使用します。

umi.ts
import { createUmi } from '@metaplex-foundation/umi-bundle-defaults'
const umi = createUmi('https://api.mainnet-beta.solana.com', {
defaultTransactionVersion: 1,
})

このオプションは、Metaplexのプログラムライブラリが返すビルダーにも適用されます。useV0()を呼び出すビルダーは、引き続きアプリケーションのデフォルトを上書きします。

トランザクションファクトリーを直接インストールするアプリケーションでは、代わりにプラグインを設定できます。

umi-with-custom-plugins.ts
import { web3JsTransactionFactory } from '@metaplex-foundation/umi-transaction-factory-web3js'
umi.use(web3JsTransactionFactory({ defaultTransactionVersion: 1 }))

トランザクションの直接作成をV1へ移行する

umi.transactions.create()を直接呼び出す場合は、version: 1を設定し、ゼロではないランタイム制限を明示的に指定する必要があります。

create-transaction-v1.ts
const transaction = umi.transactions.create({
version: 1,
blockhash: (await umi.rpc.getLatestBlockhash()).blockhash,
instructions: [myInstruction],
payer: umi.payer.publicKey,
transactionConfig: {
computeUnitLimit: 200_000,
loadedAccountsDataSizeLimit: 64 * 1024 * 1024,
},
})

TransactionBuilderは、コンピュート制限とロード済みアカウント制限が省略された場合に、従来と同等のデフォルト値を補います。低レベルのcreate()メソッドは補わないため、省略された制限はランタイムによってゼロとして扱われます。

V1トランザクションの制限を設定する

TransactionV1Configは、コンピュート、アカウントデータ、ヒープサイズ、優先料金の合計を制御します。

フィールド意味有効範囲または動作
computeUnitLimitコンピュートユニットの最大値0から1,400,000までの整数
priorityFee優先料金の合計通常はlamports(...)で作成するSolAmount
loadedAccountsDataSizeLimitロード済みアカウントデータの最大値最大64 MiB
heapSizeプログラムのヒープフレームサイズ32,768から262,144バイトまで(1,024バイト単位)

これらのフィールドを省略すると、ビルダーはcomputeUnitLimitのデフォルトをmin(200,000 × 命令数, 1,400,000)、loadedAccountsDataSizeLimitのデフォルトを64 MiBに設定します。

Address Lookup Tableを使用するトランザクションをV0のままにする

Address Lookup Tablesを必要とするトランザクションは、V0のままにする必要があります。

transaction-v0-with-lookup-table.ts
const builder = transactionBuilder()
.add(myInstruction)
.useV0()
.setAddressLookupTables([myLookupTable])

トランザクションをV1へ強制的に移行するためだけにAddress Lookup Tableを削除しないでください。コンパイル後のアカウントリストとシリアライズ後のサイズを比較し、トランザクションの要件を満たす形式を使用してください。

カスタムUmi連携を更新する

Umi 1.6.0へアップグレードする際、カスタムトランザクションファクトリーとバージョンを網羅的に処理するコードにはV1サポートを追加する必要があります。

  • カスタムTransactionFactoryInterface実装にgetDefaultVersion()を実装します。
  • TransactionVersionを網羅的に分岐するコードに1のケースを追加します。
  • V0のバージョンフィールドが必須になったため、直接作成するV0のTransactionInputオブジェクトにversion: 0を追加します。
  • トランザクションを読み取る際はtransaction.message.versionを確認します。V1メッセージにはtransactionConfigが含まれます。

UmiのRPC連携はmaxSupportedTransactionVersion: 1を要求するため、umi.rpc.getTransaction()でV1トランザクションを取得できます。

V1移行でよくあるエラー

Umiは、互換性のないビルダーの組み合わせをトランザクション送信前に拒否します。

エラー原因修正方法
V1 transactions ignore ComputeBudget instructions. Set the compute budget with setTransactionConfig instead.V1トランザクションビルダーにsetComputeUnitLimit、setComputeUnitPrice、または別のCompute Budget命令が含まれている命令を削除し、setTransactionConfig()を使用する
Address lookup tables are not supported by V1 transactions.V1トランザクションビルダーに1つ以上のAddress Lookup Tablesが設定されているビルダーをV0のままにするか、lookup tableの要件をなくす
Transaction configs are only supported by V1 transactions.legacyまたはV0のトランザクションビルダーがsetTransactionConfig()を呼び出しているuseV1()を呼び出すか、V0でCompute Budget命令を使用する
ウォレットがトランザクションを拒否する、またはデシリアライズできないウォレットがトランザクションバージョン1をサポートしていないウォレットがV1をサポートするまで、そのウォレットのフローをV0のままにする
直接作成したトランザクションがコンピュートバジェット不足で失敗するcreate()にcomputeUnitLimitが指定されていないゼロではないtransactionConfig.computeUnitLimitを設定する

注意事項

  • Umi 1.6.0ではV1はオプトインであり、後方互換性のためデフォルトはV0のままです。
  • V1は2026年9月15日のepoch 1035にSolana mainnet-betaで有効化されました。
  • 送信とシミュレーションにはbase64エンコーディングが使用され、1,232バイトを超えるV1トランザクションに対応します。
  • Umiはシリアライズ前にコンピュートユニット制限とヒープサイズを検証します。
  • 実装と互換性の詳細はmetaplex-foundation/umi#216に記載されています。

FAQ

UmiはデフォルトでV1トランザクションを使用しますか?

Umi 1.6.0では、後方互換性のためV0がデフォルトのままです。トランザクションビルダーでuseV1()を呼び出すか、Umiの作成時にdefaultTransactionVersion: 1を設定してください。

UmiのV1トランザクションでAddress Lookup Tableを使用できますか?

V1トランザクションはAddress Lookup Tablesをサポートしません。Address Lookup Tableを必要とするトランザクションはV0のままにしてください。

V1トランザクションにCompute Budgetプログラム命令を含めることはできますか?

UmiはCompute Budget命令を含むV1トランザクションビルダーを拒否します。コンピュートユニット制限、優先料金の合計、ロード済みアカウントデータサイズ制限、またはヒープサイズの設定にはsetTransactionConfig()を使用してください。

V1トランザクションの優先料金はコンピュートユニットあたりの価格ですか?

TransactionV1Config.priorityFeeはコンピュートユニットあたりの価格ではなく、SolAmountとして指定する優先料金の合計です。マイクロラムポート単位の価格にコンピュートユニット制限を掛け、1,000,000で割り、ラムポート単位に切り上げて変換します。

すべてのSolanaウォレットがV1トランザクションをサポートしていますか?

トランザクションバージョン1への対応は、すべてのウォレットで共通ではありません。Umiはウォレットアダプター向けにV1トランザクションをシリアライズできますが、接続されたウォレットがトランザクションを受け入れて署名できる必要があります。