見出し画像

【Solana発展コンセプト②】 ルックアップテーブル

この記事は、こちらの公式を翻訳・編集したものです。

0 はじめに

1 目的

アドレスルックアップテーブル(通常は「ルックアップテーブル」または略して「ALT」と呼ばれます)を使用すると、開発者は関連するアドレスのコレクションを作成します。

1つのトランザクションより多くのアドレスを効率的にロードできます。

2 上限の引き上げ

Solanaブロックチェーン上の各トランザクションでは、トランザクションの一部としてやり取りされるすべてのアドレスをリストアップする必要があります。

しかし、このリスティングは1トランザクションあたり32アドレスに制限されることになります。

アドレスルックアップテーブルを使用すると、1トランザクションあたりのアドレス制限を256アドレスに引き上げることができます。

1 オンチェーンアドレスの圧縮

すべての望ましいアドレスがアドレスルックアップテーブルオンチェーンで保存された後、各アドレスはテーブル内の1バイトのインデックス(32バイトのフルアドレスではなく)でトランザクション内で参照されることができます。

このルックアップ方法は効果的に32バイトのアドレスを1バイトのインデックス値に「圧縮」します。

この「圧縮」により、任意のトランザクション内で使用するために、1つのルックアップテーブルに最大256アドレスを保存できます。

2 バージョン管理トランザクション

トランザクション内でアドレスルックアップテーブルを利用するには、新しいバージョン管理トランザクション形式で導入されたv0トランザクションを使用する必要があります。

この部分については、こちらをご参照ください。

3 アドレスルックアップテーブルの作成方法

1 web3.jsライブラリの使用

@solana/web3.jsライブラリを使用して新しいルックアップテーブルを作成する方法は、古いレガシートランザクションと似ていますが、いくつかの違いがあります。

2 createLookupTable

@solana/web3.jsライブラリを使用すると、新しいルックアップテーブルを作成するために必要な指示を構築し、そのアドレスを決定するためのcreateLookupTable関数を使用できます。

関数

https://solana-labs.github.io/solana-web3.js/classes/AddressLookupTableProgram.html#createLookupTable

パラメータ

https://solana-labs.github.io/solana-web3.js/types/CreateLookupTableParams.html

+α 注意事項

アドレスルックアップテーブルは、v0トランザクションまたはレガシートランザクションいずれかで作成することができます。

しかし、Solanaランタイムは、v0バージョン管理トランザクションを使用している間にのみ、ルックアップテーブル内の追加アドレスを取得および処理することができます。

補足
ここは少しややこしいと思いました。
作るだけならレガシーでも作れるものの、追加アドレスの取得や処理はv0バージョンでしかできないようです。

4 ルックアップテーブルにアドレスを追加する

1 extendLookupTable

ルックアップテーブルにアドレスを追加することは「拡張」として知られています。

@solana/web3.js ライブラリを使用して、extendLookupTable メソッドを使用して新しい extend 指示を作成できます。

関数

https://solana-labs.github.io/solana-web3.js/classes/AddressLookupTableProgram.html#extendLookupTable

パラメータ

https://solana-labs.github.io/solana-web3.js/types/ExtendLookupTableParams.html

+α 注意事項(一度に追加する数の制限)

レガシートランザクションの同じメモリ制限により、アドレスルックアップテーブルを拡張するために使用されるトランザクションも、一度に追加できるアドレスの数に制限があります。

そのため、単一のトランザクションのメモリ制限内に収まるアドレス(約20)よりも多くのアドレスをテーブルに拡張する場合、複数のトランザクションを使用する必要があります。

2 実行後の利用

これらのアドレスがテーブルに挿入され、オンチェーンに保存されると、将来のトランザクションでアドレスルックアップテーブルを利用することができます。

これにより、それらの将来のトランザクションで最大256のアドレスが可能になります。

補足
「将来のトランザクションで」
というのもポイントだと思います。
そのため、次章のフェッチ別のトランザクションで行わないとできません。

5 アドレスルックアップテーブルをフェッチする

1 getAddressLookupTable

クラスタから別のアカウント(またはPDA)をリクエストするのと同様に、getAddressLookupTableメソッド完全なアドレスルックアップテーブルをフェッチできます。

https://solana-labs.github.io/solana-web3.js/classes/Connection.html#getAddressLookupTable

lookupTableAccount 変数は、ルックアップテーブルにオンチェーンで保存されているすべてのアドレスのリストを読み取るために解析できます。


6 トランザクションでアドレスルックアップテーブルを使用する方法

1 トランザクションの実行

ルックアップテーブルを作成し、必要なアドレスをオンチェーンに保存した後(ルックアップテーブルを拡張することによって)、オンチェーンのルックアップ機能を利用するためにv0トランザクションを作成できます。

古いレガシートランザクションと同様に、トランザクションがオンチェーンで実行するすべての指示を作成できます。

これらの指示の配列v0トランザクションで使用されるメッセージに提供できます。

+α 注意事項

v0トランザクション内で使用される指示は、過去に指示を作成するために使用された同じ方法と関数を使用して構築することができます。

アドレスルックアップテーブルを使用する場合に指示に変更を加える必要はありません。

補足
第4章で使用したものをそのまま使うことができます。


サポートをしていただけたらすごく嬉しいです😄 いただけたサポートを励みに、これからもコツコツ頑張っていきます😊