Skip to content

Commit 06d9b9c

Browse files
sbilligcburgdorf
authored andcommitted
core: keccak uses AsBytes::as_bytes
1 parent 109d954 commit 06d9b9c

3 files changed

Lines changed: 57 additions & 5 deletions

File tree

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
struct NotBytes {}
2+
13
fn f() -> u256 {
2-
let x: u256 = 1
4+
let x: NotBytes = NotBytes {}
35
core::keccak(x)
46
}

crates/uitest/fixtures/ty_check/keccak_requires_as_bytes.snap

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ expression: diags
55
input_file: fixtures/ty_check/keccak_requires_as_bytes.fe
66
---
77
error[6-0003]: trait bound is not satisfied
8-
┌─ keccak_requires_as_bytes.fe:3:5
8+
┌─ keccak_requires_as_bytes.fe:5:5
99
10-
3core::keccak(x)
11-
^^^^^^^^^^^^ `u256` doesn't implement `AsBytes`
10+
5core::keccak(x)
11+
^^^^^^^^^^^^ `NotBytes` doesn't implement `AsBytes`

ingots/core/src/bytes.fe

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,57 @@ impl<const LEN: usize> AsBytes for String<LEN> {
1515
const fn as_bytes(self) -> [u8; Self::N] { intrinsic::__as_bytes(self) }
1616
}
1717

18+
impl AsBytes for u256 {
19+
const N: usize = 32
20+
const fn as_bytes(self) -> [u8; Self::N] { intrinsic::__as_bytes(self) }
21+
}
22+
23+
impl<T0, T1> AsBytes for (T0, T1)
24+
where T0: AsBytes,
25+
T1: AsBytes
26+
{
27+
const N: usize = T0::N + T1::N
28+
const fn as_bytes(self) -> [u8; Self::N] {
29+
let a: [u8; T0::N] = self.0.as_bytes()
30+
let b: [u8; T1::N] = self.1.as_bytes()
31+
let out: [u8; Self::N] = intrinsic::__as_bytes((a, b))
32+
out
33+
}
34+
}
35+
36+
impl<T0, T1, T2> AsBytes for (T0, T1, T2)
37+
where T0: AsBytes,
38+
T1: AsBytes,
39+
T2: AsBytes
40+
{
41+
const N: usize = T0::N + T1::N + T2::N
42+
const fn as_bytes(self) -> [u8; Self::N] {
43+
let a: [u8; T0::N] = self.0.as_bytes()
44+
let b: [u8; T1::N] = self.1.as_bytes()
45+
let c: [u8; T2::N] = self.2.as_bytes()
46+
let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c))
47+
out
48+
}
49+
}
50+
51+
impl<T0, T1, T2, T3> AsBytes for (T0, T1, T2, T3)
52+
where T0: AsBytes,
53+
T1: AsBytes,
54+
T2: AsBytes,
55+
T3: AsBytes
56+
{
57+
const N: usize = T0::N + T1::N + T2::N + T3::N
58+
const fn as_bytes(self) -> [u8; Self::N] {
59+
let a: [u8; T0::N] = self.0.as_bytes()
60+
let b: [u8; T1::N] = self.1.as_bytes()
61+
let c: [u8; T2::N] = self.2.as_bytes()
62+
let d: [u8; T3::N] = self.3.as_bytes()
63+
let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d))
64+
out
65+
}
66+
}
67+
1868
pub const fn keccak<T: AsBytes>(x: T) -> u256 {
19-
let bytes: [u8; T::N] = intrinsic::__as_bytes(x)
69+
let bytes: [u8; T::N] = x.as_bytes()
2070
intrinsic::__keccak256(bytes)
2171
}

0 commit comments

Comments
 (0)