# [ACP23] Avalanche P-Chainにおける資産Transferの仕組みを理解しよう！

> ACP23は、AvalancheのP-Chainに「ネイティブなTransfer機能」を追加する提案です。現在、P-Chain上にはユーザーが資産を直接送付するためのシンプルなトランザクション形式が存在しません。

- URL: https://cardene.dev/articles/6eb1d3978230b39da748
- 公開日: 2025-09-09
- 更新日: 2025-09-09
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

『DApps開発入門』という本や色々記事を書いているかるでねです。

https://amzn.asia/d/gxvJ0Pw

今回は、AvalancheのP-Chain上に資産Transfer用のトランザクションを導入し、ユーザーが直接P-Chain上で資産をやり取りできる仕組みを提案している**ACP23**についてまとめていきます！

:::message
以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。
:::

https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/23-p-chain-native-transfers/README.md

他にも様々なEIP・BIP・SLIP・CAIP・ENSIP・RFC・ACPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

## 概要

**ACP23**は、AvalancheのP-Chainに「**ネイティブなTransfer機能**」を追加する提案です。
現在、P-Chain上にはユーザーが資産を直接送付するためのシンプルなトランザクション形式が存在しません。
そのため、ユーザーがP-Chain上で資産を動かす時には、本来Transferのために設計されていない別のトランザクション形式を流用する必要があります。
**ACP23**では、P-Chain上で資産のTransferを行うためのネイティブなトランザクションをサポートし、ユーザーが安全かつシンプルにP-Chain内で資産をやり取りできるようにすることを目的としています。

## 動機

現状、X-Chainでは`BaseTx`と呼ばれる基本的なトランザクション形式を用いて、資産のシンプルなTransferが可能です。
P-Chainにも`BaseTx`を拡張したトランザクション形式は存在するものの、`BaseTx`そのものは有効なトランザクションとして扱えません。
そのため、P-Chain上でTransferを行うには不自然な方法を取らざるを得ません。
例えば、AvalancheGoウォレットでは[`CreateSubnetTx`](https://github.com/ava-labs/avalanchego/blob/v1.10.15/wallet/chain/p/builder.go#L54-L63)を本来の用途とは異なる形で利用し、`BaseTx`が提供する機能を無理やり再現しています。

このような回避策は技術的には可能ですが、本来の設計意図に沿ったものではなく、複雑さやコストを増やすことになります。
特に、今後Avalancheネットワーク上で多くのL1が立ち上がることが想定される中、ユーザーがP-Chain上で資産をTransferする需要は高まると考えられます。
そのため、ネイティブなTransfer機能を提供することで、バリデータやエンドユーザーにとってより安価で簡単な利用方法を提供し、利便性と効率を向上させる必要があります。

## 仕様

**ACP23**では、P-Chain上で`BaseTx`を有効なトランザクションとして扱えるようにするための仕組みが定義されています。
具体的には、Avalancheのクライアントソフトウェア（AvalancheGoなど）が、`BaseTx`を新たに正式なトランザクションタイプとして認識できるようにする必要があります。

#### BaseTxの登録

まず、Avalanche Network Clientsは`BaseTx`を登録する必要があります。
登録の時には以下の情報が使われます。

| 項目            | 値      |
| ------------- | ------ |
| Type ID       | `0x22` |
| Codec Version | `0x00` |

これにより、クライアントはP-Chain上で送られてくるトランザクションが`BaseTx`であることを識別できるようになります。
これまでは`BaseTx`そのものが有効なトランザクションとして扱われていなかったため、Transfer専用のトランザクション形式が存在しませんでしたが、今回の変更でそれが可能となります。

#### BaseTxの仕様

`BaseTx`は、AvalancheのP-Chainにおけるトランザクションの基盤となる構造で、多くの他のP-Chainトランザクションがこの型を拡張しています。
例えば、`CreateSubnetTx`や`AddValidatorTx`などのトランザクションは内部的に`BaseTx`を継承し、その上で追加の機能を実装しています。

**ACP23**で重要なのは、新しいトランザクション形式を定義するわけではないという点です。
既存の`BaseTx`を正式に「**有効なトランザクション**」として登録するだけであり、その内容自体は変更されません。
つまり、これまで利用されていた構造を、そのまま直接利用可能にするという仕様です。

仕様の詳細については、AvalancheGoのリポジトリにある[`base_tx.go`](https://github.com/ava-labs/avalanchego/blob/v1.10.15/vms/platformvm/txs/base_tx.go#L29)に記載されています。
このコードには、入力（Inputs）、出力（Outputs）、ネットワークIDやブロックチェーンIDといった基本的なフィールドが定義されています。

```go
// BaseTx is the basis of all transactions
type BaseTx struct {
    // Metadata, inputs, and outputs
    UnsignedTx `serialize:"true" json:"unsignedTx"`
}
```

## 互換性

**ACP23**では、新たに`BaseTx`というトランザクションタイプを正式に追加することになります。
トランザクションタイプの追加は「**実行に関わる変更（execution change）**」と呼ばれ、必ずネットワークのアップグレードを必要とします。
これは、すでに稼働しているノードがこの新しいトランザクションを認識できるようにするためです。

そのため、アップグレードが行われる前の段階では、実装者は必ずこのトランザクションを拒否するようにしておく必要があります。
アップグレードが有効になる前に新しい形式を受け入れてしまうと、ネットワークの整合性が壊れる可能性があるからです。

**ACP23**が規定しているのは、追加される`BaseTx`トランザクションタイプの仕様そのものに限定されており、その他の機能には影響を与えません。

## 参考実装

`BaseTx`のサポートを追加する実装はすでに[こちらのPull Request](https://github.com/ava-labs/avalanchego/pull/2232)で作成され、AvalancheGoに統合済みです。
つまり、コードレベルではすでに組み込まれています。

ただし、このトランザクションを実際に利用できるようにするには「**Dアップグレード**」が有効化される必要があります。
現時点ではこのアップグレードがまだ有効になっていないため、AvalancheGoは送信された`BaseTx`を拒否します。

また、もし**ACP23**の議論や仕様策定の過程でトランザクション仕様に修正が加えられる場合には、それに合わせてコードもアップデートする必要があります。
アップグレードが有効化される前に、仕様と実装を完全に一致させておくことが求められます。

## セキュリティ

P-Chainには現在「**固定手数料（fixed fee）**」の仕組みしかなく、ネットワークの利用が集中してもそれを制御する仕組みはありません。
つまり、トランザクション手数料が低いまま多くのユーザーが取引を発行すると、処理が集中し、チェーン全体のスループットに影響を与える可能性があります。

**ACP23**で追加される`BaseTx`は、シンプルなTransferの需要が高いため、多くのユーザーに利用される可能性が高いと考えられます。
これが大量に利用されると、P-Chainに一時的な負荷がかかるリスクがあります。

この点を考慮して、AvalancheGoの参考実装では`BaseTx`のトランザクション手数料を**0.001 AVAX**に設定しています。
この値は、すでに存在する`ImportTx`や`ExportTx`と同じ水準であり、スパム的な利用を抑制するための抑止力となります。
現時点ではこれで十分とされています。

しかし、長期的にはP-Chainに「**動的な手数料メカニズム**」を導入する必要があると考えられています。
動的手数料とは、ネットワークの混雑状況に応じて手数料が変動する仕組みで、利用集中によるリスクを緩和できます。
ただし、これはP-Chain全体の手数料設計に大きく関わるため、**ACP23**の範囲では扱われていません。














## 最後に

今回は「AvalancheのP-Chain上に資産Transfer用のトランザクションを導入し、ユーザーが直接P-Chain上で資産をやり取りできる仕組みを提案している**ACP23**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください！

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4
