1#[cfg(feature = "rlp")]
2use rlp::{Encodable, Decodable, RlpStream, DecoderError, UntrustedRlp};
3
4#[derive(Eq, PartialEq, Debug, Copy, Clone, Hash)]
6pub struct B256(usize, [u8; 32]);
7
8impl B256 {
9 pub fn new(value: &[u8]) -> Self {
10 assert!(value.len() <= 32);
11 let mut ret = [0u8; 32];
12 for i in 0..value.len() {
13 ret[i] = value[i];
14 }
15 B256(value.len(), ret)
16 }
17}
18
19impl Default for B256 {
20 fn default() -> B256 {
21 B256(0, [0u8; 32])
22 }
23}
24
25#[cfg(feature = "rlp")]
26impl Encodable for B256 {
27 fn rlp_append(&self, s: &mut RlpStream) {
28 s.encoder().encode_value(&self.1[0..self.0])
29 }
30}
31
32#[cfg(feature = "rlp")]
33impl Decodable for B256 {
34 fn decode(rlp: &UntrustedRlp) -> Result<Self, DecoderError> {
35 rlp.decoder().decode_value(|bytes| {
36 if bytes.len() > 32 {
37 Err(DecoderError::Custom("More than 32 bytes"))
38 } else {
39 let mut ret = B256(0, [0u8; 32]);
40 ret.0 = bytes.len();
41 for i in 0..bytes.len() {
42 ret.1[i] = bytes[i];
43 }
44 Ok(ret)
45 }
46 })
47 }
48}