stoffel-vm 0.1.0

Register-based virtual machine runtime and MPC execution engine for Stoffel programs
Documentation
use blake3::Hasher;

const PROTOCOL_INSTANCE_ID_DOMAIN: &[u8] = b"stoffel-mpc-protocol-instance-v1";

pub(crate) fn derive_protocol_instance_id_u32(protocol: &[u8], instance_id: u64) -> u32 {
    let mut hasher = Hasher::new();
    hasher.update(PROTOCOL_INSTANCE_ID_DOMAIN);
    hasher.update(protocol);
    hasher.update(&instance_id.to_le_bytes());
    let hash = hasher.finalize();
    let mut bytes = [0u8; 4];
    bytes.copy_from_slice(&hash.as_bytes()[..4]);
    u32::from_le_bytes(bytes)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn protocol_instance_ids_are_stable_for_full_width_vm_instance_ids() {
        let instance_id = u64::MAX - 17;

        assert_eq!(
            derive_protocol_instance_id_u32(b"honeybadger", instance_id),
            derive_protocol_instance_id_u32(b"honeybadger", instance_id)
        );
    }

    #[test]
    fn protocol_instance_ids_are_domain_separated() {
        let instance_id = u64::from(u32::MAX) + 1;

        assert_ne!(
            derive_protocol_instance_id_u32(b"honeybadger", instance_id),
            derive_protocol_instance_id_u32(b"avss", instance_id)
        );
    }
}