Skip to main content

StorageKey

Trait StorageKey 

Source
pub trait StorageKey: OnlyPrimitives {
    // Required method
    fn as_storage_bytes(&self) -> impl AsRef<[u8]>;

    // Provided method
    fn mapping_slot(&self, slot: U256) -> U256 { ... }
}
Expand description

Trait for types that can be used as storage mapping keys.

Keys are hashed using keccak256 along with the mapping’s base slot to determine the final storage location. This trait provides the byte representation used in that hash.

§Sealed to single-word primitives

Only types that implement sealed::OnlyPrimitives (single-word types ≤32 bytes) can be mapping keys. This prevents arrays, structs, and dynamic types from being used as keys — matching Solidity’s restriction to value types.

§Encoding

Mapping slots are computed as keccak256(bytes32(key) | bytes32(slot)), where the key’s raw bytes are left-padded to 32 bytes and the slot is appended in big-endian.

This differs from Solidity’s keccak256(abi.encode(key, slot)), where signed integers are sign-extended and bytesN (N < 32) are right-padded. Per-type equivalence:

  • Unsigned integers, Address, bytes32: identical — both zero-left-pad.
  • Signed integers: diverges — Solidity sign-extends negative values to 32 bytes, we zero-left-pad the two’s complement representation.
  • bytesN (N < 32): diverges — Solidity right-pads, we left-pad.

This is not a soundness issue — there are no slot collision risks — but off-chain tools that reconstruct storage slots using Solidity’s abi.encode rules will compute different locations for the divergent types. View functions should be used instead.

Required Methods§

Source

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Returns key bytes for storage slot computation.

Provided Methods§

Source

fn mapping_slot(&self, slot: U256) -> U256

Compute storage slot for a mapping with this key.

Left-pads the key to 32 bytes, concatenates with the slot, and hashes.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl StorageKey for bool

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for i8

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for i16

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for i32

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for i64

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for i128

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for u8

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for u16

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for u32

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for u64

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for u128

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for Address

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<1usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<2usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<3usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<4usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<5usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<6usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<7usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<8usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<9usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<10usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<11usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<12usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<13usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<14usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<15usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<16usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<17usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<18usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<19usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<20usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<21usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<22usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<23usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<24usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<25usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<26usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<27usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<28usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<29usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<30usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<31usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for FixedBytes<32usize>

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for I8

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for I16

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for I32

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for I64

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for I128

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for I256

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for U8

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for U16

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for U32

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for U64

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for U128

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Source§

impl StorageKey for U256

Source§

fn as_storage_bytes(&self) -> impl AsRef<[u8]>

Implementors§