| 438 | } |
| 439 | |
| 440 | fn from_bytes(bytes: &[u8]) -> value::Result<Self> { |
| 441 | let flags = bytes[0]; |
| 442 | match flags { |
| 443 | // StorageLeaf |
| 444 | 0 => { |
| 445 | let prefix_length = bytes[1] as usize; |
| 446 | let packed_prefix_length = prefix_length.div_ceil(2); |
| 447 | let mut prefix = RawPath::unpack(&bytes[2..2 + packed_prefix_length]); |
| 448 | prefix.truncate(prefix_length); |
| 449 | |
| 450 | let offset = 2 + packed_prefix_length; |
| 451 | |
| 452 | let value_header = bytes[offset]; |
| 453 | let value_rlp = if value_header <= 128 { |
| 454 | let mut value_rlp = ArrayVec::new(); |
| 455 | value_rlp.push(value_header); |
| 456 | value_rlp |
| 457 | } else { |
| 458 | let value_len = value_header as usize - 128; |
| 459 | ArrayVec::from_iter(bytes[offset..offset + value_len + 1].iter().copied()) |
| 460 | }; |
| 461 | |
| 462 | Ok(Self::new(prefix.try_into().unwrap(), NodeKind::StorageLeaf { value_rlp })) |
| 463 | } |
| 464 | // AccountLeaf |
| 465 | flags if flags & 1 == 1 => { |
| 466 | let has_storage = flags & 0b10000000 != 0; |
| 467 | let has_code = flags & 0b01000000 != 0; |
| 468 | let prefix_length = bytes[1] as usize; |
| 469 | let packed_prefix_length = prefix_length.div_ceil(2); |
| 470 | let mut prefix = RawPath::unpack(&bytes[2..2 + packed_prefix_length]); |
| 471 | prefix.truncate(prefix_length); |
| 472 | |
| 473 | let mut offset = 2 + packed_prefix_length; |
| 474 | |
| 475 | let nonce_header = bytes[offset]; |
| 476 | let (nonce_rlp, nonce_len) = if nonce_header <= 128 { |
| 477 | let mut nonce_rlp = ArrayVec::new(); |
| 478 | nonce_rlp.push(nonce_header); |
| 479 | (nonce_rlp, 1) |
| 480 | } else { |
| 481 | let nonce_len = nonce_header as usize - 128; |
| 482 | let nonce_rlp = |
| 483 | ArrayVec::from_iter(bytes[offset..offset + nonce_len + 1].iter().copied()); |
| 484 | (nonce_rlp, nonce_len + 1) |
| 485 | }; |
| 486 | offset += nonce_len; |
| 487 | |
| 488 | let balance_header = bytes[offset]; |
| 489 | let (balance_rlp, balance_len) = if balance_header <= 128 { |
| 490 | let mut balance_rlp = ArrayVec::new(); |
| 491 | balance_rlp.push(balance_header); |
| 492 | (balance_rlp, 1) |
| 493 | } else { |
| 494 | let balance_len = balance_header as usize - 128; |
| 495 | let balance_rlp = ArrayVec::from_iter( |
| 496 | bytes[offset..offset + balance_len + 1].iter().copied(), |
| 497 | ); |