![見出し画像](https://assets.st-note.com/production/uploads/images/140360386/rectangle_large_type_2_790a5b27dd7efa4ea8275ca2de96ff1d.png?width=800)
【Solana発展コンセプト①】 バージョン付きトランザクション
この記事は、こちらの公式を翻訳・編集したものです。
0 はじめに
バージョン管理されたトランザクションは、アドレス検索テーブルを含むSolanaランタイムで追加機能を可能にする新しいトランザクション形式です。
オンチェーンプログラムに変更を加える必要はありませんが(バージョン管理されたトランザクションの新機能や後方互換性のために)、開発者はクライアントサイドのコードを更新する必要があります。
これは、異なるトランザクションバージョンによるエラーを防ぐためです。
1 現在のトランザクションバージョン
Solanaランタイムは、以下の二つのトランザクションバージョンをサポートしています。
![](https://assets.st-note.com/img/1715816429923-TwgZsn98gr.png?width=800)
①legacy
追加の利点がない古いトランザクション形式
②0
アドレス検索テーブルのサポートが追加された
2 最大サポートされるトランザクションバージョン
トランザクションを返すすべてのRPCリクエストは、getBlockやgetTransactionを含むアプリケーションでサポートするトランザクションの最高バージョンをmaxSupportedTransactionVersionオプションを使用して指定する必要があります。
![](https://assets.st-note.com/img/1715489254614-Ng5s0vPtSG.png?width=800)
![](https://assets.st-note.com/img/1715489517012-NBwC5M6DOr.png?width=800)
バージョン管理されたトランザクションが設定されたmaxSupportedTransactionVersionより高い場合、RPCリクエストは失敗します
例えば、legacyが選択されたときにバージョン0のトランザクションが返された場合
補足
legacyまでしか受け付けないと言っているのに、その先のバージョンを設定しているためですね。
注意
maxSupportedTransactionVersion値が設定されていない場合、RPCレスポンスで許可されるのはlegacyトランザクションのみです。
そのため、バージョン0のトランザクションが返された場合、RPCリクエストは失敗します。
3 最大サポートバージョンの設定方法
maxSupportedTransactionVersionは、@solana/web3.jsライブラリやRPCエンドポイントに直接JSON形式のリクエストを使用して設定できます。
1 web3.jsを使用して
@solana/web3.jsライブラリを使用して、最新のブロックを取得したり特定のトランザクションを取得することができます。
![](https://assets.st-note.com/img/1715489844444-JV00lALO02.png?width=800)
2 RPCへのJSONリクエスト
標準のJSON形式のPOSTリクエストを使用して、特定のブロックを取得する際にmaxSupportedTransactionVersionを設定できます。
![](https://assets.st-note.com/img/1715489923839-Ls7UhzUpNt.png?width=800)
4 バージョン管理されたトランザクションの作成方法
バージョン管理されたトランザクションは、古い方法でトランザクションを作成するのと似ています。
特定のライブラリを使用する際の違いに注意する必要があります。
以下は、@solana/web3.jsライブラリを使用して、二つのアカウント間でSOL転送を行うバージョン管理されたトランザクションを作成する例です。
注意点
payerは有効なKeypairウォレットであり、SOLで資金供給されている必要があります
toAccountは有効なKeypairです
1 クラスターへの接続
まず、web3.jsライブラリをインポートし、希望するクラスターに接続を作成します。
![](https://assets.st-note.com/img/1715490643411-vMWLsDIQYO.png?width=800)
2 minRentの取得
次に、アカウントに必要なminRentを定義します。
補足
送り先のアカウントはデータサイズがないので、0を指定しています。
![](https://assets.st-note.com/img/1715490758278-uxhjr5OWtN.png?width=800)
![](https://assets.st-note.com/img/1715490872236-x0ANWfocoC.png?width=800)
3 最近のブロックハッシュの取得
次に、トランザクションとアカウントに必要な最近のブロックハッシュを定義します。
![](https://assets.st-note.com/img/1715491006367-5Gnp7rjJmW.png?width=800)
![](https://assets.st-note.com/img/1715491085828-nGawFueX8K.png?width=800)
4 指示の作成
トランランザクションで送信したいすべての指示の配列を作成します。
以下の例では、シンプルなSOL転送の指示を作成しています。
![](https://assets.st-note.com/img/1715491201424-CP7YcpZYz2.png?width=800)
5 トランザクションメッセージの作成
次に、希望する指示でMessageV0形式のトランザクションメッセージを構築します。
![](https://assets.st-note.com/img/1715491338743-lyRUSwa7wn.png?width=800)
6 バージョン管理トランザクションの作成
その後、v0互換メッセージを渡して新しいバージョン管理トランザクションを作成します。
![](https://assets.st-note.com/img/1715491432610-G1uiajb8PD.png?width=800)
7 トランザクションへの署名
トランザクションに署名する方法は、以下の二つがあります。
今回は後者で行なっています。
① VersionedTransactionメソッドに署名の配列を渡す
![](https://assets.st-note.com/img/1715491579914-y8tKsufXNn.png?width=800)
② transaction.sign() メソッドを呼び出し、必要なSignersの配列を渡す
![](https://assets.st-note.com/img/1715491658250-IGxIVVBajD.png?width=800)
注記
transaction.sign() メソッドを呼び出した後、以前のトランザクション署名はすべて新たに提供されたSignersから作成された新しい署名によって完全に置き換えられます。
8 クラスターへの送付
必要なすべてのアカウントでバージョン管理トランザクションが署名された後、クラスターに送信してレスポンスを待ちます。
![](https://assets.st-note.com/img/1715492253287-D86ePVsLKh.png?width=800)
レガシートランザクションと異なり、VersionedTransactionをsendTransaction経由で送信する場合、Signersの配列を第二パラメータとして渡してトランザクションに署名することはサポートされていません。
![](https://assets.st-note.com/img/1715492419896-pAkaXAi55C.png?width=800)
transaction.sendTransaction() を呼び出す前にトランザクションに署名する必要があります。
5 その他のリソース
アドレス検索テーブルのためのバージョン管理トランザクションの使用
Solana Explorerでのv0トランザクションの例の閲覧
![](https://assets.st-note.com/img/1715492503388-vkEr0FvcIf.png?width=800)
バージョン管理トランザクションとアドレス検索テーブルについての承認された提案
このように、バージョン管理されたトランザクションの作成と利用方法、またそれに関連する重要な情報が説明されています。
補足
その他、今回使用したコードはこちらに載せています。
サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊