Zero Copy
Learn how to use Anchor's zero-copy deserialization feature to handle large account data in Solana programs.
Usage
Zero copy is a deserialization feature that allows programs to read account data directly from memory without copying it. This is particularly useful when working with large accounts.
To use zero-copy add the bytemuck
crate to your dependencies. Add the
min_const_generics
feature to allow working with arrays of any size in your
zero-copy types.
Define a Zero Copy Account
To define an account type that uses zero-copy, annotate the struct with
#[account(zero_copy)]
.
The #[account(zero_copy)]
attribute automatically implements several traits
required for zero-copy deserialization:
Use AccountLoader for Zero Copy Accounts
To deserialize a zero-copy account, use
AccountLoader<'info, T>
,
where T
is the zero-copy account type defined with the #[account(zero_copy)]
attribute.
For example:
Initialize a Zero Copy Account
The init
constraint can be used with the AccountLoader
type to create a
zero-copy account.
The init
constraint is limited to allocating a maximum of 10240 bytes due to
CPI limitations. Under the hood, the init
constraint makes a CPI call to the
SystemProgram to create the account.
When initializing a zero-copy account for the first time, use
load_init
to get a mutable reference to the account data. The load_init
method also sets
the account discriminator.
For accounts that require more than 10240 bytes, use the
zero
constraint instead of init
. The zero
constraint verifies the account has not
been initialized by checking that its discriminator has not been set.
With the zero
constraint, you'll need to first create the account in a
separate instruction by directly calling the System Program. This allows you to
create accounts up to Solana's maximum account size of 10MB (10_485_760 bytes),
bypassing the CPI limitation.
Just as before, use load_init
to get a mutable reference to the account data
and set the account discriminator. Since 8 bytes are reserved for the account
discriminator, the maximum data size is 10_485_752 bytes (10MB - 8 bytes).
Update a Zero Copy Account
Use
load_mut
when you need mutable access to update an existing zero-copy account:
Read a Zero Copy Account
Use
load
to only read the account data.
Examples
The examples below demonstrate two approaches for initializing zero-copy accounts in Anchor:
- Using the
init
constraint to initialize the account in a single instruction - Using the
zero
constraint to initialize an account with data greater than 10240 bytes
Zero Copy
Initialize Large Account
When initializing an account that requires more than 10,240 bytes of space, you must split the initialization into two steps:
- Create the account in a separate instruction invoking the System Program
- Initialize the account data in your program instruction
Note that the maximum Solana account size is 10MB (10_485_760 bytes), 8 bytes are reserved for the account discriminator.