Account Space
Reference guide for calculating account data size (bytes) requirements by Rust type
This reference tells you how much space you should allocate for an account.
This only applies to accounts that don't use zero-copy
. zero-copy
uses
repr(C)
with a pointer cast, so there the C
layout applies.
In addition to the space for the account data, you have to add 8
to the
space
constraint for Anchor's internal discriminator (see the example).
Type chart
Types | Space in bytes | Details/Example |
---|---|---|
bool | 1 | would only require 1 bit but still uses 1 byte |
u8/i8 | 1 | |
u16/i16 | 2 | |
u32/i32 | 4 | |
u64/i64 | 8 | |
u128/i128 | 16 | |
[T;amount] | space(T) * amount | e.g. space([u16;32]) = 2 * 32 = 64 |
Pubkey | 32 | |
Vec<T> | 4 + (space(T) * amount) | Account size is fixed so account should be initialized with sufficient space from the beginning |
String | 4 + length of string in bytes | Account size is fixed so account should be initialized with sufficient space from the beginning |
Option<T> | 1 + (space(T)) | |
Enum | 1 + Largest Variant Size | e.g. Enum { A, B { val: u8 }, C { val: u16 } } -> 1 + space(u16) = 3 |
f32 | 4 | serialization will fail for NaN |
f64 | 8 | serialization will fail for NaN |
Example
The InitSpace macro
Sometimes it can be difficult to calculate the initial space of an account. This
macro will add an INIT_SPACE
constant to the structure. It is not necessary
for the structure to contain the #[account]
macro to generate the constant.
Here's an example:
A few important things to know:
- Don't forget the discriminator when defining
space
- The
max_len
length represents the length of the structure, not the total length. (ie: themax_len
of a Vec<u32> will bemax_len
* 4)