felt252
value.
Writing to a storage slot has a cost, so we want to use as few storage slots as possible.
In Cairo, every type is derived from the felt252
type, which uses 252 bits to store a value.
This design is quite simple, but it does have a drawback: it is not storage efficient. For example, if we want to store a u8
value, we need to use an entire slot, even though we only need 8 bits.
felt252
value. This is done by using the bits of the felt252
value to store multiple values.
For example, if we want to store two u8
values, we can use the first 8 bits of the felt252
value to store the first u8
value, and the last 8 bits to store the second u8
value. This way, we can store two u8
values in a single felt252
value.
Cairo provides a built-in store using packing that you can use with the StorePacking
trait.
T
by first packing it into the type PackedT
with the pack
function, and then storing the PackedT
value with it’s Store
implementation. When reading the value, we first retrieve the PackedT
value, and then unpack it into the type T
using the unpack
function.
Here’s an example of storing a Time
struct with two u8
values using the StorePacking
trait: