はじめに

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

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

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

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

概要

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を本来の用途とは異なる形で利用し、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に記載されています。 このコードには、入力(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で作成され、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などからお気軽に質問してください!

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