StarknetByExample icon indicating copy to clipboard operation
StarknetByExample copied to clipboard

feat: use starknet_keccak

Open enitrat opened this issue 1 year ago • 3 comments

The following code snippet can be used to calculate the starknet_keccak of a u256 word. The input must have 32 characters. If the input is shoter, it needs to be most significant byte aligned first.

fn starknet_keccak(word: u256) -> felt252 {
    let mut input: Array::<u256> = Default::default();
    input.append(word);
    let res_le = keccak_u256s_be_inputs(input.span());

    let low: felt252 = integer::u128_byte_reverse(res_le.high).into();
    let high: felt252 = (integer::u128_byte_reverse(res_le.low) & 0x3ffffffffffffffffffffffffffffff)
        .into();

    high * 0x100000000000000000000000000000000 + low
}

fn test_starknet_keccak() {
    let res = keccak::starknet_keccak('01234567890123456789012345678901');
    assert_eq(res, 0x2f6f0bb62127422171f029ef8588af3a45d58989134675112c2acc78dd16078, res)
}

enitrat avatar Jun 13 '23 08:06 enitrat

Now possible with https://github.com/starkware-libs/cairo/commit/0275aa023ff81b490c58f6e1fd249a80663e35d8

enitrat avatar Jun 26 '23 16:06 enitrat

blocked: not included in 2.0.x release

enitrat avatar Jul 12 '23 19:07 enitrat

cairo_keccak is now available in 2.1.0 release.

julio4 avatar Aug 07 '23 10:08 julio4