Crates.io | spl-discriminator |
lib.rs | spl-discriminator |
version | 0.4.0 |
source | src |
created_at | 2023-06-26 19:50:34.314985 |
updated_at | 2024-11-01 11:43:09.993622 |
description | Solana Program Library 8-Byte Discriminator Management |
homepage | |
repository | https://github.com/solana-labs/solana-program-library |
max_upload_size | |
id | 900593 |
size | 11,764 |
This library allows for easy management of 8-byte discriminators.
ArrayDiscriminator
StructWith this crate, you can leverage the ArrayDiscriminator
type to manage an 8-byte discriminator for generic purposes.
let my_discriminator = ArrayDiscriminator::new([8, 5, 1, 56, 10, 53, 9, 198]);
The new(..)
function is also a constant function, so you can use ArrayDiscriminator
in constants as well.
const MY_DISCRIMINATOR: ArrayDiscriminator = ArrayDiscriminator::new([8, 5, 1, 56, 10, 53, 9, 198]);
The ArrayDiscriminator
struct also offers another constant function as_slice(&self)
, so you can use as_slice()
in constants as well.
const MY_DISCRIMINATOR_SLICE: &[u8] = MY_DISCRIMINATOR.as_slice();
SplDiscriminate
TraitA trait, SplDiscriminate
is also available, which will give you the ArrayDiscriminator
constant type and also a slice representation of the discriminator. This can be particularly handy with match statements.
/// A trait for managing 8-byte discriminators in a slab of bytes
pub trait SplDiscriminate {
/// The 8-byte discriminator as a `[u8; 8]`
const SPL_DISCRIMINATOR: ArrayDiscriminator;
/// The 8-byte discriminator as a slice (`&[u8]`)
const SPL_DISCRIMINATOR_SLICE: &'static [u8] = Self::SPL_DISCRIMINATOR.as_slice();
}
SplDiscriminate
Derive MacroThe SplDiscriminate
derive macro is a particularly useful tool for those who wish to derive their 8-byte discriminator from a particular string literal. Typically, you would have to run a hash function against the string literal, then copy the first 8 bytes, and then hard-code those bytes into a statement like the one above.
Instead, you can simply annotate a struct or enum with SplDiscriminate
and provide a hash input via the discriminator_hash_input
attribute, and the macro will automatically derive the 8-byte discriminator for you!
#[derive(SplDiscriminate)] // Implements `SplDiscriminate` for your struct/enum using your declared string literal hash_input
#[discriminator_hash_input("some_discriminator_hash_input")]
pub struct MyInstruction1 {
arg1: String,
arg2: u8,
}
let my_discriminator: ArrayDiscriminator = MyInstruction1::SPL_DISCRIMINATOR;
let my_discriminator_slice: &[u8] = MyInstruction1::SPL_DISCRIMINATOR_SLICE;
Note: the 8-byte discriminator derived using the macro is always the first 8 bytes of the resulting hashed bytes.