Search code examples
rustsubstrate

How to achieve blake2AsHex functionality from Polkadot.js in Substrate?


I want to use the blake2AsHex kind of function in Rust. This function exists in javascript but I am looking for a corresponding function in rust. So far, using the primitives of Substrate which are:

pub fn blake2_256(data: &[u8]) -> [u8; 32]
// Do a Blake2 256-bit hash and return result.

I am getting a different value.

When I execute this in console:

util_crypto.blake2AsHex("0x0000000000000000000000000000000000000000000000000000000000000001")

I get the desired value: 0x33e423980c9b37d048bd5fadbd4a2aeb95146922045405accc2f468d0ef96988. However, when I execute this rust code:

let res = hex::encode(&blake2_256("0x0000000000000000000000000000000000000000000000000000000000000001".as_bytes()));
println!("File Hash encoding: {:?}", res);

I get a different value:

47016246ca22488cf19f5e2e274124494d272c69150c3db5f091c9306b6223fc

Hence, how can I implement blake2AsHex in Rust?


Solution

  • Again you have an issue with data types here.

    "0x0000000000000000000000000000000000000000000000000000000000000001".as_bytes()
    

    is converting a big string to bytes, not the hexadecimal representation.

    You need to correctly create the bytearray that you want to represent, and then it should work.

    You are already using hex::encode for bytes to hex string... you should be using hex::decode for hex string to bytes:

    https://docs.rs/hex/0.3.1/hex/fn.decode.html

    Decodes a hex string into raw bytes.