Address Lookup Tables
Address Lookup Tables
Address Lookup Tables, commonly referred to as "lookup tables" or "ALTs" for short, allow developers to create a collection of related addresses to efficiently load more addresses in a single transaction.
Since each transaction on the PUT blockchain requires a listing of every address that is interacted with as part of the transaction, this listing would be effectively be capped at 32 address per transaction.
With the help of Address Lookup Tables, a transaction would be now be able to raise that limit to 256 addresses per transaction.
Compressing on chain addresses
After all the desired address have been stored on chain in an Address Lookup Table, each address can be referenced inside a transaction by its 1-byte index within the table (instead of their full 32-byte address).
This lookup method effectively "compresses" a 32-byte address into a 1-byte index value.
This "compression" enables storing up to 256 address in a single lookup table for use inside any given transaction.
Versioned Transactions
To utilize an Address Lookup Table inside a transaction, developers must use v0 transactions that were introduced with the new Versioned Transaction format.
How to create an address lookup table
Creating a new lookup table with the @put/web3.js library is similar to the older legacy transactions, but with some differences.
Using the @put/web3.js library, you can use the createLookupTable function to construct the instruction needed to create a new lookup table, as well as determine its address:
NOTE: Address lookup tables can be created with either a v0
transaction or a legacy
transaction. But the Solana runtime can only retrieve and handle the additional addresses within a lookup table while using v0 Versioned Transactions.
Add addresses to a lookup table
Adding addresses to a lookup table is known as "extending". Using the the @put/web3.js library, you can create a new extend instruction using the extendLookupTable method:
NOTE: Due to the same memory limits of legacy
transactions, any transaction used to extend an Address Lookup Table is also limited in how many addresses can be added at a time. Because of this, you will need to use multiple transactions to extend any table with more addresses (~20) that can fit withing a single transaction's memory limits.
Once these address have been inserted into the table, and stored on chain, you will be able to utilize the Address Lookup Table in future transactions. Enabling up to 256 address in those future transactions.
Fetch an Address Lookup Table
Similar to requesting another account (or PDA) from the cluster, you can fetch a complete Address Lookup Table with the getAddressLookupTable method:
Our lookupTableAccount variable will now be a AddressLookupTableAccount object which we can parse to read the listing of all the addresses stored on chain in the lookup table:
How to use an address lookup table in a transaction
After you have created your lookup table, and stored your needed address on chain (via extending the lookup table), you can create a v0 transaction to utilize the on chain lookup capabilities.
Just like older legacy transactions, you can create all the instructions your transaction will execute on chain. You can then provide an array of these instructions to the Message used in the `v0 transaction.
NOTE: When sending a VersionedTransaction
to the cluster, it must be signed BEFORE calling the sendAndConfirmTransaction
method. If you pass an array of Signer
(like with legacy
transactions) the method will trigger an error!
More Resources
Read the proposal for Address Lookup Tables and Versioned transactions
Example Rust program using Address Lookup Tables
Last updated