3

How are the first 8 bytes (discriminator) on instruction data determined for an anchor instruciton? If I have the idl what's the best way to use instruction data to find which instruction in the IDL it is?

I'm seeing random bytes like 51, 179, 232, 242

1 Answer 1

9

You have to get the first 8 bytes of the sha256 hash of the global:[instruction_name].

From the anchor source

// Namespace for calculating instruction sighash signatures for any instruction
// not affecting program state.
pub const SIGHASH_GLOBAL_NAMESPACE: &str = "global";

// We don't technically use sighash, because the input arguments aren't given.
// Rust doesn't have method overloading so no need to use the arguments.
// However, we do namespace methods in the preeimage so that we can use
// different traits with the same method name.
pub fn sighash(namespace: &str, name: &str) -> [u8; 8] {
    let preimage = format!("{}:{}", namespace, name);

    let mut sighash = [0u8; 8];
    sighash.copy_from_slice(&crate::hash::hash(preimage.as_bytes()).to_bytes()[..8]);
    sighash
}

The same logic applies to the 8 byte discriminator for accounts, you take the first 8 bytes of the sha256 hash of account:[AccountStructName]

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.